Hình dung sự phân chia dài với nghệ thuật ASCII


16

Viết một chương trình trực quan hóa sự phân chia dài với nghệ thuật ASCII. Đầu vào bao gồm hai số nguyên, tử số và mẫu số, sử dụng định dạng đầu vào mà bạn chọn.

Ví dụ:

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

Quy tắc:

  • Sử dụng toán tử phân chia của ngôn ngữ lập trình được cho phép.
  • Sử dụng hỗ trợ số nguyên lớn cũng được cho phép.
  • Cho thống nhất:
    • Nếu thương số bằng 0, hãy in một số 0 ở cuối bảng lặn.
    • Nếu phần còn lại bằng không, không in nó.
    • Không in số không hàng đầu trên bất kỳ số nào.
  • Các dòng mới vượt quá ở cuối và dấu cách ở bên phải được cho phép.
  • Giải pháp với ít nhân vật nhất sẽ thắng.

Hạn mức:

  • 0 <= tử số <= 10 72 - 1
  • 1 <= mẫu số <= 9999999

Điều này ngụ ý rằng đầu ra sẽ không bao giờ rộng hơn 80 cột.

Bộ kiểm tra và thực hiện mẫu:

Bạn có thể sử dụng long-Division.c ( ý chính ) để kiểm tra chương trình của bạn. Nó thực sự là một tập lệnh bash với chương trình C bên trong. Tinh chỉnh nó để gọi chương trình của bạn trong bộ thử nghiệm. Nhìn vào mã C ở phía dưới để xem việc thực hiện tham chiếu. Xin vui lòng cho tôi biết nếu có bất kỳ vấn đề với chương trình mẫu hoặc bộ thử nghiệm.

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

Chỉnh sửa: Theo yêu cầu, tôi đặt thử nghiệm bộ đầu vàođầu ra dự kiến vào các tập tin văn bản ( ý chính ). Sử dụng mẫu (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

Các lệnh sed kỳ lạ lọc ra các dòng mới và dấu cách từ đầu ra chương trình.


Tôi đã phát hiện ra một lỗ hổng nhỏ trong việc triển khai tham chiếu, cụ thể là trong trường hợp 123000123000123 123. Các dòng trừ được kéo dài trong không gian trống, nhưng chúng chỉ nên kéo dài theo chiều dài của các chữ số hiển thị của minuend. Bây giờ nó đã được sửa.
Joey Adams

2
Tôi nghĩ rằng kết quả đầu ra hơi thiên về khán giả chơi golf nói tiếng Anh: en.wikipedia.org/wiki/iêu
hallvabo

Bạn có thể chỉ cần tạo một tập tin cho thấy đầu ra dự kiến ​​của tất cả các bài kiểm tra và liên kết đến nó?
mellamokb

@mellamokb: Đã thêm, cảm ơn!
Joey Adams

Còn việc chấp nhận thì sao? Câu hỏi đã đủ cũ ...
Oleh Prypin

Câu trả lời:


3

Python 3, 284 257 ký tự

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

Cách sử dụng: python3 div.py
Đầu vào: từ bàn phím

kiểm tra

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

đầu ra phù hợp với dự kiến

Phiên bản:
 1. 284
 2. 257 :s,z,f=0,0,0s=z=f=0; z and fz*f; vòng lặp tốt hơn; loại bỏ một vài dòng mới.


2
bạn có thể thử ideone cho python3 và đầu vào - ideone.com/clone/ZZyzu
BẠN

3

Haskell, 320 ký tự

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

Vượt qua tất cả các bài kiểm tra. Mặc dù đây là một sân golf đẹp - tôi nghĩ vẫn còn nhiều việc phải làm ở đây ...


  • Chỉnh sửa: (344 -> 339) readcuộc gọi trì hoãn , giúp giảm nhu cầu gọishow , đủ để viết tắt shownhư slà không có giá trị nó.
  • Chỉnh sửa: (339 -> 320) viết lại các chức năng định dạng trường chuỗi

Khéo léo! Tôi đã làm một giải pháp Haskell với 344 ký tự, nhưng không đăng nó. Ngoài ra, tôi không biết bạn có thể sử dụng các ký hiệu Unicode cho các toán tử (không có -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)}

LƯU Ý: Có vẻ hấp dẫn như việc cạo sạch một vài ký tự bằng cách thay thế c=(c==0)?bằng c=!c?, nó không thể sử dụng được vì nó gây ra các lỗi liên quan đến dấu phẩy động.

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

Thi công mẫu:

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

Chỉnh sửa 1 : Sửa lỗi nhỏ, tối ưu hóa nhiều mã.

Chỉnh sửa 2 : Sửa lỗi với 1/7 tạo thêm đầu ra.


Kịch bản thử nghiệm đã tiết lộ một vấn đề. d(1,7)(và các thử nghiệm tương tự) lặp lại mẫu số thay vì in không có gì. Điều này là sai vì số này phải là chữ số thương số nhân với mẫu số, bằng không.
Joey Adams

Tất cả các bài kiểm tra vượt qua ngay bây giờ.
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}

Gọi bằng cách sử dụng i (bộ chia, số). Mã hóa mã hóa: http://jsfiddle.net/puckipedia/EP464/ Ungolfed (tiếng Hà Lan) JS: http://jsfiddle.net/puckipedia/M82VM/

Trả về phép chia dài (ở định dạng Hà Lan như tôi đã học):

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

Testcase:

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

Này, đây không giống như yêu cầu!
Oleh Prypin

@BlaXpirit Tôi biết, tôi đã học nó theo cách đó.
puckipedia

Hấp dẫn. Mặc dù như @BlaXpirit nói, nó không tuân theo thông số kỹ thuật. Thông số kỹ thuật được dự định là một tiêu chuẩn so sánh hợp lý để xác định hiệu quả của mã đánh gôn, vì vậy bạn không thể tùy ý thay đổi thông số ngay cả khi bạn không đồng ý với định dạng đầu ra :)
mellamokb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.