Visualisasikan perkalian panjang dengan seni ASCII


12

Tantangan

Tulis program yang mengambil dua bilangan bulat dari input standar, dipisahkan dengan koma, dan kemudian cetak visualisasi perkalian panjang dari dua bilangan bulat tersebut ke output standar.

Misalnya:

Memasukkan

14, 11

Output program

     14
    x11
   _____
     14
    14
  ______
    154

Memasukkan

-7, 20

Output program

     -7
    x20
   _____
     00
    14
   _____
   -140

Asumsikan selalu benar input dan angka dalam kisaran [-999, 999]

Kriteria menang

Kode terpendek menang!


Jawaban:


3

Perl, 108 karakter

Solusi terbaik untuk berkembang biak 108 char, menggabungkan beberapa ide dari Orabig.

($x,$y)=<>=~/[-\d]+/g;printf"%7s
",$_ for$x,x.$y,"-"x7,(map{abs($x*$_).$"x$i++}reverse$y=~/\d/g),"-"x7,$x*$y

Sebelumnya 139 solusi char

sub P{sprintf"%*d",@_}
($x,$y)=<>=~/[^,]+/g;$,=$/;
print P(7,$x),"  x".P(4,$y),"-"x7,(map{P 7-$i++,abs$_*$x}reverse$y=~/\d/g),
"-"x7,P 7,$x*$y

/ Aku membungkuk hormat ... Aku tidak melihat kemungkinan untuk memasukkan peta di bagian printf. Dan $y=~/\d/gtriknya cerdas
Orabîg

5

Mathematica 213 217 197 193 186 184 193 184 177

Kode

a_~g~b_ := 
With[{e = IntegerDigits@b}, Column[Flatten@{a, UnderBar["x " <> IntegerString[b]], 
Table[Row @@ {PadRight[{a Reverse[e][[i]]}, i, " "]}, {i, Length@e}], OverBar[a b]}, 
Alignment -> Right]]

Pemakaian

g[845, 921]

berkembang biak


Tentunya IntegerString[921]maksud Anda IntegerString[b]?
David Zhang

Ya, tangkapan bagus!
DavidC

Saya pikir spek memungkinkan untuk menghilangkan ruang dalam "x ".
ɐɔıʇǝɥʇu

Anda benar. Saya memutuskan untuk meninggalkannya karena terlihat lebih baik (dan saya tidak akan memiliki kode terpendek pula).
DavidC

1

Python, 174 170:

a,b=input();r,s=str(a),str(b);h=len(r+s)*'-';print'\n'.join(["%9s\n%9s\n%9s"%(r,'x'+s,h)]+["%%%ii"%(9-i)%(int(d)%10*a)for i,d in enumerate(s[::-1])]+["%9s\n%9i"%(h,a*b)])

Penggunaan: persis seperti yang diminta, jalankan dan masukkan nilai dalam input standar.

Untuk melihat menjalankan: http://ideone.com/S8xNb

Keluaran:

     1234
    x5678
 --------
     9872
    8638
   7404
  6170
 --------
  7006652

Berkat fabiocerqueira dan beary605 dan David Carraher


Anda dapat menghapus 4 karakter spasi putih: print '\n'-> print'\n', 10*a) for i,d in enumerate-> 10*a)for i,d in enumerate, "%9s\n%9i" % (h,a*b)->"%9s\n%9i"%(h,a*b)
beary605

1

Python, 145, jawaban lain dengan output yang sedikit berbeda.

Kode

a,b=input();h=6*'-';print'\n'.join(["%6i\nx%5i\n%s"%(a,b,h)]+["%%%ii"%(6-i)%(int(d)%10*a)for i,d in enumerate(str(b)[::-1])]+["%s\n%6i"%(h,a*b)])

Pemakaian

seperti yang diminta

Keluaran

   999
x  999
------
  8991
 8991
8991
------
998001

Untuk melihat menjalankan: http://ideone.com/mdR18


1

Perl , 157 151 150 144 141 133 karakter:

($x,$y)=<>=~/[-\d]+/g;map{$z=~s/z/ z/g;$z=(abs$x*$_)."z$z"}split//,abs$y;map{printf"%6s
",$_}$x,"x$y",$b="-"x6,(split/z/,$z),$b,$x*$y

Penggunaan:

>echo "-123, 456" | perl mult.pl
   -123
   x456
-------
    738
   615
  492
-------
 -56088

Punya ide pagi ini: menggunakan printf membuat saya meningkatkan solusi saya dengan 8 karakter :)
Orabîg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.