Visualisieren Sie lange Multiplikationen mit ASCII-Kunst

12

Die Herausforderung

Schreiben Sie ein Programm, das zwei durch Komma getrennte Ganzzahlen aus der Standardeingabe entnimmt und anschließend eine Visualisierung der langen Multiplikation dieser beiden Ganzzahlen mit der Standardausgabe ausgibt.

Z.B:

Eingang

14, 11

Programmausgabe

     14
    x11
   _____
     14
    14
  ______
    154

Eingang

-7, 20

Programmausgabe

     -7
    x20
   _____
     00
    14
   _____
   -140

Nehmen Sie immer korrekte Eingaben und Zahlen im Bereich von [-999, 999] an.

Gewinnkriterien

Kürzester Code gewinnt!

Averroes
quelle
Aus Gründen der Konsistenz mit codegolf.stackexchange.com/questions/1624/… optimiert
Peter Taylor

Antworten:

3

Perl, 108 Zeichen

Best of Breed 108-Zeichen-Lösung, die einige Ideen von Orabig enthält.

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

Frühere 139-Zeichen-Lösung

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
Mob
quelle
Ich verneige mich vor ... Ich habe nicht die Möglichkeit gesehen, die Karte in den PrintF-Teil aufzunehmen. Und der $y=~/\d/gTrick war klug
Orabîg
5

Mathematica 213 217 197 193 186 184 193 184 177

Code

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]]

Verwendung

g[845, 921]

multiplizieren

DavidC
quelle
Sicherlich IntegerString[921]meinst du IntegerString[b]?
David Zhang
Ja, guter Fang!
DavidC
Ich denke, die Spezifikation ermöglicht die Entfernung des Raumes in "x ".
21.
Du hast recht. Ich habe beschlossen, es zu belassen, weil es besser aussah (und ich würde sowieso nicht den kürzesten Code haben).
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)])

Verwendung: Führen Sie genau wie gewünscht die Werte in der Standardeingabe aus und geben Sie sie ein.

Laufen sehen: http://ideone.com/S8xNb

Ausgabe:

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

Danke an fabiocerqueira und beary605 und David Carraher

Olivencoder
quelle
Sie können 4 Leerzeichen entfernen: 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, eine andere Antwort mit etwas anderer Ausgabe.

Code

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)])

Verwendung

wie gewünscht

Ausgabe

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

Um das Laufen zu sehen: http://ideone.com/mdR18

Olivencoder
quelle
1

Perl , 157 151 150 144 141 133 Zeichen:

($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

Verwendung :

>echo "-123, 456" | perl mult.pl
   -123
   x456
-------
    738
   615
  492
-------
 -56088
Orabîg
quelle
Hatte heute morgen eine Idee: Mit printf kann ich meine Lösung um 8 Zeichen verbessern :)
Orabîg