ASCIIアートで長い乗算を視覚化する


12

チャレンジ

標準入力からコンマで区切られた2つの整数を取得し、それら2つの整数の長い乗算の視覚化を標準出力に出力するプログラムを作成します。

例えば:

入力

14, 11

プログラム出力

     14
    x11
   _____
     14
    14
  ______
    154

入力

-7, 20

プログラム出力

     -7
    x20
   _____
     00
    14
   _____
   -140

[-999、999]の範囲の入力と数値は常に正しいと仮定します

受賞基準

最短のコードが勝ちます!


回答:


3

Perl、108文字

Orabigのアイデアを取り入れた、ベストオブブリード108文字ソリューション。

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

以前の139文字ソリューション

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 bow in respect ...私は、printf部分にマップを含める可能性がありませんでした。そして$y=~/\d/gトリックは巧妙だった
Orabîg

5

Mathematica 213217 197 193 186 184 193 184 177

コード

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

使用法

g[845, 921]

かける


確かにIntegerString[921]あなたが意味するIntegerString[b]
デビッドチャン14

はい、良いキャッチ!
DavidC 14

仕様では、のスペースの削除が許可されていると思います"x "
ɐɔıʇǝɥʇuʎs

あなたは正しいです。見栄えが良かったので、そのままにしておくことにしました(とにかく最短のコードを用意するつもりはありませんでした)。
DavidC 14

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

使用法:要求どおりに正確に実行し、標準入力で値を入力します。

実行中を確認するには:http : //ideone.com/S8xNb

出力:

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

fabiocerqueiraとbeary605およびDavid Carraherに感謝


4文字の空白を削除できます: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、少し異なる出力を持つ別の答え。

コード

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

使用法

要求どおり

出力

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

実行中を確認するには:http : //ideone.com/mdR18


1

Perl157 151 150 144 141 133文字:

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

使用法 :

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

今朝アイデアがありました:printfを使用すると、ソリューションが8文字向上します:)
Orabîg12年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.