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!

Averroes
sumber
Tweaked untuk konsistensi dengan codegolf.stackexchange.com/questions/1624/…
Peter Taylor

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
massa
sumber
/ 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

DavidC
sumber
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

olivecoder
sumber
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

olivecoder
sumber
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
Orabîg
sumber
Punya ide pagi ini: menggunakan printf membuat saya meningkatkan solusi saya dengan 8 karakter :)
Orabîg