ASCII Maya数字


21

编写一个程序或函数,在给定正整数作为输入的情况下,以Maya数字输出该整数的表示形式。

玛雅数字

Maya数字是仅使用3个符号的原始系统(以20为基数):

  • < >对于(正确的符号是某种不能轻易使用ASCII来表示外壳的)。
  • .对于一个
  • ----对于

数字以20的幂垂直写入,0到19之间的数字以51的堆栈形式写入。您应参阅Wikipedia文章以获取更多详细信息。

例如,以下是0到25之间的数字,以逗号分隔:

                                                                                 .    ..  ...  ....
                                                        .    ..  ...  .... ---- ---- ---- ---- ----  .    .    .    .    .    .
                               .    ..  ...  .... ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
<  >, .  , .. ,... ,....,----,----,----,----,----,----,----,----,----,----,----,----,----,----,----,<  >, .  , .. ,... ,....,----

输入项

  • 输入始终是0到2147483647(2 ^ 31-1)之间的正整数。
  • 您可以将来自STDIN的输入作为命令行参数,函数参数或类似的东西。

产出

  • 每行最多4个字符长。< >并且----应始终按此处给出的方式打印(每个字符长4个字符)。
  • .必须将Ones()放在直线的中心。如果为1或3 .,则由于不可能实现完美的水平对齐,因此它们是左侧的一列还是右侧或中心的一列都无关紧要。
  • 无论20s的幂的堆栈高度如何,在20的幂之间必须有一条空线。例如,25和30的正确输出是:

            .
     .
           ----
    ----   ----
    
  • 不允许前导或尾随线。

  • 输出必须完全按照给定示例中的方式打印。

测试用例

  • 上面的示例给出了介于0到25之间的每个数字。

  • 输入: 42

输出:

 .. 

 .. 
  • 输入: 8000

输出:

 .  

<  >

<  >

<  >
  • 输入: 8080

输出:

 .  

<  >

....

<  >
  • 输入: 123456789

输出:

 .  

... 
----
----
----

 .  
----
----

 .. 
----
----

 .  

....
----
----
----

....
----
  • 输入: 31415

输出:

... 

... 
----
----
----

----
----

----
----
----
  • 输入: 2147483647

输出:

 .  

... 
----
----

 .  
----
----

 .  

----
----
----

....
----

 .. 

 .. 
----

计分

这是,因此以字节为单位的最短代码获胜。


15和20似乎相同。
isaacg

@isaacg谢谢,实际上我有15个出现在正确的位置以及19和20之间。已修复。
致命

@Fatalize是否需要打印输出(即STDOUT),或者我的函数可以仅返回输出?
rink.attendant.15年

@ rink.attendant.6必须完全按照帖子中的样子打印。
致命

如果1右边是一列,而3左边是一列可以吗?
aragaer 2015年

Answers:


3

Pyth,41个字节

j+bbm|jb_m.[\ 4kc:*d\.*5\.*4\-4"<  >"jQ20

在线试用:演示

说明:

                                     jQ20   convert input to base 20
    m                                       map each value d to:
                  *d\.                         string of d points
                 :    *5\.*4\-                 replace 5 points by 4 -s
                c             4                split into groups of 4
         m.[\ 4k                               center each group
        _                                      invert order
      jb                                       join by newlines
     |                         "<  >"          or if 0 use "<  >"
j+bb                                        join by double newlines

5

Perl中,125个 117字节

$-=<>;{$_=($-%20?(""," .
"," ..
","...
","....
")[$-%5]."----
"x($-/5&3):"<  >
").$_;($-/=20)&&($_=$/.$_,redo)}print

感谢Dom Hastings帮助我节省了8个字节。


1
嗨samgak,还有几个字节保存更改,而不是redo,if(int($i/=20))您可以使用~~($i/=20)&&redo~~转换为int-您也可以0|在开头(或|0结尾)使用。也更换substr(".... ... .. . ",20-$i%5*5,5)(' .', ' ..','...','.'x4)[$i%5-1].$/似乎工作好,但我没有测试所有的测试用例......如果这些工作,你到114 ...如果我想别的分享我会让你知道!
唐·黑斯廷斯

1
考虑一下,如果您只想拥有一个整数而忽略余数,则可以使用magic变量$-,该变量将始终截断为一个int ...可能会节省更多!
唐·黑斯廷斯

1
@DomHastings,谢谢,int转换技巧节省了两个字节,而摆脱substr则节省了另外4个字节。换行符需要放在字符串常量内,因为在没有点的情况下不必换行符。
samgak

1
@DomHastings确实可以,再次感谢!我想这意味着我必须摆脱世界末日的笑话
samgak

4

JavaScript ES6,143个字节

由于需要添加的字节负载console.log,如果没有可以再保存23个字节。

n=>console.log((d=(x,s='',l=1,j=x/l|0)=>s+(j>19?d(x,s,l*20)+`

`:'')+((j=j%20)?(' '+`.`.repeat(j%5)).slice(-4)+`
----`.repeat(j/5):'<  >'))(n))

4

数学185 182 171 153

由于Arcinde建议使用匿名函数,因此节省了18个字节,

c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&

c[If[# > 0, {q, r} = #~QuotientRemainder~5; c@{{"", " .", " ..", " ...", "...."}[[r + 1]], c@{{""}, {d = "----"}, {d, d}, {d, d, d}}[[q + 1]]}, "< >"] & /@ #~IntegerDigits~20] &[31415]

输出


检查

十进制数31415,以20为基数。Mathematica为此使用小写字母。

BaseForm[31415, 20]

以20为基数


对应于上述基数20的十进制数字。

IntegerDigits[31415,20]

{3,18,10,15}


另一个例子

IntegerDigits[2147483607, 20]

{1、13、11、1、15、9、0、7}

c[If[# > 0, {q, r} = #~QuotientRemainder~5;c@{{"", " .", " ..", " ...","...."}[[r + 1]], c@{{""}, {d = "----"}, {d, d}, {d, d, d}}[[q + 1]]},"< >"] & /@ #~IntegerDigits~20] &[2147483607]

例2


c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&使用匿名函数。
jcai 2015年

@Arcinde,谢谢。良好的旧匿名功能。
DavidC 2015年

3

JavaScript(ES6),157个字节

换行很重要,每个换行计数为1个字节。由于需要打印到STDOUT,console.log所以在那里花了我几个字节。

f=i=>console.log([...i.toString(20)].map(j=>(!(j=parseInt(j,20))||j%5?[`<  >`,` .`,` ..`,`...`,`....`][j%5]+`
`:'')+`----
`.repeat(j/5)).join`
`.slice(0,-1))

演示版

为了演示起见,我将编写一个ES5版本,使其在所有浏览器中均可使用:

// Snippet stuff
console.log = function(x) {
  O.innerHTML = x;
}
document.getElementById('I').addEventListener('change', function() {
  f(this.valueAsNumber);
}, false);

// Actual function
f = function(i) {
  console.log(i.toString(20).split('').map(function(j) {
    return (! (j = parseInt(j, 20)) || j % 5 ? ['<  >', ' .', ' ..', '...', '....'][j % 5] + '\n' : '') + '----\n'.repeat(j / 5);
  }).join('\n').slice(0,-1));
}
<input type=number min=0 max=2147483647 value=0 id=I>

<pre><output id=O></output></pre>


最后一个.join需要括号吗?
Downgoat


@vihan不会输出任何内容,它只会返回。
rink.attendant.15年

不知道这是一个要求,因为可以通过函数输入。pastebin.com/0pS0XtJa短了3个字节
Downgoat 2015年

2

Python 2.x,142个字节:

def m(n):
 h=[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]+"----\n"*(n%20/5),"<  >\n"][n%20==0]
 n/=20
 if n>0:
  h=m(n)+"\n\n"+h
 return h[:-1]

例:

>>> print m(2012)
----

<  >

 ..
----
----
>>> 

编辑:尾随线...


我有一些改进建议。首先,更改[n%20==0][n%20<1]。其次,更改[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]with a=n%5,将所有n%5s移出,并更改*(a>0)返回空字符串的条件,a==0以达到相同的效果。
Sherlock15年

最后,放ah以及n在同一行,像这样:a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20。所有这些将使您剩下131个字节。
Sherlock15年

2

CJam,82 76字节

li{_K%[""" .
"" ..
""...
""....
"]1$5%='-4*N+2$5/3&*+"<  >
"?N+L+:L;K/}h;L);

我的第一个CJam程序,基本上只是Perl对CJam答案的音译。

在线尝试

多行注释:

li            # read input
{             # start of do-while loop
  _K%         # check if this base-20 digit is a zero
    [""" .
    "" ..
    ""...
    ""....
    "]1$5%=   # push dots for 1s onto stack
    '-4*N+2$5/3&*+    # push lines for 5s onto stack

    "<  >
    "         # push zero on stack
  ?           # ternary if test (for digit equals zero)
  N+L+:L;     # pre-concatenate string with output plus newline
  K/          # divide by 20
}h            # end of do while loop
;L);          # push output string on stack, chop off trailing newline

1

PHP,220字节

与我的JavaScript答案相同的方法。PHP具有所有功能的内置功能。

从命令行(即STDIN)接受1个输入,如$argv[1]

<?=rtrim(implode("\n",array_map(function($j){return(!($j=base_convert($j,20,10))||$j%5?['<  >', ' .', ' ..', '...', '....'][$j%5]."\n":'').str_repeat("----\n",$j/5);},str_split(base_convert($argv[1],10,20)))));

1

C-149

f(v){v/20&&(f(v/20),puts("\n"));if(v%=20)for(v%5&&printf("%3s%s","...."+4-v%5,v/5?"\n":""),v/=5;v--;v&&puts(""))printf("----");else printf("<  >");}

使用递归先打印最重要的数字。然后要么打印零,要么将所有点打印为一个聪明 点,将printf所有五个点打印为一个循环。我不确定是否可以在这里避免使用if-else。

聪明的printf的缺点是1和3彼此不对齐:

23的结果是:

  .

...

119不正确的解决方案-尾随换行符

f(v){v/20&&(f(v/20),puts(""));if(v%=20)for(v%5&&printf("%3s\n","...."+4-v%5),v/=5;v--;)puts("----");else puts("<  >");}


1

PHP 202 192字节

function m($n){return(($c=($n-($r=$n%20))/20)?m($c)."\n":"").
($r?(($q=$r%5)?substr(" .   .. ... ....",$q*4-4,4)."\n":"").
str_repeat("----\n",($r-$q)/5):"<  >\n");}
echo rtrim(m($argv[1]),"\n");

它从第一个命令行参数获取输入。

带有注释和测试的完整源代码可在github上获得


\n是两个字符-但字符串中间的换行符只有一个。
fisharebest 2015年

1

Python 2,114字节

该答案基于Jakube的Pyth答案和Locoluis的Python 2答案。

def f(n):d,m=divmod(n%20,5);h=[" "*(2-m/2)+"."*m+"\n----"*d,"<  >"][n%20<1];n/=20;return(f(n)+"\n\n"if n else"")+h

0

果冻50 49 47字节

b5µṪ”.x⁶;$L<3Ɗ¡ṭ⁾--;UW¤ẋ$Ẏ$L¡Ṛø“<  >”WµẸ?
b20Ç€

在线尝试!

... 现在感谢user202729的观点。

当你欺骗自己思考< >是回文...


您为什么右对齐......
user202729'4

@ user202729因为,.并且..需要有一个空格,所以我也放置了一个空格...。有没有更短的方法?
dylnan '18

我认为,根据挑战规范...不应正确对齐。只是更改<4<3
user202729'4

@ user202729您说得对,我想我看错了规范。我不认为它适用于...但是我可以将其更改为<2
dylnan
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.