ASCII Maya Numaraları


21

Girdi olarak pozitif bir tamsayı verilen, bu tamsayı gösterimini Maya rakamlarında veren bir program veya işlev yazın .

Maya sayıları

Maya rakamları sadece 3 sembol kullanan asal sayıdaki bir sistemdir (taban 20):

  • < >için Zero (doğru sembol kolayca ASCII kullanılarak temsil edilemez kabuk çeşit).
  • .için One
  • ----için Five

Sayılar 20 güçler dikey olarak yazılır ve 0 ile 19 arasında sayılar yığınlarının olarak yazılır beşli ve olanları . Daha fazla bilgi için Wikipedia makalesine bakmalısınız.

Örnek olarak, burada 0 ile 25 arasında, virgülle ayrılmış sayılardır:

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

Girdiler

  • Girişler her zaman 0 ile 2147483647 (2 ^ 31 - 1) arasındaki pozitif tam sayılardır.
  • Giriş komutunu STDIN'den komut satırı argümanı, function parametresi veya benzeri bir şey olarak alabilirsiniz.

çıktılar

  • Her satır en fazla 4 karakter uzunluğundadır. < >ve ----her zaman burada verilen şekilde basılmalıdır (her biri 4 karakter uzunluğunda).
  • Ones ( .) çizgide ortalanmalıdır. 1 veya 3 ise ., mükemmel yatay hizalama mümkün olmadığından, bir sola doğru bir sütun veya sağa veya bir sağa bir sütun olup olmadıkları önemli değildir.
  • 20'li yılların gücündeki yığınların yüksekliğinden bağımsız olarak, 20'nin farklı güçleri arasında tam olarak bir boş satır olmalıdır. Örneğin, 25 ve 30 için doğru çıktı:

            .
     .
           ----
    ----   ----
    
  • Baştaki veya sondaki hatlara izin verilmez.

  • Çıktılar tam olarak verilen örneklerde olduğu gibi yazdırılmalıdır.

Test durumları

  • Her örnek, 0 ile 25 arasında, yukarıda örnek olarak verilmiştir.

  • Giriş: 42

Çıktı:

 .. 

 .. 
  • Giriş: 8000

Çıktı:

 .  

<  >

<  >

<  >
  • Giriş: 8080

Çıktı:

 .  

<  >

....

<  >
  • giriş: 123456789

Çıktı:

 .  

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

 .  
----
----

 .. 
----
----

 .  

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

....
----
  • Giriş: 31415

Çıktı:

... 

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

----
----

----
----
----
  • Giriş: 2147483647

Çıktı:

 .  

... 
----
----

 .  
----
----

 .  

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

....
----

 .. 

 .. 
----

puanlama

Bu , yani bayt cinsinden en kısa kod kazanır.


15 ve 20 aynı görünüyor.
isaacg

@isaacg Teşekkürler, aslında hem doğru yerde hem de 19 ile 20 arasında görünen 15 karakter vardı.
15’te

@Fartalize Çıktının yazdırılması gerekiyor mu (örn. STDOUT) veya işlevim çıktıyı geri verebilir mi?
rink.attendant.6

@ rink.attendant.6 Postadaki gibi tam olarak basılmalıdır.
15’te

1 sağda bir sütun, 3 sola bir sütun ise sorun yok mu?
aragaer

Yanıtlar:


3

Pyth, 41 bayt

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

Çevrimiçi deneyin: Gösteri

Açıklama:

                                     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 bayt

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

Dom Hastings'e 8 byte tasarruf etmeme yardım ettiğin için teşekkürler.


1
Hey samgak, birkaç bayttan tasarruf değişikliği yerine redo,if(int($i/=20)), kullanabileceğini biliyorsun ~~($i/=20)&&redo. ~~int'ye dönüştürür - 0|başında (veya |0sonunda) da kullanabilirsiniz . Ayrıca değiştirilmesi substr(".... ... .. . ",20-$i%5*5,5)ile (' .', ' ..','...','.'x4)[$i%5-1].$/çalışma OK görünüyor, ama tüm test durumları test etmedim ... o iş, sen 114 aşağı iseniz ... Ben başka bir şey gelirse ben size bildiririz paylaşmak için!
Dom Hastings,

1
Bir düşünmek, sadece bir tamsayıya sahip olmak ve geri kalanı yoksaymak istiyorsanız, $-her zaman bir int için kesilecek sihirli değişkeni kullanabilirsiniz ... biraz daha fazlasını kurtarabilir!
Dom Hastings,

1
@DomHastings sayesinde int dönüştürme hilesi birkaç bayt, substr'lardan kurtulmak için 4 tane daha tasarruf sağlar.
Samgak 11

1
@DomHastings gerçekten öyle, tekrar teşekkürler! Sanırım bu, dünya şakasının sonundan kurtulmam gerektiği anlamına geliyor
samgak

4

JavaScript ES6, 143 bayt

Gerektiği için eklenen bayt sayısı console.log, başka bir 23 baytı onsuz kurtarabilir.

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

Arcinde'nin isimsiz fonksiyonları kullanma önerisi sayesinde 18 byte tasarruf sağladığı,

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

Örnek

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

çıktı


Kontrol etme

Ondalık sayı 31415, taban 20'de ifade edilmiştir. Mathematica bunun için küçük harf kullanır.

BaseForm[31415, 20]

taban 20


Yukarıdaki taban 20 numarasına karşılık gelen ondalık basamak.

IntegerDigits[31415,20]

{3, 18, 10, 15}


Başka bir örnek

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]&adsız işlevler kullanarak.
Jcai

@Arcinde, Teşekkürler. İyi eski anonim fonksiyonlar.
DavidC,

3

JavaScript (ES6), 157 bayt

Yeni satırlar önemlidir ve her biri 1 bayt olarak sayılır. STDOUT'a yazdırmak gerektiğinden, console.logbana birkaç bayta mal oldu.

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

gösteri

Gösteri amacıyla tüm tarayıcılarda çalışabilmesi için bir ES5 sürümü yazacağım:

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


En son .joinparantez gerekir mi?
Downgoat


@vihan Bu hiçbir şeyi vermez, sadece geri döner.
rink.attendant.6

girdi bir fonksiyon aracılığıyla olabileceğinden bunun bir gereklilik olduğunu bilmiyordum. pastebin.com/0pS0XtJa , 3 byte daha kısadır
Downgoat

2

Python 2.x, 142 bayt:

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]

Örnek:

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

<  >

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

Düzenleme: sondaki çizgi ...


Önerecek birkaç geliştirmem var. İlk olarak, değişim [n%20==0]için [n%20<1]. İkincisi, değişim [[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]için h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]birlikte a=n%5tüm hamle, n%5dışarı s ve koşullu dönüşür *(a>0)de boş bir dize döndürür a==0aynı etki için.
Sherlock 9

Son olarak, koyun a, hve nböylece gibi, tek bir satırda: a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20. Bütün bunlar sizi 131 bayt ile bırakmalı.
Sherlock9

2

CJam, 82 76 bayt

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

İlk CJam programım, temel olarak sadece Perl cevabımın CJam'a çevirisi.

Çevrimiçi deneyin

Yorumlu çok satırlı:

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 bayt

JavaScript cevabımla aynı yaklaşım. PHP'nin her şey için yerleşik fonksiyonları vardır.

Aşağıdaki gibi görüldüğü gibi komut satırından (örneğin STDIN) 1 giriş alır $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("<  >");}

Önce en önemli sayıları yazdırmak için özyinelemeyi kullanır. Ardından ya sıfır basar ya da tüm noktaları tek bir akıllıca basar printf ve tüm beşleri bir döngü . Burada if-else kullanmaktan kaçınabileceğimden emin değilim.

Akıllı baskıların dezavantajı 1 ve 3'ün birbirine göre hizalanmamasıdır:

23 için sonuç:

  .

...

119 yanlış çözüm - takip eden yeni satır

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 bayt

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

İlk komut satırı argümanından girdi alır.

Yorumlar ve testler içeren eksiksiz kaynak kodu github'da mevcuttur .


\niki karakterdir - ancak dizgenin ortasındaki yeni satır sadece bir karakterdir.
fisharebest 11:15

1

Python 2, 114 bayt

Bu cevap Jakube'nin Pyth cevabı ve Locoluis'in Python 2 cevabı üzerine kuruludur.

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

Jöle , 50 49 47 bayt

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

Çevrimiçi deneyin!

... Şimdi user202729 noktası sayesinde hizalı bırakıldı.

Kendini düşünmeye < >soktuğun zaman bir palindrom ...


Neden doğru hizaya ...
girersiniz

@ İçin user202729 .ve ..ben bir tane koymak öylesine bir boşluk olması gerekir ...de. Daha kısa bir yol var mı?
dylnan

Bence meydan okumaya göre spec ...doğru hizalı olmamalı. Sadece değiştirmek <4için <3?
user202729

@ user202729 Haklısınız, sanırım spec'i yanlış okudum. Bunun için olduğunu sanmıyorum ... ama <2
dylnan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.