计数杆;数你的杆


9

一些背景

计数棒是小棒(3-14厘米长),许多亚洲文化的数学家使用该已有2000多年的历史了,它代表任何整数或分数。(尽管在本次挑战中,我们将重点放在无符号整数上)还有一个书面版本,称为标杆数字。

运作方式如下:

(如果您在任何时候感到困惑,请查看每个数字的ascii表示形式以及我在底部提供的一些示例)

杆号是一个真实的位置数字系统,数字为1-9,空格为0。行数越多,数字越高。一旦超过5,则在顶部放置一条水平线,以将5加到下面的行数中。一条垂直线是1,两条垂直线2,五条垂直线是5,一条垂直线的顶部有一条水平线是6,四条垂直线的顶部有一条水平线是9(最高位数)。

垂直三位数:

 ||| 
 ||| 
 ||| 
 ||| 
 ||| 

为了使读杆数字更容易,他们为每个交替的数字使用了不同的符号。第二种表示法互换了水平线和垂直线的作用。因此3用三条水平线表示,8用三条水平线表示,顶部有一条垂直线。

水平8位数字:

  |  
  |  
__|__
_____
_____

如前所述,知道使用哪种表示法很容易,这是交替使用的,孙子写道“一个是垂直的,十个是水平的”。所以最右边的数字是垂直的,我们从那里开始交替。

挑战

这些标尺用于表示负数和分数(如关于它们Wikipedia文章中所述。出于此挑战的目的,我们仅关注正整数。目标很简单:

编写一个函数或完整程序,该函数或完整程序以任何方式将整数值作为输入,并将该整数的标尺数字表示形式打印到STDOUT(如果效果更好,也可以写入文件)。以字节为单位的最短代码获胜。

每个数字将由5x5的ASCII字符表示,并由5个空格的两个列分隔。您将使用的每个数字的确切表示形式如下:

space between two digits (two colums):





0 digit, both vertical and horizontal (five columns):






1 digit, vertical:
  |  
  |  
  |  
  |  
  |  

2 digit, vertical:  
 | | 
 | | 
 | | 
 | | 
 | | 

3 digit, vertical:
 ||| 
 ||| 
 ||| 
 ||| 
 ||| 

4 digit, vertical:
|| ||
|| ||
|| ||
|| ||
|| ||

5 digit, vertical:
|||||
|||||
|||||
|||||
|||||

6 digit, vertical:
_____
  |  
  |  
  |  
  |  

7 digit, vertical:
_____
 | | 
 | | 
 | | 
 | | 

8 digit, vertical:
_____
 ||| 
 ||| 
 ||| 
 ||| 

9 digit, vertical:
_____
|| ||
|| ||
|| ||
|| ||

1 digit, horizontal:




_____

2 digit, horizontal:



_____
_____

3 digit, horizontal:


_____
_____
_____

4 digit, horizontal:

_____
_____
_____
_____

5 digit, horizontal:
_____
_____
_____
_____
_____

6 digit, horizontal:
  |  
  |  
  |  
  |  
__|__

7 digit, horizontal:
  |  
  |  
  |  
__|__
_____

8 digit, horizontal:
  |  
  |  
__|__
_____
_____

9 digit, horizontal:
  |  
__|__
_____
_____
_____

这些数字应彼此相邻打印。不允许在最后一位数字的边界框之后尾随空格。需要末尾空格来完成最后一位数字的边界框。您应该在输出末尾添加一个换行符。也禁止不属于第一位数字边界框的前导空格。

有标准漏洞。

输出示例

以开头的行将>被解释为输入。

>12
        | | 
        | | 
        | | 
        | | 
_____   | | 

>8037
  |                  _____
  |                   | | 
__|__         _____   | | 
_____         _____   | | 
_____         _____   | | 

>950
_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       

所谓“尾随空格”,是指仅在最后一位数字的边界框之后,还是最后一位数字的末尾?
John Dvorak 2014年

@JanDvorak仅通过最后一位数字的边界框。如果需要Trailig空格来表示一个数字的整个边界框,则需要它们。
overactor 2014年

看例子,也禁止前导空格。是吗
edc65 2014年

@ edc65是的,谢谢你指出这一点。
overactor 2014年

Answers:


3

Python 2-216

我的第一枪可能是一些东西要拿出来,但是我的大脑很痛,所以现在足够好了

x=raw_input()
for l in range(5):print'  '.join((' '*7+'|   | |  ||| || '+'|'*7+'__|'+'_'*7)[[7*(4-l<n%6+n/6)+(n>5)*(l<10-n)-(l==10-n),n%6+n/6+(l<1)*(n>5)*(12-n)][(len(x)-i)%2]*5:][:5]for i,n in enumerate(map(int,x)))

2

JavaScript(ES6)223

带有数字参数的功能,输出到控制台。注意:如果输入参数可以是字符串,则代码将短5个字符,并且没有JS编号的17个有效数字的限制。

F=n=>{
  for(r=s='',n+=s;r<5;r++,s+=q)
    for(f=q='\n',p=n.length;f=!f,p--;q=(p?'  ':'')+'     1  |  1 | | 1 ||| 1|| ||1|||||1_____1__|__'.split(1)[d]+q)
      if(d=~~n[p])e=d+r,d=d>5?f?e<10?1:e>10?6:7:r?d-5:6:f?e>4?6:0:d;
  console.log(s)
}

测试

在Firefox控制台中进行测试。

F(12)

输出量

        | | 
        | | 
        | | 
        | | 
_____   | | 

F(8037)

输出量

  |                  _____
  |                   | | 
__|__         _____   | | 
_____         _____   | | 
_____         _____   | | 

F(950)

输出量

_____  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       
|| ||  _____       

不打高尔夫球

F=n=>{
  z='     1  |  1 | | 1 ||| 1|| ||1|||||1_____1__|__'.split(1);
  s='';
  n+=s;

  for (r = 0; r < 5; r++)
  {
    for(q='\n',f=1,p=n.length;f=!f,p--;)
    {
      d = ~~n[p];
      if (d)
      {
        e=d+r;
        if (d > 5)
        {
          if (f)
          {
            d = e < 10 ? 1 : e >10 ? 6 : 7;
          }
          else
          {
            d = r ? d-5 : 6;
          }
        }
        else
        {
          if (f)
            d = e > 4 ? 6 : 0;
        }
      }
      q = (p ? '  ' : '') + z[d] + q;
    }
    s+=q
  }

  console.log(s)
}

1

PowerShell,229字节

$n="$args"
0..4|%{$l=$_;$h=$n.Length%2
($n|% t*y|%{(' '*7+'|   | |  ||| || '+'|'*7+'_'*7+'|__')|% S*g(5*(('0123456666'+'0123451234'*4+'00000611110000661117000666117600666617660666667666')[50*($h=!$h)+10*$l+"$_"]-48))5})-join'  '}

在线尝试!

该字符串显示数字的位置:

# 0       1       2       3       4       5       6       7
# '     '.'  |  ',' | | ',' ||| ','|| ||','|||||','_____','__|__'

垂直杆:

"       |   | |  ||| || |||||||____________________"+   # 0123456666
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"+   # 0123451234
"       |   | |  ||| || |||||||  |   | |  ||| || ||"    # 0123451234

水平杆:

"                         _____  |    |    |    |  "+   # 0000061111
"                    __________  |    |    |  __|__"+   # 0000661117
"               _______________  |    |  __|_______"+   # 0006661176
"          ____________________  |  __|____________"+   # 0066661766
"     ___________________________|_________________"    # 0666667666

展开脚本:

$digits=' '*7+'|   | |  ||| || '+'|'*7+'_'*7+'|__'
$positions = '0123456666'+'0123451234'*4+'00000611110000661117000666117600666617660666667666'

$n="$args"
0..4|%{
    $line=$_
    $horizontal=$n.Length%2
    $chunks=$n|% toCharArray|%{
        $horizontal=!$horizontal
        $startFrom = 5*($positions[50*$horizontal+10*$line+"$_"]-48)
        $digits|% Substring $startFrom 5
    }
    $chunks-join'  '
}


规则中的“任何方式”是什么?编写以任何方式将整数值作为输入的函数或完整程序?我不敢将“整数”解释为“字符串”。:)
mazzy

是的,这有点含糊,也许不是OP的意图,但我想指出高尔夫容易性。
Veskah
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.