เห็นภาพการหารยาวด้วยศิลปะ ASCII


16

เขียนโปรแกรมที่แสดงภาพส่วนที่ยาวด้วย ASCII art อินพุตประกอบด้วยจำนวนเต็มสองจำนวนตัวเศษและส่วนโดยใช้รูปแบบอินพุตที่คุณเลือก

ตัวอย่าง:

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

กฎ:

  • การใช้งานของผู้ประกอบการส่วนการเขียนโปรแกรมภาษาที่จะได้รับอนุญาต
  • อนุญาตให้ใช้จำนวนเต็มขนาดใหญ่ได้
  • เพื่อความมั่นคง:
    • หากความฉลาดเป็นศูนย์ให้พิมพ์ศูนย์เดียวที่ท้ายกระดานดำน้ำ
    • หากส่วนที่เหลือเป็นศูนย์อย่าพิมพ์
    • อย่าพิมพ์เลขศูนย์นำหน้าบนตัวเลขใด ๆ
  • ขึ้นบรรทัดใหม่มากเกินไปที่ส่วนท้ายและช่องว่างต่อท้ายไปทางขวาจะได้รับอนุญาต
  • การแก้ปัญหาด้วยตัวละครน้อยที่สุดชนะ

ขีด จำกัด :

  • 0 <= ตัวเศษ <= 10 72 - 1
  • 1 <= ตัวหาร <= 9999999

นี่หมายความว่าเอาต์พุตจะไม่กว้างกว่า 80 คอลัมน์

ชุดทดสอบและการใช้งานตัวอย่าง:

คุณสามารถใช้long-division.c ( gist ) เพื่อทดสอบโปรแกรมของคุณ จริงๆแล้วมันเป็น bash script ที่มีโปรแกรม C อยู่ภายใน ปรับแต่งเพื่อเรียกใช้โปรแกรมของคุณในชุดทดสอบ ดูรหัส 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

คำสั่ง sed แปลก ๆ กรองบรรทัดใหม่และช่องว่างที่ต่อท้ายจากเอาต์พุตของโปรแกรม


ฉันค้นพบข้อบกพร่องเล็กน้อยในการดำเนินการอ้างอิง ได้แก่ ในกรณีของ 123000123000123 ÷ 123 บรรทัดการลบนั้นประกอบไปด้วยพื้นที่ว่าง แต่พวกเขาควรขยายความยาวของตัวเลขที่มองเห็นได้ของ minuend ตอนนี้ได้รับการแก้ไขแล้ว
Joey Adams

2
ฉันคิดว่าผลลัพธ์จะเอนเอียงไปทางผู้ชมกอล์ฟที่พูดภาษาอังกฤษเล็กน้อย: en.wikipedia.org/wiki/…
hallvabo

คุณสามารถสร้างไฟล์ที่แสดงผลลัพธ์ที่คาดหวังของการทดสอบทั้งหมดและเชื่อมโยงกับมันได้หรือไม่?
mellamokb

@mellamokb: เพิ่มแล้วขอบคุณ!
Joey Adams

แล้วการยอมรับล่ะ คำถามคือเก่าพอ ...
โอ Prypin

คำตอบ:


3

Python 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())

เอาท์พุตตรงกับคาดไว้

รุ่น:
 1. 284
 2. 257 : s,z,f=0,0,0s=z=f=0; z and fz*f; วนซ้ำดีกว่า ลบ newlines สองสามรายการ


2
คุณอาจลองใช้ ideone สำหรับ python3 และป้อนข้อมูล - ideone.com/clone/ZZyzu
คุณ

3

Haskell, 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) เขียนฟังก์ชันการจัดรูปแบบเขตข้อมูลสตริงอีกครั้ง

เรียบร้อย! ฉันทำโซลูชัน Haskell ด้วยอักขระ 344 ตัว แต่ไม่ได้โพสต์ นอกจากนี้ฉันไม่ทราบว่าคุณสามารถใช้สัญลักษณ์ Unicode สำหรับโอเปอเรเตอร์ (ที่ไม่มี-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)}

หมายเหตุ: หากดึงดูดอย่างที่ดูเหมือนจะโกนทิ้งตัวละครสองสามตัวโดยแทนที่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 : แก้ไขข้อผิดพลาดด้วย 1/7 สร้างเอาต์พุตพิเศษ


สคริปต์ทดสอบพบปัญหาหนึ่งข้อ d(1,7)(และการทดสอบที่คล้ายกัน) ทำซ้ำตัวส่วนแทนการพิมพ์อะไร นี่เป็นสิ่งที่ผิดเพราะตัวเลขนี้ควรเป็นจำนวนที่หารด้วยคูณด้วยส่วนซึ่งเป็นศูนย์
Joey Adams

การทดสอบทั้งหมดผ่านตอนนี้
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}

เรียกใช้โดยใช้ i (ตัวหารตัวเลข) Codegolfed JS: http://jsfiddle.net/puckipedia/EP464/ Ungolfed (ดัตช์) JS: http://jsfiddle.net/puckipedia/M82VM/

ส่งคืนการหารแบบยาว (ในรูปแบบดัตช์ตามที่ฉันเรียนรู้):

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

TestCase:

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

เฮ้นี่มันไม่เหมือนกับที่ต้องการ!
Oleh Prypin

@BlaXpirit ฉันรู้ว่าฉันเรียนรู้แบบนั้น
puckipedia

น่าสนใจ แม้ว่า @BlaXpirit พูดว่า แต่มันไม่ได้เป็นไปตามสเป็ค ข้อมูลจำเพาะมีวัตถุประสงค์เพื่อเป็นมาตรฐานยุติธรรมของการเปรียบเทียบในการพิจารณาประสิทธิภาพของรหัส-แข็งแรงเล่นกอล์ฟเพื่อให้คุณไม่สามารถเปลี่ยนสเปคโดยพลแม้ว่าคุณจะไม่เห็นด้วยกับรูปแบบการออก :)
mellamokb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.