เห็นภาพการคูณแบบยาวด้วย ASCII art


12

ความท้าทาย

เขียนโปรแกรมที่รับจำนวนเต็มสองจำนวนจากอินพุตมาตรฐานคั่นด้วยเครื่องหมายจุลภาคแล้วพิมพ์การสร้างภาพข้อมูลการคูณแบบยาวของจำนวนเต็มสองจำนวนเหล่านี้ไปยังเอาต์พุตมาตรฐาน

เช่น:

อินพุต

14, 11

เอาต์พุตโปรแกรม

     14
    x11
   _____
     14
    14
  ______
    154

อินพุต

-7, 20

เอาต์พุตโปรแกรม

     -7
    x20
   _____
     00
    14
   _____
   -140

สมมติว่าอินพุตและตัวเลขถูกต้องเสมอในช่วง [-999, 999]

เกณฑ์การชนะ

รหัสที่สั้นที่สุดชนะ!


Tweaked เพื่อความสอดคล้องกับcodegolf.stackexchange.com/questions/1624/…
Peter Taylor

คำตอบ:


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 ตัวก่อนหน้า

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

/ ฉันคำนับด้วยความเคารพ ... ฉันไม่เห็นความเป็นไปได้ที่จะรวมแผนที่ในส่วน printf และ$y=~/\d/gเคล็ดลับฉลาด
Orabîg

5

Mathematica 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]อย่างไร
เดวิดจาง

ใช่จับได้ดี!
DavidC

"x "ผมคิดว่าสเป็คช่วยให้การกำจัดของพื้นที่ใน
ɐɔıʇǝɥʇuʎs

คุณถูกต้องแล้ว ฉันตัดสินใจทิ้งไว้เพราะมันดูดีกว่า (และฉันจะไม่มีรหัสสั้นที่สุดอยู่ดี)
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)])

การใช้งาน: ตรงตามที่ร้องขอเรียกใช้และป้อนค่าในอินพุตมาตรฐาน

หากต้องการดูการทำงาน: 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.