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!


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

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


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


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


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

Hatte heute morgen eine Idee: Mit printf kann ich meine Lösung um 8 Zeichen verbessern :)
Orabîg
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.