Visualizza una lunga moltiplicazione con l'arte ASCII


12

La sfida

Scrivi un programma che prende due numeri interi dall'input standard, separati da una virgola, e quindi stampa una visualizzazione della lunga moltiplicazione di quei due numeri interi nell'output standard.

Per esempio:

Ingresso

14, 11

Uscita del programma

     14
    x11
   _____
     14
    14
  ______
    154

Ingresso

-7, 20

Uscita del programma

     -7
    x20
   _____
     00
    14
   _____
   -140

Assumi sempre input e numeri corretti nell'intervallo [-999, 999]

Criteri vincenti

Il codice più corto vince!


Risposte:


3

Perl, 108 caratteri

La migliore soluzione di 108 caratteri, che incorpora alcune idee di Orabig.

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

Prima soluzione di 139 caratteri

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 inchino rispetto ... Non ho visto la possibilità di includere la mappa nella parte stampata. E il $y=~/\d/gtrucco era intelligente
Orabîg,

5

Mathematica 213 217 197 193 186 184 193 184 177

Codice

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]

moltiplicare


Sicuramente IntegerString[921]intendi IntegerString[b]?
David Zhang,

Sì, buona cattura!
DavidC

Penso che le specifiche consentano la rimozione dello spazio in "x ".
Decıʇǝɥʇuʎs,

Hai ragione. Ho deciso di lasciarlo perché sembrava migliore (e comunque non avrei avuto il codice più 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)])

Utilizzo: esattamente come richiesto, eseguire e inserire i valori nell'input standard.

Per vedere in esecuzione: http://ideone.com/S8xNb

Produzione:

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

Grazie a fabiocerqueira e beary605 e David Carraher


Puoi rimuovere 4 caratteri di spazi bianchi: 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, un'altra risposta con un output leggermente diverso.

Codice

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

proprio come richiesto

Produzione

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

Per vedere in esecuzione: http://ideone.com/mdR18


1

Perl , 157 151 150 144 141 133 caratteri:

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

Utilizzo:

>echo "-123, 456" | perl mult.pl
   -123
   x456
-------
    738
   615
  492
-------
 -56088

Ho avuto un'idea questa mattina: usare printf mi ha fatto migliorare la mia soluzione di 8 caratteri :)
Orabîg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.