ASCII sanatı ile uzun çarpmayı görselleştirin


12

Meydan okuma

Standart girişten virgülle ayrılmış iki tamsayı alan bir program yazın ve ardından bu iki tamsayının standart çıktıya uzun çoğalmasının bir görselleştirmesini yazdırın.

Örneğin:

Giriş

14, 11

Program çıktısı

     14
    x11
   _____
     14
    14
  ______
    154

Giriş

-7, 20

Program çıktısı

     -7
    x20
   _____
     00
    14
   _____
   -140

[-999, 999] aralığındaki her zaman doğru girişleri ve sayıları varsayalım

Kazanma kriterleri

En kısa kod kazanır!


Yanıtlar:


3

Perl, 108 karakter

Orabig'in bazı fikirlerini içeren en iyi 108 karakter çözümü.

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

Daha önceki 139 karakter çözümü

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

/ saygıyla eğiliyorum ... Haritayı printf bölümüne dahil etme imkanı görmedim. Ve $y=~/\d/ghile
zekiydi

5

Mathematica 213 217 197 193 186 184 193 184 177

kod

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

kullanım

g[845, 921]

çarpmak


Kesinlikle IntegerString[921]demek istiyorsun IntegerString[b]?
David Zhang

Evet, iyi yakaladın!
DavidC

Bence spec içindeki alanın kaldırılmasına izin veriyor "x ".
ɐɔıʇǝɥʇuʎs

Haklısın. Onu daha iyi görünüyordu çünkü terk etmeye karar verdim (ve yine de en kısa koda sahip olmayacaktım).
DavidC

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

Kullanımı: tam olarak istendiği gibi, standart girişte değerleri çalıştırın ve girin.

Koşmayı görmek için: http://ideone.com/S8xNb

Çıktı:

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

Fabiocerqueira ve beary605 ve David Carraher sayesinde


print '\n'print'\n'10*a) for i,d in enumerate10*a)for i,d in enumerate"%9s\n%9i" % (h,a*b)"%9s\n%9i"%(h,a*b)
Boşluğun

1

Python, 145, biraz farklı çıktıya sahip başka bir cevap.

kod

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

kullanım

aynen istendiği gibi

Çıktı

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

Çalışmayı görmek için: http://ideone.com/mdR18


1

Perl , 157 151 150 144 141 133 karakter:

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

Kullanımı:

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

Bu sabah bir fikrim vardı: printf kullanarak çözümümü 8 karakterle geliştirmemi
sağla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.