ASCII कला के साथ लंबे विभाजन की कल्पना करें


16

एक प्रोग्राम लिखें जो ASCII कला के साथ लंबे विभाजन की कल्पना करता है। इनपुट में दो पूर्णांक, एक अंश और एक भाजक होता है, जो आपकी पसंद के इनपुट प्रारूप का उपयोग करता है।

उदाहरण:

1234 ÷ 56:

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

1002012 201 12:

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

0 ÷ 35

   0
   -
35|0

नियम:

  • प्रोग्रामिंग भाषा के डिवीजन ऑपरेटर के उपयोग की अनुमति है।
  • बड़े पूर्णांक समर्थन का उपयोग करने की भी अनुमति है।
  • स्थिरता के लिए:
    • यदि भागफल शून्य है, तो डाइविंग बोर्ड के अंत में एक भी शून्य प्रिंट करें।
    • यदि शेष शून्य है, तो इसे प्रिंट न करें।
    • किसी भी नंबर पर अग्रणी शून्य प्रिंट न करें।
  • अंतिम छोर पर स्थित अतिरिक्त स्थानों और दाईं ओर अनुगामी स्थानों की अनुमति है।
  • सबसे कम पात्रों के साथ समाधान जीतता है।

सीमाएं:

  • 0 <= अंश <= 10 72 - 1
  • 1 <= भाजक <= 9999999

इसका तात्पर्य है कि आउटपुट कभी भी 80 कॉलम से अधिक चौड़ा नहीं होगा।

परीक्षण सूट और नमूना कार्यान्वयन:

आप अपने प्रोग्राम का परीक्षण करने के लिए long-Division.c ( gist ) का उपयोग कर सकते हैं । यह वास्तव में सी प्रोग्राम के साथ एक बैश स्क्रिप्ट है। टेस्ट सूट में अपने कार्यक्रम को लागू करने के लिए इसे ट्वीक करें। संदर्भ कार्यान्वयन को देखने के लिए नीचे दिए गए C कोड को देखें। कृपया मुझे बताएं कि क्या नमूना कार्यक्रम या परीक्षण सूट के साथ कोई समस्या है।

$ ./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!

संपादित करें: अनुरोध के अनुसार, मैंने परीक्षण सूट इनपुट और अपेक्षित आउटपुट को पाठ फ़ाइलों ( जीआईएसटी ) में डाल दिया । नमूना उपयोग (बैश):

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

अजीब सीड कमांड प्रोग्राम आउटपुट से नईलाइन और स्पेस को पीछे छोड़ते हैं।


मुझे संदर्भ कार्यान्वयन में मामूली खराबी का पता चला, अर्थात् 123000123000123 ÷ 123 के मामले में। घटाव लाइनें रिक्त स्थान को फैला रही थीं, लेकिन उन्हें केवल मीनू के दृश्यमान अंकों की लंबाई के बराबर होना चाहिए। यह अब तय हो गया है।
जॉय एडम्स

2
मुझे लगता है कि आउटपुट अंग्रेजी बोलने वाले गोल्फ दर्शकों के लिए थोड़ा सा पक्षपाती है: en.wikipedia.org/wiki/…
hallvabo

क्या आप सिर्फ एक फाइल बना सकते हैं, जो सभी परीक्षणों के अपेक्षित आउटपुट और लिंक से पता चलता है?
मेलमोकब

@ मेलमोकब: जोड़ा गया, धन्यवाद!
जॉय एडम्स

स्वीकार करने के बारे में क्या? यह प्रश्न काफी पुराना है ...
ओलेह प्रिनपिन

जवाबों:


3

पायथन 3, 284 257 वर्ण

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

उपयोग: python3 div.py
इनपुट: कीबोर्ड से

test.py

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

आउटपुट मैचों की उम्मीद है

संस्करण:
 १.  २ 28४
२. २५s,z,f=0,0,0 → : → s=z=f=0; z and fz*f; बेहतर लूपिंग; कुछ नए समाचार निकाले।


2
आप python3 और इनपुट के लिए विचारधारा की कोशिश कर सकते हैं - ideone.com/clone/ZZyzu
आप

3

हास्केल, 320 वर्ण

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

सभी टेस्ट पास करता है। जबकि यह बहुत सुंदर है - मुझे लगता है कि अभी भी यहाँ किया जाना बाकी है ...


  • संपादित करें: (344 -> 339) विलंब readकॉल, जो कॉल करने की आवश्यकता को कम करता है show, पर्याप्त है कि संक्षिप्त showरूप sमें इसके लायक नहीं है।
  • संपादित करें: (339 -> 320) स्ट्रिंग फ़ील्ड स्वरूपण कार्यों को फिर से लिखा

साफ! मैंने 344 पात्रों के साथ एक हास्केल समाधान किया, लेकिन इसे पोस्ट नहीं किया। इसके अलावा, मुझे नहीं पता था कि आप ऑपरेटरों (बिना -XUnicodeSyntax) के यूनिकोड प्रतीकों का उपयोग कर सकते हैं ।
जॉय एडम्स

3

जावास्क्रिप्ट (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)}

नोट: जैसा कि लुभावना है कि यह कुछ वर्णों के c=(c==0)?साथ बदलकर दाढ़ी बनाता है c=!c?, यह प्रयोग करने योग्य नहीं है क्योंकि यह फ्लोटिंग पॉइंट-संबंधित बग का कारण बनता है।

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

नमूना निष्पादन:

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>");

संपादित 1 : मामूली बग फिक्स, कई कोड अनुकूलन।

संपादित करें 2 : अतिरिक्त आउटपुट उत्पन्न करने के साथ बग को ठीक करें।


परीक्षण स्क्रिप्ट में एक समस्या सामने आई। d(1,7)(और इसी तरह के परीक्षण) कुछ भी नहीं छापने के बजाय हर दोहराते हैं। यह गलत है क्योंकि इस संख्या को भाजक अंक गुना, जो शून्य होना चाहिए।
जोए एडम्स

अभी सभी टेस्ट पास हुए।
जॉय एडम्स

1

जावास्क्रिप्ट: (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}

I (विभक्त, संख्या) का उपयोग करके आह्वान करें। कोडगॉल्फेड JS: http://jsfiddle.net/puckipedia/EP464/ Ungolfed (Dutch) JS: http://jsfiddle.net/puckipedia/M82VM/

लंबा विभाजन लौटाता है (डच प्रारूप में जैसा कि मैंने इसे सीखा):

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

परीक्षण का मामला:

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

अरे, यह आवश्यकतानुसार नहीं है!
ओलेह प्रिनपिन

@BXXpirit मुझे पता है, मैंने इसे इस तरह सीखा।
१६:५० पर पकपिड

दिलचस्प। हालांकि @BlaXpirit कहते हैं, यह कल्पना का पालन नहीं करता है। कोड-गोल्फ कोड की दक्षता का निर्धारण करने के लिए कल्पना की तुलना एक निष्पक्ष मानक के रूप में की जाती है, इसलिए आप आउटपुट प्रारूप से सहमत नहीं होने पर भी मनमाने ढंग से परिवर्तन नहीं कर सकते हैं :)
mellamokb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.