Nomor Maya ASCII


21

Tulis program atau fungsi yang, diberi bilangan bulat positif sebagai input, menampilkan representasi bilangan bulat itu dalam angka Maya .

Angka Maya

Angka Maya adalah sistem vigesimal (basis 20) hanya menggunakan 3 simbol:

  • < >for Zero (Simbol yang benar adalah semacam shell yang tidak dapat dengan mudah direpresentasikan menggunakan ASCII).
  • .untuk Satu
  • ----untuk Lima

Bilangan ditulis secara vertikal dalam kekuatan 20, dan angka antara 0 dan 19 ditulis sebagai tumpukan balita dan satu . Anda harus merujuk ke artikel Wikipedia untuk lebih jelasnya.

Sebagai contoh, berikut adalah angka antara 0 dan 25, dipisahkan dengan koma:

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

Input

  • Input selalu bilangan bulat positif antara 0 dan 2147483647 (2 ^ 31 - 1).
  • Anda dapat mengambil input dari STDIN, sebagai argumen baris perintah, parameter fungsi atau yang serupa.

Keluaran

  • Setiap baris paling panjang 4 karakter. < >dan ----harus selalu dicetak seperti yang diberikan di sini (masing-masing 4 karakter).
  • Yang ( .) harus dipusatkan pada garis. Jika ada 1 atau 3 ., karena penyelarasan horizontal sempurna tidak mungkin, tidak masalah apakah mereka satu kolom ke kiri atau satu kolom ke kanan atau tengah.
  • Pasti ada satu garis kosong di antara kekuatan 20 yang berbeda, terlepas dari ketinggian tumpukan di kekuatan 20-an. Misalnya, output yang benar untuk 25 dan 30 adalah:

            .
     .
           ----
    ----   ----
    
  • Tidak ada garis depan atau belakang yang diizinkan.

  • Keluaran harus dicetak persis seperti dalam contoh yang diberikan.

Uji kasus

  • Setiap angka individual antara 0 dan 25 diberikan seperti contoh di atas.

  • Memasukkan: 42

Keluaran:

 .. 

 .. 
  • Memasukkan: 8000

Keluaran:

 .  

<  >

<  >

<  >
  • Memasukkan: 8080

Keluaran:

 .  

<  >

....

<  >
  • memasukkan: 123456789

Keluaran:

 .  

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

 .  
----
----

 .. 
----
----

 .  

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

....
----
  • Memasukkan: 31415

Keluaran:

... 

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

----
----

----
----
----
  • Memasukkan: 2147483647

Keluaran:

 .  

... 
----
----

 .  
----
----

 .  

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

....
----

 .. 

 .. 
----

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang.


15 dan 20 tampaknya identik.
isaacg

@isaacg Terima kasih, saya sebenarnya sudah 15 muncul di tempat yang tepat dan juga antara 19 dan 20. Tetap.
Fatalkan tanggal

@Fatalize Apakah output perlu dicetak (yaitu STDOUT) atau bisakah fungsi saya mengembalikan output saja?
rink.attendant.6

@ rink.attendant.6 Harus dicetak persis seperti yang ada di pos.
Fatalkan tanggal

Apakah boleh jika 1 adalah satu kolom ke kanan, tetapi 3 adalah satu kolom ke kiri?
aragaer

Jawaban:


3

Pyth, 41 byte

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

Cobalah online: Demonstrasi

Penjelasan:

                                     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

Terima kasih kepada Dom Hastings karena membantu saya menghemat 8 byte.


1
Hei samgak, beberapa perubahan tabungan byte lebih, daripada redo,if(int($i/=20))yang dapat Anda gunakan ~~($i/=20)&&redo. ~~convert to int - Anda juga dapat menggunakan 0|di awal (atau |0di akhir). Juga mengganti substr(".... ... .. . ",20-$i%5*5,5)dengan (' .', ' ..','...','.'x4)[$i%5-1].$/tampaknya bekerja ok, tapi saya belum menguji semua kasus uji ... Jika mereka yang bekerja, Anda turun ke 114 ... Jika saya memikirkan hal lain untuk berbagi Aku akan memberitahu Anda!
Dom Hastings

1
Berpikir tentang itu, jika Anda hanya ingin memiliki bilangan bulat dan mengabaikan sisanya, Anda dapat menggunakan variabel ajaib $-yang akan selalu terpotong ke int ... mungkin menyimpan beberapa lagi!
Dom Hastings

1
@HomHastings terima kasih, trik konversi int menyimpan beberapa byte, dan menghilangkan substr menyimpan lain 4. Baris baru harus masuk ke dalam konstanta string karena tidak boleh ada baris baru dalam kasus di mana tidak ada titik.
samgak

1
@HomHastings memang berhasil, terima kasih lagi! Saya kira itu berarti saya harus menyingkirkan lelucon saya tentang akhir dunia
samgak

4

JavaScript ES6, 143 byte

Banyak byte yang ditambahkan karena perlu console.log, bisa menghemat 23 byte lainnya tanpa itu.

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

Mathematica 185 182 171 153

Dengan 18 byte yang disimpan berkat saran Arcinde untuk menggunakan fungsi anonim,

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

Contoh

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

keluaran


Memeriksa

Angka desimal, 31415, dinyatakan dalam basis 20. Mathematica menggunakan huruf kecil untuk ini.

BaseForm[31415, 20]

basis 20


Digit desimal sesuai dengan angka 20 basis di atas.

IntegerDigits[31415,20]

{3, 18, 10, 15}


Contoh lain

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]&menggunakan fungsi anonim.
jcai

@ Arcinde, Terima kasih. Fungsi anonim lama yang bagus.
DavidC

3

JavaScript (ES6), 157 byte

Baris baru signifikan dan dihitung sebagai masing-masing 1 byte. Karena pencetakan ke STDOUT diperlukan, console.logsaya perlu beberapa byte di sana.

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

Demo

Untuk tujuan demonstrasi, saya akan menulis versi ES5 sehingga berfungsi di semua browser:

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


Apakah .jointanda kurung yang terakhir dibutuhkan?
Downgoat


@ Vihan Itu tidak menghasilkan apa-apa, itu hanya mengembalikan.
rink.attendant.6

tidak tahu itu persyaratan karena input bisa melalui fungsi. pastebin.com/0pS0XtJa lebih pendek 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]

Contoh:

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

<  >

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

Edit: trailing line ...


Saya punya beberapa perbaikan untuk disarankan. Pertama, ubah [n%20==0]ke [n%20<1]. Kedua, ubah [[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]ke h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]dengan a=n%5, yang memindahkan semua n%5s, dan mengubah kondisi *(a>0)yang mengembalikan string kosong pada a==0untuk efek yang sama.
Sherlock9

Akhirnya, menempatkan a, hdan npada satu baris, seperti: a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20. Semua ini akan membuat Anda dengan 131 byte.
Sherlock9

2

CJam, 82 76 byte

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

Program CJam pertama saya, pada dasarnya hanya transliterasi dari jawaban Perl saya ke CJam.

Coba online

Banyak baris dengan komentar:

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

Pendekatan yang sama dengan jawaban JavaScript saya. PHP memiliki fungsi bawaan untuk semuanya.

Mengambil 1 input dari baris perintah (yaitu STDIN), seperti yang terlihat dengan $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("<  >");}

Menggunakan rekursi untuk mencetak angka paling signifikan terlebih dahulu. Kemudian mencetak nol atau mencetak semua titik dengan satu pintar printf dan semua balita dalam satu lingkaran. Saya tidak yakin apakah saya bisa menghindari menggunakan if-else di sini.

Kelemahan dari printf pintar adalah bahwa 1 dan 3 tidak selaras satu sama lain:

Hasil untuk 23 adalah:

  .

...

119 solusi yang salah - mengikuti baris baru

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

Ia mendapat input dari argumen baris perintah pertama.

Kode sumber lengkap, dengan komentar dan tes, tersedia di github .


\nadalah dua karakter - tetapi baris baru di tengah-tengah string hanya satu.
fisharebest

1

Python 2, 114 byte

Jawaban ini didasarkan pada jawaban Pyth Jakube dan jawaban Python 2 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

Jelly , 50 49 47 byte

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

Cobalah online!

... sekarang dibiarkan selaras berkat poin user202729.

Ketika Anda menipu diri sendiri untuk berpikir < >adalah palindrom ...


Mengapa Anda meluruskan ......
user202729

@ user202729 Untuk .dan ..perlu ada ruang jadi saya menempatkan satu ...juga. Apakah ada cara yang lebih pendek?
dylnan

Saya pikir bahwa menurut spec tantangan ...tidak boleh sejajar dengan benar. Ubah saja <4ke <3?
user202729

@ user202729 Anda benar, saya pikir saya salah membaca spec. Saya tidak berpikir itu menentukan untuk ... tapi saya bisa mengubahnya ke <2
dylnan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.