Visualice multiplicaciones largas con arte ASCII

12

El reto

Escriba un programa que tome dos enteros de la entrada estándar, separados por una coma, y ​​luego imprima una visualización de la multiplicación larga de esos dos enteros a la salida estándar.

P.ej:

Entrada

14, 11

Salida del programa

     14
    x11
   _____
     14
    14
  ______
    154

Entrada

-7, 20

Salida del programa

     -7
    x20
   _____
     00
    14
   _____
   -140

Suponga siempre entradas y números correctos en el rango [-999, 999]

Criterios ganadores

¡El código más corto gana!

Averroes
fuente
Ajustado para mantener la
Peter Taylor

Respuestas:

3

Perl, 108 caracteres

La mejor solución de char 108, incorporando algunas ideas de Orabig.

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

Solución anterior de 139 carbonos

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
multitud
fuente
/ me inclino con respeto ... No vi la posibilidad de incluir el mapa en la parte printf. Y el $y=~/\d/gtruco fue inteligente
Orabîg el
5

Mathematica 213 217 197 193 186 184 193 184 177

Código

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

Uso

g[845, 921]

multiplicar

DavidC
fuente
¿Seguro que IntegerString[921]quieres decir IntegerString[b]?
David Zhang
Sí, buena captura!
DavidC
Creo que la especificación permite la eliminación del espacio en "x ".
Decıʇǝɥʇuʎs
Estás en lo correcto. Decidí dejarlo puesto porque se veía mejor (y de todos modos no iba a tener el código más corto).
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)])

Uso: exactamente como se solicitó, ejecute e ingrese los valores en la entrada estándar.

Para ver en ejecución: http://ideone.com/S8xNb

Salida:

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

Gracias a fabiocerqueira y beary605 y David Carraher

Olivecoder
fuente
Puede eliminar 4 caracteres de espacios en blanco: 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, otra respuesta con un resultado un poco diferente.

Código

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

Uso

tal como se solicitó

Salida

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

Para ver en ejecución: http://ideone.com/mdR18

Olivecoder
fuente
1

Perl , 157 151 150 144 141 133 caracteres:

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

Uso:

>echo "-123, 456" | perl mult.pl
   -123
   x456
-------
    738
   615
  492
-------
 -56088
Orabîg
fuente
Tuve una idea esta mañana: usar printf me hace mejorar mi solución con 8 caracteres :)
Orabîg