ASCII sanatı ile uzun bölümü görselleştirin


16

ASCII sanatı ile uzun bölümü görselleştiren bir program yazın. Giriş, seçtiğiniz girdi biçimini kullanan bir pay ve bir payda olmak üzere iki tamsayıdan oluşur.

Örnekler:

1234 ÷ 56:

     22
   ----
56|1234
   112
   ---
    114
    112
    ---
      2

1002012 ÷ 12:

     83501
   -------
12|1002012
    96
   ---
     42
     36
     --
      60
      60
      --
        12
        12
        --

0 ÷ 35

   0
   -
35|0

Kurallar:

  • Programlama dilinin bölüm operatörünün kullanımına izin verilir.
  • Büyük tamsayı desteğinin kullanımına da izin verilir.
  • Tutarlılık için:
    • Bölüm sıfırsa, tramplenin sonuna tek bir sıfır yazdırın.
    • Kalan sıfır ise yazdırmayın.
    • Baştaki sıfırları hiçbir sayıya yazdırmayın.
  • Sonda fazladan yeni satırlara ve sağda sondaki boşluklara izin verilir.
  • En az karakter içeren çözüm kazanır.

Sınırları:

  • 0 <= payı <10 72 - 1
  • 1 <= payda <= 9999999

Bu, çıktının asla 80 sütundan daha geniş olmayacağı anlamına gelir.

Test takımı ve örnek uygulama:

Sen kullanabilirsiniz uzun division.c ( özü programınızı test etmek). Aslında içinde bir C programı olan bir bash betiğidir. Programınızı test paketinde çağırmak için düzenleyin. Referans uygulamasını görmek için alttaki C koduna bakın. Örnek program veya test paketiyle ilgili herhangi bir sorun olup olmadığını lütfen bize bildirin.

$ ./long-division.c 10 7
   1
  --
7|10
   7
  --
   3
$ ./long-division.c
PASS 1234 ÷ 56
PASS 1002012 ÷ 12
PASS 1 ÷ 1
--- snip ---

Score: 35 / 35
All tests passed!

Düzenleme: İstek üzerine, test paketi girişi ve beklenen çıktıyı metin dosyalarına ( gist ) koydum . Örnek kullanım (bash):

cat input | while read nd; do
    ./program $nd |
        sed 's/\s*$//' | sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba'
done > output

diff -u expected output

Garip sed komutları, sondaki satırları ve boşlukları program çıktısından filtreler.


Referans uygulamada, 123000123000123 ÷ 123 durumunda küçük bir kusur keşfettim. Çıkarma çizgileri boş alana yayılmıştı, ancak sadece minuend'in görünür basamaklarının uzunluğunu kapsamalıdır. Şimdi düzeltildi.
Joey Adams

2
Bence çıktı İngilizce konuşan golf izleyicisine karşı biraz önyargılı: en.wikipedia.org/wiki/…
hallvabo

Sadece tüm testlerin beklenen çıktısını gösteren bir dosya oluşturabilir ve buna bağlanabilir misiniz?
mellamokb

@mellamokb: Eklendi, teşekkürler!
Joey Adams

Kabul etmeye ne dersiniz? Soru yeterince eski ...
Oleh Prypin

Yanıtlar:


3

Python 3, 284 257 karakter

div.py

n,t=input().split()
d=int(t)
l=lambda x:len(str(x))
s=l(n)
def p(x):print(' '*(l(d)+s-l(x)+1)+str(x))
p(int(n)//d)
p('-'*s)
p(t+'|'+n)
s=z=f=0
while t:
 try:
  while z<d:z=z*10+int(n[s]);s+=1
 except:t=0
 if z*f:p(z)
 if t:f=1;t=z//d*d;p(t);p('-'*l(z));z-=t

Kullanım: python3 div.py
giriş: klavyeden

test.py

import sys
sys.stdin=open('input'); sys.stdout=open('output','w')
for line in open('input'): exec(open('div.py').read())

çıktı eşleşmeleri bekleniyor

Sürümler:
 1. 284
 2. 257 : s,z,f=0,0,0s=z=f=0; z and fz*f; daha iyi döngü; birkaç yeni satır kaldırıldı.


2
python3 ve giriş için ideone deneyebilirsiniz - ideone.com/clone/ZZyzu
YOU

3

Haskell, 320 karakter

l=length
(®)=replicate
p!v=p&show v
p&s=(p-l s)®' '++s
0§_=[];_§l=l
d[m,n]=l c!(read m`div`e):l c&(l m®'-'):c:drop 1(g 0(map(toInteger.fromEnum)m)$1+l n)where
 e=read n;c=n++'|':m
 g r(d:z)p=i§[o!k,o!(i*e),o&(l(show k)®'-')]++g j z o where k=r*10+d-48;(i,j)=k`divMod`e;o=1+p
 g r[]p=r§[p!r]
main=interact$unlines.d.words

Tüm testleri geçer. Bu oldukça golf'deyken - sanırım burada daha yapılacak çok şey var ...


  • Düzenleme: (344 -> 339) readarama ihtiyacını azaltır show, yeterli değil showolarak kısaltmak yeterli gecikme çağrıları s.
  • Düzenleme: (339 -> 320) dize alanı biçimlendirme işlevlerini yeniden yazdı

Temiz! 344 karakterli bir Haskell çözümü yaptım, ancak göndermedim. Ayrıca, operatörler için Unicode sembollerini kullanabileceğinizi bilmiyordum (olmadan -XUnicodeSyntax).
Joey Adams

3

JavaScript (400 394 418 )

function d(n,d){t=parseInt;p=function(v){return(s+v).substring(v.length)};a=function(v,c){return v.replace(/\d/g,c)};w='\n';q=b=o=c=e='';s=a(d,' ')+' ';f=true;i=-1;z='0';while(++i<n.length){s+=' ';if(t(c+=n[i])>=t(d)){q+=r=Math.floor(t(c)/t(d));o+=(!f?p(c)+w:e)+p(''+r*t(d))+w+p(a(c,'-'))+w;c=t(c)%t(d);f=false}else if(!f){q+=z;}c=(c==0)?e:e+c}return p(!q?z:q)+w+p(a(n,'-'))+w+d+'|'+n+w+o+(q?p(c):e)}

NOT: değiştirerek birkaç karakter traş etmek göründüğü kadar cazip gibi c=(c==0)?olan c=!c?bu nokta ile ilgili hataların yüzen neden çünkü kullanılamaz.

http://jsfiddle.net/nLzYW/9/

Örnek Yürütme:

document.writeln("<pre>");
document.writeln(d("1234","56"));
document.writeln();
document.writeln(d("1002012","12"));
document.writeln();
document.writeln(d("0","35"));
document.writeln();
document.writeln(d("123000123000123","123"));
document.writeln("</pre>");

Düzenleme 1 : Küçük hata düzeltmeleri, çok sayıda kod optimizasyonu.

Edit 2 : 1/7 üreten ekstra çıktı ile hatayı düzeltin.


Test komut dosyası bir sorun ortaya çıkardı. d(1,7)(ve benzer testler) hiçbir şey yazdırmak yerine paydayı tekrarlar. Bu yanlıştır, çünkü bu sayı payda olan sıfırın kat hanesi çarpı olmalıdır.
Joey Adams

Tüm testler şimdi geçiyor.
Joey Adams

1

Javascript: (372)

function g(a){for(var c="",e=0;e<a;e++)c=" "+c;return c}function i(a,c){for(var e=a+"/"+c+"\\",j=(""+c).split(""),k="",d=0,b=0;b<j.length;b++){d*=10;d+=parseInt(j[b],10);var f=d>9?b-1:b,h=0;h=Math.floor(d/a);d%=a;f=g(f+a.toString().split("").length);f+=h*a+"\n"+g(b+a.toString().split("").length)+"--\n"+g(b+a.toString().split("").length)+d+"\n";k+=f;e+=h}return e+"\n"+k}

İ (bölücü, sayı) kullanarak çağırın. Codegolfed JS: http://jsfiddle.net/puckipedia/EP464/ Ungolfed (hollandalı) JS: http://jsfiddle.net/puckipedia/M82VM/

Uzun bölümü döndürür (öğrendiğim gibi Hollandaca formatta):

5/25\05
 0
 --
 2
 25
  --
  0

Test durumu:

document.write("<pre>"+i(5,25)+"</pre>");
document.write("<pre>"+i(7,65669726752476)+"</pre>");

Hey, bu gerektiği gibi değil!
Oleh Prypin

@BlaXpirit Biliyorum, bu şekilde öğrendim.
puckipedia

İlginç. @BlaXpirit'in dediği gibi, spesifikasyonu takip etmiyor. Spesifikasyon, kodlu golf kodunun verimliliğini belirlemek için adil bir karşılaştırma standardı olarak tasarlanmıştır, bu nedenle çıktı formatını kabul
etmese
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.