ASCII 아트로 긴 나누기 시각화


16

ASCII 아트로 긴 나눗셈을 시각화하는 프로그램을 작성하십시오. 입력은 선택한 입력 형식을 사용하여 분자와 분모의 두 정수로 구성됩니다.

예 :

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이면 다이빙 보드의 끝에 단일 0을 인쇄하십시오.
    • 나머지가 0이면 인쇄하지 마십시오.
    • 숫자에 선행 0을 인쇄하지 마십시오.
  • 오른쪽 끝에 과다한 줄 바꿈과 후행 공백이 허용됩니다.
  • 문자 수가 가장 적은 솔루션이 승리합니다.

제한:

  • 0 <= 분자 <= 10 72 - 1
  • 1 <= 분모 <= 9999999

이는 출력이 80 열보다 넓지 않음을 의미합니다.

테스트 스위트 및 샘플 구현 :

당신이 사용할 수있는 긴 division.c ( 요지를 프로그램을 테스트하기 위해). 실제로 C 프로그램이있는 bash 스크립트입니다. 테스트 스위트에서 프로그램을 호출하도록 조정하십시오. 참조 구현을 보려면 맨 아래에있는 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!

편집 : 요청에 따라 테스트 스위트 입력예상 출력 을 텍스트 파일 ( gist )에 넣습니다 . 샘플 사용량 (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

이상한 sed 명령은 프로그램 출력에서 ​​후행 줄 바꿈과 공백을 필터링합니다.


참조 구현에서 123000123000123 ÷ 123의 경우에 약간의 결함이 있음을 발견했습니다. 빼기 행은 빈 공간에 걸쳐 있었지만 minuend의 보이는 자릿수의 길이에만 걸쳐 있어야합니다. 이제 수정되었습니다.
Joey Adams

2
나는 영어로 말하는 골프 청중에게 약간 편향되어 있다고 생각한다. en.wikipedia.org/wiki/…
hallvabo

모든 테스트의 예상 결과를 보여주는 파일을 만들고 링크 할 수 있습니까?
mellamokb

@mellamokb : 감사합니다!
Joey Adams

수락은 어떻습니까? 이 질문은 충분히 오래되었습니다 ...
Oleh 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; 더 나은 반복; 개행을 몇 개 제거했습니다.


2
python3에 대한 ideone을 시도하고 입력 할 수 있습니다 -ideone.com/clone/ZZyzu
YOU

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 자로 Haskell 솔루션을 만들었지 만 게시하지 않았습니다. 또한 연산자없이 유니 코드 기호를 사용할 수 있다는 것을 몰랐습니다 -XUnicodeSyntax.
Joey Adams

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 : 1/7 추가 출력을 생성하는 버그 수정.


테스트 스크립트는 한 가지 문제를 밝혀 냈습니다. d(1,7)(및 유사한 테스트) 아무것도 인쇄하지 않고 분모를 반복하십시오. 이 숫자는 몫 자리수에 분모를 곱한 값 (0)이어야하므로 잘못되었습니다.
Joey Adams

모든 테스트는 이제 통과합니다.
Joey Adams

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 (divider, number)를 사용하여 호출하십시오. Codegolfed JS : http://jsfiddle.net/puckipedia/EP464/ Ungolfed (네덜란드어) 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>");

이봐, 이것은 필요한 것과 다릅니다!
Oleh Prypin

@BlaXpirit 알고 있습니다. 그런 식으로 배웠습니다.
puckipedia

흥미 롭군 @BlaXpirit가 말했듯이 사양을 따르지 않습니다. 사양은 사용자가 임의로 당신이 출력 형식에 동의하지 않는 경우에도 사양 : 변경할 수 있도록 코드 golfed 코드의 효율성을 결정하기위한 비교의 공정한 표준을하기위한 것입니다
mellamokb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.