Visualisez la multiplication longue avec l'art ASCII

12

Le défi

Écrivez un programme qui prend deux entiers de l'entrée standard, séparés par une virgule, puis imprime une visualisation de la multiplication longue de ces deux entiers sur la sortie standard.

Par exemple:

Contribution

14, 11

Sortie du programme

     14
    x11
   _____
     14
    14
  ______
    154

Contribution

-7, 20

Sortie du programme

     -7
    x20
   _____
     00
    14
   _____
   -140

Supposons toujours des entrées et des nombres corrects dans la plage [-999, 999]

Critères gagnants

Le code le plus court gagne!

Averroes
la source
Ajusté pour la cohérence avec codegolf.stackexchange.com/questions/1624/…
Peter Taylor

Réponses:

3

Perl, 108 caractères

Meilleure solution de race à 108 caractères, incorporant quelques idées d'Orabig.

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

Solution antérieure de 139 caractères

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
foule
la source
/ me salue par respect ... Je n'ai pas vu la possibilité d'inclure la carte dans la partie printf. Et l' $y=~/\d/gastuce était intelligente
Orabîg
5

Mathematica 213 217 197 193 186 184 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]]

Usage

g[845, 921]

multiplier

DavidC
la source
Sûrement par IntegerString[921]vous voulez dire IntegerString[b]?
David Zhang
Oui, bonne prise!
DavidC
Je pense que la spécification permet la suppression de l'espace "x ".
ɐɔı'uʎs
Vous avez raison. J'ai décidé de le laisser car il avait l'air mieux (et je n'allais pas avoir le code le plus court de toute façon).
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)])

Utilisation: exactement comme demandé, exécutez et saisissez les valeurs en entrée standard.

Pour voir la course: http://ideone.com/S8xNb

Production:

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

Merci à fabiocerqueira et beary605 et David Carraher

olivecoder
la source
Vous pouvez supprimer 4 caractères d'espaces: 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, une autre réponse avec une sortie un peu différente.

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

Usage

comme demandé

Production

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

Pour voir la course: http://ideone.com/mdR18

olivecoder
la source
1

Perl , 157 151 150 144 144 141 133 car:

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

Utilisation:

>echo "-123, 456" | perl mult.pl
   -123
   x456
-------
    738
   615
  492
-------
 -56088
Orabîg
la source
J'ai eu une idée ce matin: utiliser printf m'a
permis d'