To wyzwanie jest proste. Biorąc pod uwagę liczbę, wyślij ascii-artową reprezentację liczby, korzystając z systemu liczbowego Mayan Base-20.
Co to jest system Majów?
Majowie używali bazy 20 do przechowywania liczb, więc pierwszą pozycją było 1
miejsce, następne 20
miejsce, potem 400
s itd.
Więc liczba Majów 1
jest 1
w bazie 10, ale 10
tak naprawdę jest 20
w bazie 10, 207
jest 807
w bazie 10 itd.
I przedstawiali swoje liczby jako piktogramy, ze specjalnym symbolem dla 0
.
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
To było ich zero. (przynajmniej połowa picascii połowa mojej artystyczności ascii art version)
To prawdziwy obraz majskiego symbolu zero. 1
To było ich pięć:
--------------------------------
| |
--------------------------------
I 4:
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
Wreszcie, aby złożyć to w całość:
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
Więc mają x//5
paski i x%5
kropki na górze pasków. A jeśli x=0
użyją skorupy / bochenka zamiast pustego miejsca.
Aby uzyskać więcej zdjęć, wypróbuj stronę Wikimedia Commons zdjęć z liczbą Maya .
Ale dotyczy to tylko liczb 19
. Nie możemy mieć więcej niż 4
paski i 4
kropki w jednej „historii” ... Więc idziemy w górę!
Wynik dla 20 to:
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Zauważ, że normalnie byłoby to nieprawidłowe, ponieważ ma on 1
ai 0
jednocześnie. Ale 3
(pamiętaj, że twoja odpowiedź wymaga co najmniej 3) nowych wierszy, zanim 0
oznacza nową wartość miejsca.
Dolna historia ma kropki, znaczenie 1
i słupki 5
. Ale w rzeczywistości ma znaczenie kropek 20^0
i słupków 20^0 * 5
.
Każda historia rośnie w siłę. Kropki z drugiego wątku oznaczają 20
( 20^1
) i 100
( 20^1 * 5
).
Tak więc liczbę 506
można przedstawić jako:
----
| |
| |
----
--------------------------------
| |
--------------------------------
----
| |
| |
----
--------------------------------
| |
--------------------------------
Jest (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506
.
Twoim zadaniem, jeśli zdecydujesz się nie lub nie (nie ma to znaczenia), jest uzyskanie ascii artystycznej reprezentacji liczby base-10.
Inne zasady:
- Wiodące / końcowe spacje są w porządku, o ile kropki, słupki i skorupy są nienaruszone.
- Słupki, kropki i powłoki muszą być dokładnie takie, jakie mają przypadki testowe. Bez zmiany rozmiaru.
- Wiodące „0” są w porządku. (wiodące powłoki na wyjściu)
- Nie musisz mieć dokładnie 3 nowych wierszy między każdą wartością miejsca lub historią, tylko co najmniej 3.
Przypadki testowe:
15
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
12
---- ----
| | | |
| | | |
---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
4
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
0
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
24
----
| |
| |
----
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
33
----
| |
| |
----
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
20
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
1: Użyli także głów bogów do symboli, ale do tego wyzwania zostanie użyta skrzynia ze skorupą / chlebem / zeldą .
but for this challenge the shell/bread will be used.
. Nie muszla, nie chleb. Link LOZ do poprzedniej skrzyni.Odpowiedzi:
Rubinowy,
223180177179 bajtówFunkcja anonimowa zwraca ciąg wielowierszowy.
Zapomniałem dodać trochę potrzebnych odstępów, a także rekurencji. Grałem też trochę więcej, zmieniając rzeczy.
źródło
Python 3.5,
404400392312311308290281285281 bajtów:( Podziękowania dla Adnana za wskazówkę dotyczącą oszczędzania 9 bajtów (
290->281
) i Neila za wskazówkę dotyczącą oszczędzania 4 bajtów (285->281
)! )Wypróbuj online! (Ideone)
Analiza
Do celów tej analizy użyjemy zestawu znaków
0123456789ABCDEFGHIJ
do przedstawienia każdej cyfry w bazie 20.Mogłem więc przekształcić bazę 10 w bazę 20 przy użyciu jednego z dwóch algorytmów, które posiadam. Pierwszym algorytmem, o którym pomyślałem, jest algorytm mocy . Nie tego użyłem w kodzie, ponieważ byłby o wiele dłuższy niż powinien, więc nie będę o tym mówić. Jednak stworzyłem skrypt Pythona, który konwertuje dowolną liczbę całkowitą w bazie 10 na dowolną inną bazę podaną przy użyciu tej metody, której można użyć tutaj na repl.it. Tym, którego użyłem do tego wyzwania, jest algorytm podziału , który moim zdaniem jest tutaj całkiem dobrze wyjaśniony. Ale w zasadzie dzieje się tak, że bierze podaną liczbę podstawową 10 i dzieli ją przez bazę, na którą musi przekonwertować liczbę, która w tym przypadku wynosi 20, aż reszta będzie równa 0 lub 1. Następnie bierze iloraz i resztę , w tej kolejności, od ostatniej operacji podziału, a następnie wszystkie pozostałe pozostałości z pozostałych operacji podziału w kolejności od ostatniej do pierwszej. Wszystkie te cyfry są następnie łączone razem, a ta odwrócona sekwencja połączona jest liczbą podstawową 10 w bazie 20! Aby to zilustrować, załóżmy, że chcesz przekonwertować liczbę podstawową 10
431
na bazę 20. Więc zrobilibyśmy to:Następnie, w końcu, wzięlibyśmy listę, którą mamy, która w tym przypadku zawiera
B11
, i odwróciliśmy ją, abyśmy już mieli11B
. Czyniąc to, w końcu otrzymaliśmy ostateczną odpowiedź! 431 w bazie 10 jest przekonwertowane na bazę 2011B
, co można potwierdzić za pomocą mojego skryptu Python, który korzysta z algorytmu mocy, do którego już udostępniłem link powyżej, ale zrobię to ponownie tutaj . Oto taki, który wykorzystuje również algorytm podziału opisany w tej odpowiedzi i zwraca tę samą odpowiedź, co moc.Cały ten proces jest w zasadzie to, co dzieje się w moim scenariuszu w tej
while
pętli:while not p or z:p+=[z%20];z=z//20
. Jedyną różnicą jest to, że liczby nie>9
są reprezentowane jako litery, ale jako same.Przechodząc dalej, po przekonwertowaniu numeru bazy 10 na bazę 20, dla każdej cyfry w liczbie całkowitej bazy 20, którą nazwiemy
g
,g mod 5
drukowane są kropki, a następnieg//5
paski. Następnie program drukuje 3 puste linie i przechodzi do następnej cyfry. Jeśli jednak cyfra jest0
, to drukowany jest pojedynczy „bochenek”, a następnie 3 nowe wiersze, a następnie program przechodzi do następnej cyfry. Tak więc, biorąc podstawową liczbę 2011B
, przechodzimy do pierwszej cyfry. Pierwszą cyfrą jest1
, a zatem wydrukowałby 0 słupków od1//5=0
i 1 kropkę od1%5=1
. Najpierw otrzymalibyśmy to:a następnie 3 nowe linie. Przechodząc do drugiej cyfry, widzimy również, że jest to 1, więc wyświetli to samo:
a także 3 nowe linie. Wreszcie, przechodząc do ostatniej cyfry, widzimy, że jest to
B
. PonieważB=11
w bazie 20 program wyświetli 1 kropkę od11%5=1
i 2 słupki od11//5=2
. Teraz otrzymujemy to:Wreszcie, łącząc to wszystko, otrzymujemy to:
I to jest liczba Majów dla 431! Nareszcie masz swoją podstawową liczbę 10 reprezentowaną przez podstawowe 20 liczb Majów.
Uwaga: Być może zauważyłeś tę
lambda
funkcję w moim kodzie. Niezależnie od tego, funkcja ta jest używana do tworzenia kropek, ponieważ wiele kropek musi być wyprowadzonych obok siebie.źródło
S,N,M,X=' -|\n'
zamiastS,N,M,X=' ','-','|','\n'
?401
zawiera wewnętrzne zero.Python 3, 243 bajty
Dyskusja
n//20and m(n//20)
dzwonim()
rekurencyjnie, jeśli trzeba obsłużyć wyższe uprawnienia o wartości 20. Rekurencja jest wykonywana przed wydrukowaniem bieżącej wartości miejsca, aby najpierw wydrukować wyższe moce.Jeśli bieżąca wartość miejsca jest różna od zera (r! = 0), symbol
for a,b,f
opcja -loop drukuje jednostki, a następnie piątki.a
jest pierwszym / czwartym rzędem ib
jest drugim / trzecim rzędem. Sztuką jestprint(*((a,b,b,a)*f),sep=x)
. Dla jednostek f = 1 powodujeprint(*(a,b,b,a),sep=x)
, że wypisuje 4 rzędy, które składają się na symbole jednostek (x jest „\ n”). W przypadku piątek f = liczba piątek do wydrukowania (r // 5), więc krotka (a, b, b, a) zostaje pomnożona (tj. Powtórzona) przez liczbę piątek do wydrukowania. Jeśli f = 2, otrzymujemyprint(*(a,b,b,a,a,b,b,a),sep=x)
, który wypisuje dwa symbole na pięć.Jeśli bieżąca wartość miejsca wynosi 0, to drukowany jest symbol zero.
źródło
Python, 411 bajtów
Stworzyłem to do generowania przypadków testowych, możesz użyć go jako wzorca. Trochę golfa.
źródło
s=math.sqrt
i dzwoniącs(s(w))
zamiastmath.sqrt(math.sqrt(w))
w**0.25
Jest jeszcze lepszy niżs(s(w))
. Chociaż stało się dłużej?JavaScript (ES6), 254 bajty
źródło
Missing } in template expression
. Nie wiem bardzo dużo js, jak mogę to naprawić?Python 3, 213 bajtów
Wymyślili jeszcze krótszą wersję, stosując inne podejście:
wyjaśnienie
Około pierwszych 9 wierszy tworzy ciągi, które są używane do tworzenia symboli
Rdzeniem rozwiązania jest funkcja rekurencyjna
m
, która buduje listę ciągów, po jednym dla każdego wiersza wyniku. Schematyczniem
wygląda następująco:m
można przepisać jak:Wywołanie rekurencyjne
m(n//20)
jest na pierwszym miejscu, tak że najbardziej znaczące cyfry są wykonywane jako pierwsze.[n%5*a,n%5*b,n%5*b,n%5*a]
są ciągiem symboli.a
to górny wiersz dla pojedynczego symbolu.n%5
to liczba jeden symboli dla tej cyfry. Jest więcn%5*a
ciągiem dla górnego (i dolnego) rzędun%5
jednych. Podobnie „n% 5 * b” jest łańcuchem dla drugiego (i trzeciego) wiersza.Wyrażenie
[:n%5*4]
działa jakif
aby uniknąć dodatkowych pustych linii na wyjściu, jeśli nie ma żadnych „jednych” do wyjścia. Nie jest to konieczne, ale poprawia wygląd.n%20//5
oznacza liczbę potrzebnych pięciu symboli.[c,d,d,c]
to ciągi znaków, które tworzą jeden symbol na pięć.[t,w,w,v+h*19+v,y,y,t]
to ciągi znaków, które tworzą symbol zerowy[x,x]
umieszcza co najmniej trzy puste linie między grupami cyfr Majówźródło