Diese Herausforderung ist einfach. Geben Sie bei einer gegebenen Zahl eine ASCII-Darstellung der Zahl unter Verwendung des Maya-Base-20-Zahlensystems aus.
Was ist das Maya-System?
Die Mayas benutzten die Basis 20, um Zahlen zu speichern, also war die erste Position die 1
s-Stelle, die nächste die 20
s-Stelle, dann die 400
s usw.
So Maya-Nummer 1
ist 1
in der Basis 10, sondern 10
ist tatsächlich 20
in der Basis 10, 207
ist 807
in der Basis 10, etc ..
Und sie stellten ihre Zahlen als Piktogramme dar, mit einem speziellen Symbol für 0
.
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Das war ihre Null. (mindestens die Hälfte Picascii Hälfte meiner künstlerischen Fähigkeiten ASCII Art Version)
Das ist ein echtes Bild des Maya-Null-Symbols. 1
Das waren ihre fünf:
--------------------------------
| |
--------------------------------
Und eine 4:
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
Zum Schluss, um es zusammenzustellen:
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
Sie haben x//5
Balken und x%5
Punkte auf den Balken. Und wenn x=0
, verwenden sie die Schale / das Brot anstelle eines Leerzeichens.
Weitere Bilder finden Sie auf der Wikimedia Commons-Seite mit Bildern von Maya-Nummern .
Dies gilt jedoch nur für Zahlen bis zu 19
. Wir dürfen nicht mehr als 4
Balken und 4
Punkte in einer einzigen "Geschichte" haben ... Also steigen wir auf!
Die Ausgabe für 20 ist:
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
Beachten Sie, dass dies normalerweise ungültig ist, da a 1
und a 0
gleichzeitig vorhanden sind. Aber die 3
(beachten Sie, dass Ihre Antwort mindestens 3) Zeilenumbrüche vor dem 0
Mittelwert einen neuen Stellenwert benötigt.
Die unterste Geschichte hat Punkte, Bedeutung 1
und Balkenbedeutung 5
. Aber es hat tatsächlich Punktbedeutung 20^0
und Balkenbedeutung 20^0 * 5
.
Jede Geschichte geht eine Macht auf. Die Punkte der zweiten Geschichte bedeuten 20
( 20^1
) und 100
( 20^1 * 5
).
Die Nummer 506
kann also wie folgt dargestellt werden:
----
| |
| |
----
--------------------------------
| |
--------------------------------
----
| |
| |
----
--------------------------------
| |
--------------------------------
Das ist (20^0) * 1 + (20^0 * 5) * 1 + (20^1 * 5) * 1 + (20^2) * 1 = 1 + 5 + 100 + 400 = 506
.
Ihre Mission ist es, eine ASCII-Kunst-Darstellung der Basis-10-Zahl auszugeben, falls Sie sich nicht entscheiden oder entscheiden (es spielt keine Rolle).
Andere Regeln:
- Führende / nachfolgende Leerzeichen sind in Ordnung, solange die Punkte, Balken und Muscheln intakt sind.
- Die Balken, Punkte und Muscheln müssen genau den Testfällen entsprechen. Keine Größenänderung.
- Führende Nullen sind in Ordnung. (führende Muscheln am Ausgang)
- Sie müssen nicht genau 3 Zeilenumbrüche zwischen jedem Platzwert oder jeder Geschichte setzen, sondern nur mindestens 3.
Testfälle:
15
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
12
---- ----
| | | |
| | | |
---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
4
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
0
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
24
----
| |
| |
----
---- ---- ---- ----
| | | | | | | |
| | | | | | | |
---- ---- ---- ----
33
----
| |
| |
----
---- ---- ----
| | | | | |
| | | | | |
---- ---- ----
--------------------------------
| |
--------------------------------
--------------------------------
| |
--------------------------------
20
----
| |
| |
----
-------------------
| | | | |
| | | | |
|-------------------|
| |
| |
-------------------
1: Sie haben auch die Köpfe der Götter für die Symbole verwendet, aber für diese Herausforderung wird die Muschel- / Brot- / Zelda-Truhe verwendet.
but for this challenge the shell/bread will be used.
. Keine Muschel, kein Brot. LOZ Link zur letzten Truhe.Antworten:
Ruby,
223180177179 BytesAnonyme Funktion, gibt eine mehrzeilige Zeichenfolge zurück.
Ich habe vergessen, einen zusätzlichen Abstand hinzuzufügen, der benötigt wurde, und auch die Rekursion. Auch ein bisschen mehr golfen, indem man Dinge umstellt.
quelle
Python 3.5,
404400392312311308290281285281 Byte:( Danke an Adnan für einen Tipp zum Sparen von 9 Bytes (
290->281
) und Neil für einen Tipp zum Sparen von 4 Bytes (285->281
)! )Probieren Sie es online! (Ideone)
Analyse
Für die Zwecke dieser Analyse verwenden wir den Zeichensatz
0123456789ABCDEFGHIJ
, um jede Ziffer in Basis 20 darzustellen.Also hätte ich die Basis 10 mit einem von zwei Algorithmen, die ich habe, in die Basis 20 konvertieren können. Der erste Algorithmus, den ich verwenden wollte, ist der sogenannte Potenzalgorithmus . Dies ist jedoch nicht der, den ich im Code verwendet habe, da es viel länger gedauert hätte, als es hätte sein sollen. Ich werde daher nicht über diesen Code sprechen. Ich habe jedoch ein Python-Skript erstellt, das eine beliebige Ganzzahl in Basis 10 in eine beliebige andere Basis konvertiert, die mit dieser Methode bereitgestellt wird. Diese Methode können Sie hier in repl.it verwenden. Derjenige, den ich stattdessen für diese Herausforderung verwendet habe, ist der sogenannte Divisionsalgorithmus , was ich denke , ist ziemlich gut erklärt hier. Grundsätzlich passiert jedoch, dass die angegebene Zahl der Basis 10 durch die Basis dividiert wird, in die die Zahl konvertiert werden muss, in diesem Fall 20, bis der Rest entweder 0 oder 1 ist. Anschließend werden Quotient und Rest berechnet in dieser Reihenfolge von der letzten Divisionsoperation und dann alle anderen Reste von den anderen Divisionsoperationen in der Reihenfolge von der letzten zur ersten. Alle diese Ziffern werden dann zusammengefügt, und diese zusammengefügte Sequenz ist in umgekehrter Reihenfolge Ihre Basis-10-Nummer in Basis 20! Um dies zu veranschaulichen, nehmen wir an, dass Sie die Zahl der Basis 10 in die Zahl
431
der Basis 20 konvertieren möchten.Dann nehmen wir endlich die Liste, die wir haben
B11
, und kehren sie um, so dass wir sie jetzt haben11B
. Damit haben wir endlich unsere endgültige Antwort! 431 in Basis 10 konvertiert in Basis 2011B
, was mit meinem Python-Skript bestätigt werden kann, das den Potenzalgorithmus verwendet, zu dem ich bereits einen Link oben geteilt habe, aber ich werde es hier noch einmal tun . Hier ist einer, der auch den in dieser Antwort beschriebenen Divisionsalgorithmus verwendet und dieselbe Antwort wie der Potenzalgorithmus zurückgibt.Dieser gesamte Prozess ist im Wesentlichen , was in diesem in meinem Skript geschieht
while
Schleife:while not p or z:p+=[z%20];z=z//20
. Der einzige Unterschied ist, dass>9
es keine Zahlen gibt als Buchstaben dargestellt , sondern als selbst.Nachdem die Zahl der Basis 10 in die Zahl der Basis 20 konvertiert wurde, werden für jede Ziffer in der Ganzzahl der Basis 20, die wir nennen werden
g
,g mod 5
Punkte ausgedruckt und danng//5
Balken ausgedruckt. Anschließend druckt das Programm 3 Leerzeilen und geht zur nächsten Ziffer über. Wenn es sich jedoch um eine Ziffer handelt0
, wird ein einzelnes "Brot" gefolgt von drei neuen Zeilen ausgedruckt, und das Programm wechselt zur nächsten Ziffer. Nehmen11B
wir also die Zahl der Basis 20 , dann gehen wir zur ersten Ziffer. Die erste Ziffer ist1
, und daher würde es 0 Balken seit1//5=0
und 1 Punkt seit drucken1%5=1
. Also würden wir zuerst Folgendes bekommen:und dann 3 neue Zeilen. Wenn wir zur zweiten Ziffer übergehen, sehen wir auch, dass sie 1 ist, also würde sie dasselbe ausgeben:
und auch 3 neue Zeilen. Wenn wir schließlich zur letzten Ziffer übergehen, sehen wir, dass es eine ist
B
. DaB=11
in Basis 20 würde das Programm 1 Punkt seit11%5=1
und 2 Balken seit ausgeben11//5=2
. So, jetzt bekommen wir das:Wenn wir all dies zusammenfassen, erhalten wir Folgendes:
Und das ist die Mayaziffer für 431! Sie haben schließlich Ihre Zahl zur Basis 10 in Zahlen zur Basis 20 der Maya dargestellt.
Hinweis: Möglicherweise haben Sie diese
lambda
Funktion in meinem Code bemerkt oder nicht . Unabhängig davon wird diese Funktion zur Erzeugung der Punkte verwendet, da mehrere Punkte nebeneinander ausgegeben werden müssen.quelle
S,N,M,X=' -|\n'
stattdessen tunS,N,M,X=' ','-','|','\n'
?401
enthält eine innere Null.Python 3, 243 Bytes
Diskussion
n//20and m(n//20)
ruftm()
rekursiv auf, wenn höhere Potenzen von 20 zu behandeln sind. Die Rekursion erfolgt vor dem Drucken des aktuellen Stellenwerts, sodass höhere Potenzen zuerst gedruckt werden.Wenn der aktuelle Stellenwert ungleich Null ist (r! = 0),
for a,b,f
druckt die Schleife die Einheiten und dann die Fünfer.a
ist die erste / vierte Reihe undb
ist die zweite / dritte Reihe. Der Trick liegt in derprint(*((a,b,b,a)*f),sep=x)
. Für die Einheiten ergibt sich f = 1print(*(a,b,b,a),sep=x)
, wodurch die 4 Zeilen gedruckt werden, aus denen die Einheitensymbole bestehen (x ist ein '\ n'). Für die Fünfer ist f = die Anzahl der zu druckenden Fünfer (r // 5), sodass das Tupel (a, b, b, a) mit der Anzahl der zu druckenden Fünfer multipliziert (dh wiederholt) wird. Wenn f = 2, erhalten wirprint(*(a,b,b,a,a,b,b,a),sep=x)
, was zwei Symbole für fünf druckt.Wenn der aktuelle Stellenwert 0 ist, wird das Nullsymbol gedruckt.
quelle
Python, 411 Bytes
Ich habe dies erstellt, um Testfälle zu generieren. Sie können es als Benchmark verwenden. Sorta spielte Golf.
quelle
s=math.sqrt
und ans(s(w))
Stelle vonmath.sqrt(math.sqrt(w))
w**0.25
ist noch besser alss(s(w))
. Obwohl es länger wurde?JavaScript (ES6), 254 Byte
quelle
Missing } in template expression
. Ich weiß nicht sehr viel, wie kann ich das beheben?Python 3, 213 Bytes
Fand eine noch kürzere Version mit einem anderen Ansatz:
Erläuterung
Die ersten 9 Zeilen bilden Zeichenfolgen, aus denen die Symbole bestehen
Der Kern der Lösung ist die rekursive Funktion
m
, die eine Liste von Zeichenfolgen erstellt, eine Zeichenfolge für jede Zeile in der Ausgabe. Schematischm
sieht es so aus:m
kann wie folgt umgeschrieben werden:Der rekursive Aufruf
m(n//20)
steht an erster Stelle, sodass die wichtigsten Ziffern zuerst eingegeben werden.[n%5*a,n%5*b,n%5*b,n%5*a]
sind die Zeichenfolge für die Symbole.a
ist die oberste Zeile für ein einzelnes Symbol.n%5
ist die Nummer von einem Symbol für diese Ziffer. Istn%5*a
also eine Zeichenfolge für die oberste (und unterste) Reihe vonn%5
Einsen. In ähnlicher Weise ist "n% 5 * b" eine Zeichenfolge für die zweite (und dritte) Zeile.Der Ausdruck
[:n%5*4]
verhält sich wie einif
, um zusätzliche Leerzeilen in der Ausgabe zu vermeiden, wenn keine 'Einsen' ausgegeben werden sollen. Es wird nicht benötigt, sorgt aber dafür, dass die Ausgabe besser aussieht.n%20//5
ist die Anzahl der Symbole für fünf, die benötigt werden.[c,d,d,c]
sind die Zeichenketten, um ein Symbol für fünf zu bilden.[t,w,w,v+h*19+v,y,y,t]
sind die Zeichenketten für das Null-Symbol[x,x]
Fügt mindestens drei Leerzeilen zwischen Gruppen von Maya-Ziffern einquelle