ASCII 마야 숫자


21

양의 정수를 입력으로하여 해당 정수의 표현을 Maya numerics로 출력하는 프로그램 또는 함수를 작성하십시오 .

마야 숫자

Maya 숫자는 3 개의 기호 만 사용 하는 vigesimal 시스템 (베이스 20)입니다.

  • < >for zero (올바른 기호는 ASCII를 사용하여 쉽게 표현할 수없는 일종의 쉘입니다).
  • .하나를 위해
  • ----대한 다섯

숫자는 20의 거듭 제곱으로 수직으로 작성되고 0과 19 사이의 숫자는 51의 스택으로 기록됩니다 . 자세한 내용 은 Wikipedia 기사 를 참조하십시오.

예를 들어, 다음은 쉼표로 구분 된 0과 25 사이의 숫자입니다.

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

입력

  • 입력은 항상 0과 2147483647 (2 ^ 31-1) 사이의 양의 정수입니다.
  • STDIN에서 입력을 명령 행 인수, 함수 매개 변수 또는 이와 유사한 것으로 가져올 수 있습니다.

출력

  • 각 줄은 최대 4 자입니다. < >----(4 자 각을 갈망) 여기에 주어진 항상 인쇄해야합니다.
  • .선 (들 )은 중심에 있어야합니다. 1 또는 3이 있으면 .완벽한 수평 정렬이 불가능하기 때문에 왼쪽에 하나의 열인지 오른쪽에 하나의 열인지 또는 중앙인지는 중요하지 않습니다.
  • 20의 거듭 제곱의 스택 높이에 관계없이 20의 거듭 제곱 사이에 정확히 하나의 빈 줄이 있어야합니다. 예를 들어, 25 및 30에 대한 올바른 출력은 다음과 같습니다.

            .
     .
           ----
    ----   ----
    
  • 선행 또는 후행은 허용되지 않습니다.

  • 출력은 주어진 예에서와 똑같이 인쇄되어야합니다.

테스트 사례

  • 위의 예로 주어진 0에서 25 사이의 각 개별 숫자.

  • 입력: 42

산출:

 .. 

 .. 
  • 입력: 8000

산출:

 .  

<  >

<  >

<  >
  • 입력: 8080

산출:

 .  

<  >

....

<  >
  • 입력: 123456789

산출:

 .  

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

 .  
----
----

 .. 
----
----

 .  

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

....
----
  • 입력: 31415

산출:

... 

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

----
----

----
----
----
  • 입력: 2147483647

산출:

 .  

... 
----
----

 .  
----
----

 .  

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

....
----

 .. 

 .. 
----

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


15와 20은 동일한 것으로 보입니다.
isaacg

@isaacg 고마워, 나는 실제로 올바른 자리와 19에서 20 사이에 15가 나타납니다. 고정.
페이탈 라이즈

@Fatalize 출력을 인쇄해야합니까 (예 : STDOUT) 내 함수가 출력을 반환 할 수 있습니까?
rink.attendant.6

@ rink.attendant.6 게시물에있는 그대로 정확하게 인쇄해야합니다.
Fatalize

1이 오른쪽에 1 열이지만 3이 왼쪽에 1 열이면 괜찮습니까?
aragaer

답변:


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

125 117 바이트

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

8 바이트 절약에 도움을 준 Dom Hastings에게 감사드립니다.


1
이봐, redo,if(int($i/=20))당신 보다 바이트를 절약 할 수 있는 몇 가지 변경 사항 인 samgak ~~($i/=20)&&redo. ~~int로 변환합니다- 0|처음 또는 |0끝 에서도 사용할 수 있습니다 . 또한로 교체해도 문제 substr(".... ... .. . ",20-$i%5*5,5)가없는 (' .', ' ..','...','.'x4)[$i%5-1].$/것 같지만 모든 테스트 사례를 테스트 한 것은 아닙니다 ... 해당 작업을 수행 한 경우 114 세까지입니다. 공유 할 다른 사항이 있으면 알려 드리겠습니다.
돔 헤이스팅스

1
그것에 대해 생각하면 정수 만 갖고 나머지를 무시하고 싶다면 $-항상 int로 자르는 마술 변수 를 사용할 수 있습니다 ... 몇 가지 더 절약 할 수 있습니다!
돔 헤이스팅스

1
@DomHastings 덕분에 int 변환 트릭은 몇 바이트를 절약하고 substr을 제거하면 다른 4를 절약 할 수 있습니다. 점이없는 경우 줄 바꿈이 없어야하기 때문에 줄 바꿈은 문자열 상수 안에 들어가야합니다.
samgak

1
@DomHastings는 실제로 그렇게합니다. 다시 감사합니다! 나는 그것이 세상의 농담의 끝을 제거해야한다는 것을 의미한다고 생각한다
samgak

4

자바 스크립트 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]

산출


확인 중

기수 20에 표현 된 10 진수 31415입니다. Mathematica는이를 위해 소문자를 사용합니다.

BaseForm[31415, 20]

베이스 20


위의 기본 20 숫자에 해당하는 10 진수입니다.

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]

ex2


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

@Arcinde, 감사합니다. 좋은 오래된 익명 함수.
DavidC

3

자바 스크립트 (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

137 바이트 : pastebin.com/3Zgg4qtX
Downgoat

@vihan 아무 것도 출력하지 않고 그냥 반환합니다.
rink.attendant.6

입력이 함수를 통해 이루어질 수 있기 때문에 이것이 요구 사항이라는 것을 몰랐습니다. pastebin.com/0pS0XtJa 는 3 바이트 짧습니다.
Downgoat

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]. 둘째, with로 변경 [[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]하면 모든 s가 밖으로 이동 하고 동일한 효과 를 위해 빈 문자열을 반환하는 조건을 변경합니다 . h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]a=n%5n%5*(a>0)a==0
Sherlock9

마지막으로 넣어 a, hn과 같이, 한 줄에 : a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20. 이 모든 것은 131 바이트를 남겨 두어야합니다.
Sherlock9

2

CJam, 82 76 바이트

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

첫 번째 CJam 프로그램은 기본적으로 CJam에 대한 Perl 답변의 음역입니다.

온라인으로 시도

주석이있는 여러 줄 :

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에는 모든 기능이 내장되어 있습니다.

다음과 같이 명령 행에서 1 개의 입력 (예 : STDIN)을 가져옵니다 $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 5 반복 . 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

1

파이썬 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

@ user202729 .그리고 ..공간도 있어야하므로 공간도 필요합니다 .... 더 짧은 방법이 있습니까?
dylnan

도전 사양에 따라 ...올바르게 정렬해서는 안된다고 생각합니다 . ?로 변경 <4하십시오 <3.
user202729

@ user202729 당신 말이 맞아요. 스펙을 잘못 읽은 것 같습니다. 나는 그것을 지정한다고 생각하지 않지만 ... <2로 변경할 수 있습니다.
dylnan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.