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!


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

/ 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


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


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


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

J'ai eu une idée ce matin: utiliser printf m'a
permis d'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.