使用ASCII艺术显示长乘法


12

挑战

编写一个程序,该程序从标准输入中获取两个整数,并用逗号分隔,然后将这两个整数的长倍乘积打印到标准输出中。

例如:

输入值

14, 11

程序输出

     14
    x11
   _____
     14
    14
  ______
    154

输入值

-7, 20

程序输出

     -7
    x20
   _____
     00
    14
   _____
   -140

假设输入和数字始终在[-999,999]范围内正确

获奖标准

最短的代码胜出!


Answers:


3

Perl,108个字符

最佳108字符解决方案,结合了Orabig的一些想法。

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

早期的139 char解决方案

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鞠躬...我没有看到将地图包括在printf部分中的可能性。而$y=~/\d/g招很聪明
Orabîg

5

数学213 217 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]吗?
David Zhang

是的,很好!
DavidC 2014年

我认为规范允许删除中的空间"x "
ɐɔıʇǝɥʇuʎs

没错 我决定保留它,因为它看起来更好(而且我也不会拥有最短的代码)。
DavidC 2014年

1

Python,174170

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

Perl中157个 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îg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.