Hình dung phép nhân dài với nghệ thuật ASCII


12

Các thách thức

Viết chương trình lấy hai số nguyên từ đầu vào tiêu chuẩn, được phân tách bằng dấu phẩy và sau đó in một trực quan về phép nhân dài của hai số nguyên đó thành đầu ra tiêu chuẩn.

Ví dụ:

Đầu vào

14, 11

Đầu ra chương trình

     14
    x11
   _____
     14
    14
  ______
    154

Đầu vào

-7, 20

Đầu ra chương trình

     -7
    x20
   _____
     00
    14
   _____
   -140

Giả sử luôn luôn nhập đúng và số trong phạm vi [-999, 999]

Tiêu chí chiến thắng

Mã ngắn nhất sẽ thắng!


Tinh chỉnh cho sự nhất quán với codegolf.stackexchange.com/questions/1624/iêu
Peter Taylor

Câu trả lời:


3

Perl, 108 ký tự

Giải pháp tốt nhất của giống 108 char, kết hợp một số ý tưởng từ Orabig.

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

Giải pháp 139 char trước đó

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

/ tôi cúi đầu kính trọng ... Tôi không thấy khả năng đưa bản đồ vào phần printf. Và $y=~/\d/gmẹo thật thông minh
Orabîg

5

Toán học 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]]

Sử dụng

g[845, 921]

nhân


Chắc chắn là do IntegerString[921]bạn IntegerString[b]?
David Zhang

Vâng, bắt tốt!
DavidC

Tôi nghĩ rằng thông số kỹ thuật cho phép loại bỏ không gian trong "x ".
ɐɔıʇǝɥʇuʎs

Bạn đang đúng. Tôi quyết định để nó ở vì nó trông đẹp hơn (và dù sao tôi cũng sẽ không có mã ngắn nhất).
DavidC

1

Con trăn, 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)])

Cách sử dụng: chính xác theo yêu cầu, chạy và nhập các giá trị trong đầu vào tiêu chuẩn.

Để xem đang chạy: http://ideone.com/S8xNb

Đầu ra:

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

Cảm ơn fabiocerqueira và beary605 và David Carraher


Bạn có thể xóa 4 ký tự của khoảng trắng: 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, một câu trả lời khác với đầu ra hơi khác một chút.

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

Sử dụng

đúng như yêu cầu

Đầu ra

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

Để xem chạy: http://ideone.com/mdR18


1

Perl , 157 151 150 144 141 133 ký tự:

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

Sử dụng :

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

Có một ý tưởng sáng nay: sử dụng printf giúp tôi cải thiện giải pháp của mình thêm 8 ký tự :)
Orabîg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.