使用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 <=分子<= 10 72 - 1
  • 1 <=分母<= 9999999

这意味着输出将永远不会超过80列。

测试套件和示例实现:

您可以使用long-division.cgist)测试您的程序。它实际上是一个带有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的情况下。减法线跨越空格,但它们应仅跨越被减数的可见数字的长度。现在已修复。
乔伊·亚当斯

2
我想输出是比特向讲英语的高尔夫球观众偏见:en.wikipedia.org/wiki/...
hallvabo

您可以只创建一个显示所有测试的预期输出并链接到该文件的文件吗?
mellamokb 2011年

@mellamokb:添加,谢谢!
乔伊·亚当斯

接受呢?这个问题已经够老了……
Oleh Prypin 2011年

Answers:


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. 257s,z,f=0,0,0s=z=f=0; z and fz*f; 更好的循环;删除了一些换行符。


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呼叫,这减少了对call的需要show,足以使缩写shows不值得。
  • 编辑:(339-> 320)重新编写了字符串字段格式化功能

整齐!我用344个字符做了一个Haskell解决方案,但是没有发布。另外,我不知道您可以将Unicode符号用于运算符(不带-XUnicodeSyntax)。
乔伊·亚当斯

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)(和类似测试)重复分母而不打印任何内容。这是错误的,因为此数字应为商位数乘以分母,即为零。
乔伊·亚当斯

现在所有测试都通过了。
乔伊·亚当斯

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(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 2011年

@BlaXpirit我知道,我是这样学习的。
puckipedia 2011年

有趣。尽管正如@BlaXpirit所说,它没有遵循规范。该规范旨在作为确定代码查询代码效率的比较标准,因此即使您不同意输出格式,也不能随意更改该规范:)
mellamokb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.