Napisz program lub funkcję, która podając dodatnią liczbę całkowitą jako dane wejściowe, wyświetla reprezentację tej liczby całkowitej w liczbach Maya .
Cyfry Majów
Cyfry Majów to system wigezymalny (podstawa 20), który wykorzystuje tylko 3 symbole:
< >
for Zero (poprawny symbol to rodzaj powłoki, której nie można łatwo przedstawić za pomocą ASCII)..
dla jednego----
za pięć
Liczby są zapisywane pionowo w potęgach 20, a liczby od 0 do 19 są zapisywane jako stosy piątek i jedności . Więcej informacji można znaleźć w artykule w Wikipedii .
Jako przykład podajemy liczby od 0 do 25, oddzielone przecinkami:
. .. ... ....
. .. ... .... ---- ---- ---- ---- ---- . . . . . .
. .. ... .... ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
< >, . , .. ,... ,....,----,----,----,----,----,----,----,----,----,----,----,----,----,----,----,< >, . , .. ,... ,....,----
Wejścia
- Wejściami są zawsze dodatnie liczby całkowite z zakresu od 0 do 2147483647 (2 ^ 31 - 1).
- Możesz wziąć dane wejściowe ze STDIN, jako argument wiersza poleceń, parametr funkcji lub coś podobnego.
Wyjścia
- Każda linia ma maksymalnie 4 znaki.
< >
i----
zawsze powinien być wydrukowany zgodnie z podanym tutaj (każdy po 4 znaki). - Ones (
.
) musi być wyśrodkowany na linii. Jeśli jest 1 lub 3.
, ponieważ idealne wyrównanie w poziomie jest niemożliwe, nie ma znaczenia, czy są to jedna kolumna po lewej, czy jedna kolumna po prawej, czy środek. Musi być dokładnie jedna pusta linia między różnymi mocami 20, niezależnie od wysokości stosów w sile 20s. Na przykład poprawne dane wyjściowe dla 25 i 30 to:
. . ---- ---- ----
Niedozwolone są linie wiodące i końcowe.
Wyjścia muszą być wydrukowane dokładnie tak, jak w podanych przykładach.
Przypadki testowe
Każda indywidualna liczba od 0 do 25 podana jako przykład powyżej.
Wkład:
42
Wydajność:
..
..
- Wkład:
8000
Wydajność:
.
< >
< >
< >
- Wkład:
8080
Wydajność:
.
< >
....
< >
- wkład:
123456789
Wydajność:
.
...
----
----
----
.
----
----
..
----
----
.
....
----
----
----
....
----
- Wkład:
31415
Wydajność:
...
...
----
----
----
----
----
----
----
----
- Wkład:
2147483647
Wydajność:
.
...
----
----
.
----
----
.
----
----
----
....
----
..
..
----
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
źródło
Odpowiedzi:
Pyth, 41 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
Perl,
125117 bajtówDzięki Dom Hastings za pomoc w oszczędzeniu 8 bajtów.
źródło
redo,if(int($i/=20))
możesz użyć~~($i/=20)&&redo
.~~
konwertuje na int - możesz także użyć0|
na początku (lub|0
na końcu). Zastępując równieżsubstr(".... ... .. . ",20-$i%5*5,5)
z(' .', ' ..','...','.'x4)[$i%5-1].$/
wydaje się OK działać, ale nie testowałem wszystkie przypadki testowe ... Jeśli te prace, jesteś w dół do 114 ... Jeśli myślę o niczym innym dzielić dam Ci znać!$-
która zawsze zostanie obcięta do int ... może zaoszczędzić jeszcze kilka!JavaScript ES6, 143 bajty
Mnóstwo bajtów dodane, ponieważ trzeba
console.log
, może zaoszczędzić kolejne 23 bajty bez niego.źródło
Mathematica
185 182 171153Po zapisaniu 18 bajtów dzięki sugestii Arcinde do korzystania z anonimowych funkcji,
Przykład
Kontrola
Liczba dziesiętna 31415 wyrażona w podstawie 20. Mathematica stosuje do tego małe litery.
Cyfry dziesiętne odpowiadające powyższej podstawowej liczbie 20.
Inny przykład
źródło
c=Column;c[If[#>0,{q,r}=#~QuotientRemainder~5;c@{{""," ."," .."," ...","...."}[[r+1]],c@{{""},{d="----"},{d,d},{d,d,d}}[[q+1]]},"< >"]&/@#~IntegerDigits~20]&
za pomocą anonimowych funkcji.JavaScript (ES6), 157 bajtów
Nowe znaki są znaczące i są liczone jako 1 bajt. Ponieważ wymagane jest drukowanie do STDOUT,
console.log
kosztuje mnie tam kilka bajtów.Próbny
Dla celów demonstracyjnych napiszę wersję ES5, która działa we wszystkich przeglądarkach:
źródło
.join
potrzebuje nawiasu?Python 2.x, 142 bajty:
Przykład:
Edycja: linia końcowa ...
źródło
[n%20==0]
na[n%20<1]
. Po drugie, zmiana[[""," "*(2-n%5/2)+"."*(n%5)+"\n"][n%5!=0]
doh=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1]
za=n%5
, który porusza wszystkien%5
s, i zmienia warunkowy do*(a>0)
którego zwraca pusty ciąg naa==0
uzyskanie tego samego efektu.a
,h
in
na jednej linii, tak jak poniżej:a=n%5;h=[(" "*(2-a/2)+"."*a+"\n")*(a>0)+"----\n"*(n%20/5),"< >\n"][n%20<1];n/=20
. Wszystko to powinno dać ci 131 bajtów.CJam,
8276 bajtówMój pierwszy program CJam, w zasadzie tylko transliteracja mojej odpowiedzi Perla na CJam.
Wypróbuj online
Wielowierszowy z komentarzami:
źródło
PHP, 220 bajtów
Takie samo podejście jak moja odpowiedź JavaScript. PHP ma wbudowane funkcje do wszystkiego.
Pobiera 1 dane wejściowe z wiersza poleceń (tj. STDIN), jak widać przy
$argv[1]
:źródło
C - 149
Używa rekurencji, aby najpierw wydrukować najbardziej znaczące liczby. Następnie drukuje zero lub drukuje wszystkie kropki za pomocą jednego sprytnego
printf
i wszystkich piątki w pętli. Nie jestem pewien, czy mogę uniknąć używania if-else tutaj.Minusem sprytnego printf jest to, że 1 i 3 nie są do siebie wyrównane:
Wynik dla 23 to:
119nieprawidłowe rozwiązanie - końcowy znak nowej liniiźródło
PHP,
202192 bajtówPobiera dane wejściowe z pierwszego argumentu wiersza poleceń.
Pełny kod źródłowy wraz z komentarzami i testami jest dostępny na github .
źródło
\n
ma dwa znaki - ale nowa linia w środku ciągu to tylko jeden.Python 2, 114 bajtów
Ta odpowiedź jest oparta na odpowiedzi Pythona Jakube'a i odpowiedzi Locoluis na Python 2.
źródło
Galaretka ,
504947 bajtówWypróbuj online!
...
jest teraz wyrównany do lewej dzięki punktowi user202729.Kiedy oszukujesz się, myślenie
< >
jest palindromem ...źródło
...
....
i..
musi być spacja, więc ja też postawiłem...
. Czy istnieje krótsza droga?...
nie powinna być wyrównana do prawej. Po prostu zmień<4
na<3
?