Số Maya ASCII


21

Viết chương trình hoặc hàm, với một số nguyên dương làm đầu vào, xuất ra biểu diễn của số nguyên đó bằng chữ số Maya .

Chữ số Maya

Chữ số Maya là một hệ thống tối ưu (cơ sở 20) chỉ sử dụng 3 ký hiệu:

  • < >cho Zero (Biểu tượng chính xác là một loại vỏ không thể được biểu diễn dễ dàng bằng ASCII).
  • .cho một
  • ----cho năm

Các số được viết theo chiều dọc trong quyền hạn của 20, và số từ 0 đến 19 được viết như đống fivesnhững người . Bạn sẽ tham khảo bài viết Wikipedia để biết thêm chi tiết.

Ví dụ, đây là các số từ 0 đến 25, được phân tách bằng dấu phẩy:

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

Đầu vào

  • Đầu vào luôn là các số nguyên dương trong khoảng từ 0 đến 2147483647 (2 ^ 31 - 1).
  • Bạn có thể lấy đầu vào từ STDIN, làm đối số dòng lệnh, tham số hàm hoặc bất cứ thứ gì tương tự.

Đầu ra

  • Mỗi dòng dài tối đa 4 ký tự. < >----phải luôn được in như được đưa ra ở đây (mỗi ký tự dài 4 ký tự).
  • Ones ( .) phải được tập trung vào dòng. Nếu có 1 hoặc 3 ., vì không thể căn chỉnh ngang hoàn hảo, không quan trọng chúng là một cột ở bên trái hay một cột ở bên phải hay giữa.
  • Phải có chính xác một dòng trống giữa các sức mạnh khác nhau của 20, bất kể chiều cao của các ngăn xếp trong sức mạnh của 20 giây. Ví dụ: đầu ra chính xác cho 25 và 30 là:

            .
     .
           ----
    ----   ----
    
  • Không có đường dẫn hoặc dấu cho phép.

  • Đầu ra phải được in chính xác như trong các ví dụ đã cho.

Các trường hợp thử nghiệm

  • Mỗi số riêng lẻ từ 0 đến 25 được đưa ra như ví dụ trên.

  • Đầu vào: 42

Đầu ra:

 .. 

 .. 
  • Đầu vào: 8000

Đầu ra:

 .  

<  >

<  >

<  >
  • Đầu vào: 8080

Đầu ra:

 .  

<  >

....

<  >
  • đầu vào: 123456789

Đầu ra:

 .  

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

 .  
----
----

 .. 
----
----

 .  

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

....
----
  • Đầu vào: 31415

Đầu ra:

... 

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

----
----

----
----
----
  • Đầu vào: 2147483647

Đầu ra:

 .  

... 
----
----

 .  
----
----

 .  

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

....
----

 .. 

 .. 
----

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


15 và 20 dường như giống hệt nhau.
isaacg

@isaacg Cảm ơn, tôi thực sự đã có 15 xuất hiện cả ở đúng vị trí và cả từ 19 đến 20. Đã sửa.
Gây tử vong vào

@Firthize Có phải in đầu ra (ví dụ STDOUT) hoặc chức năng của tôi có thể trả lại đầu ra không?
rink.attguard.6

@ rink.attguard.6 Phải được in chính xác như trong bài viết.
Gây tử vong vào

Có ổn không nếu 1 là một cột bên phải, nhưng 3 là một cột bên trái?
aragaer

Câu trả lời:


3

Bình thường, 41 byte

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

Dùng thử trực tuyến: Trình diễn

Giải trình:

                                     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 byte

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

Cảm ơn Dom Hastings đã giúp tôi tiết kiệm 8 byte.


1
Xin chào samgak, một vài thay đổi tiết kiệm byte hơn là redo,if(int($i/=20))bạn có thể sử dụng ~~($i/=20)&&redo. ~~chuyển đổi thành int - bạn cũng có thể sử dụng 0|ở đầu (hoặc |0ở cuối). Ngoài ra thay thế substr(".... ... .. . ",20-$i%5*5,5)bằng (' .', ' ..','...','.'x4)[$i%5-1].$/có vẻ hoạt động tốt, nhưng tôi đã thử nghiệm tất cả các trường hợp thử nghiệm ... Nếu những công việc đó, bạn giảm xuống còn 114 ... Nếu tôi nghĩ ra bất cứ điều gì khác để chia sẻ, tôi sẽ cho bạn biết!
Dom Hastings

1
Nghĩ về nó, nếu bạn chỉ muốn có một số nguyên và bỏ qua phần còn lại, bạn có thể sử dụng biến ma thuật $-sẽ luôn cắt ngắn thành một int ... có thể tiết kiệm thêm một vài chi tiết!
Dom Hastings

1
@DomHastings cảm ơn, thủ thuật chuyển đổi int lưu một vài byte và loại bỏ chất nền sẽ tiết kiệm thêm 4. Các dòng mới cần phải đi vào bên trong các hằng chuỗi vì không có dòng mới trong trường hợp không có dấu chấm.
samgak

1
@DomHastings thực sự nó, cảm ơn một lần nữa! Tôi đoán điều đó có nghĩa là tôi phải thoát khỏi trò đùa cuối thế giới của mình
samgak

4

JavaScript ES6, 143 byte

Tải các byte được thêm vào vì cần console.log, có thể lưu thêm 23 byte mà không có nó.

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

Toán học 185 182 171 153

Với 18 byte được lưu nhờ đề xuất của Arcinde để sử dụng các hàm ẩn danh,

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

Thí dụ

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

đầu ra


Kiểm tra

Số thập phân, 31415, được biểu thị trong cơ sở 20. Mathicala sử dụng chữ thường cho trường hợp này.

BaseForm[31415, 20]

cơ sở 20


Các chữ số thập phân tương ứng với số 20 cơ sở trên.

IntegerDigits[31415,20]

{3, 18, 10, 15}


Một vi dụ khac

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]&sử dụng các chức năng ẩn danh.
jcai

@Arcinde, Cảm ơn. Chức năng ẩn danh cũ tốt.
DavidC

3

JavaScript (ES6), 157 byte

Các dòng mới có ý nghĩa và được tính là 1 byte mỗi. Vì việc in ra STDOUT là bắt buộc, nên console.logtôi phải trả một vài byte ở đó.

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

Bản giới thiệu

Đối với mục đích trình diễn, tôi sẽ viết phiên bản ES5 để nó hoạt động trong tất cả các trình duyệt:

// 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>


Liệu cuối cùng .joincần ngoặc đơn?
Hạ cấp


@vihan Điều đó không xuất ra bất cứ thứ gì, nó chỉ trả về.
rink.attguard.6

không biết rằng đó là một yêu cầu vì đầu vào có thể thông qua một chức năng. pastebin.com/0pS0XtJa ngắn hơn 3 byte
Downgoat

2

Python 2.x, 142 byte:

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]

Thí dụ:

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

<  >

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

Chỉnh sửa: đường mòn ...


Tôi có một vài cải tiến để đề xuất. Đầu tiên, thay đổi [n%20==0]thành [n%20<1]. Thứ hai, thay đổi [[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]thành h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]với a=n%5, di chuyển tất cả các n%5s ra và thay đổi điều kiện để *(a>0)trả về một chuỗi rỗng a==0cho cùng một hiệu ứng.
Sherlock9

Cuối cùng, đặt a, hntrên một dòng, như vậy : a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20. Tất cả điều này sẽ để lại cho bạn với 131 byte.
Sherlock9

2

CJam, 82 76 byte

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

Chương trình CJam đầu tiên của tôi, về cơ bản chỉ là phiên âm câu trả lời Perl của tôi cho CJam.

Thử trực tuyến

Đa dòng với ý kiến:

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 byte

Cách tiếp cận tương tự như câu trả lời JavaScript của tôi. PHP có các hàm dựng sẵn cho mọi thứ.

Lấy 1 đầu vào từ dòng lệnh (tức là STDIN), như đã thấy với $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("<  >");}

Sử dụng đệ quy để in số lượng đáng kể đầu tiên. Sau đó, in số không hoặc in tất cả các dấu chấm với một thông minh printf và tất cả các số trong một vòng lặp. Tôi không chắc chắn nếu tôi có thể tránh sử dụng if-other ở đây.

Nhược điểm của printf thông minh là 1 và 3 không thẳng hàng với nhau:

Kết quả cho 23 là:

  .

...

119 giải pháp không chính xác - theo dõi dòng mới

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 byte

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");

Nó nhận đầu vào từ đối số dòng lệnh đầu tiên.

Mã nguồn hoàn chỉnh, với các bình luận và kiểm tra, có sẵn trên github .


\nlà hai ký tự - nhưng một dòng mới ở giữa một chuỗi chỉ là một.
fisharebest

1

Python 2, 114 byte

Câu trả lời này dựa trên câu trả lời Pyth của Jakube và câu trả lời Python 2 của Locoluis.

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

Thạch , 50 49 47 byte

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

Hãy thử trực tuyến!

... bây giờ được căn trái nhờ điểm của người dùng202729.

Khi bạn tự lừa mình suy nghĩ < >là một ...


Tại sao bạn căn chỉnh đúng ......
user202729

@ user202729 Vì ...cần phải có một khoảng trống nên tôi cũng đặt một khoảng trống .... Có cách nào ngắn hơn không?
dylnan

Tôi nghĩ rằng theo thông số kỹ thuật ...không nên liên kết đúng. Chỉ cần đổi <4thành <3?
dùng202729

@ user202729 Bạn nói đúng, tôi nghĩ tôi đã đọc sai thông số. Tôi không nghĩ rằng nó chỉ định cho ... nhưng tôi có thể thay đổi nó thành <2
dylnan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.