Pyth, 49 48 46 44 Bytes
_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_
Probieren Sie es hier aus.
Wir arbeiten immer noch daran, die Funktion zum Generieren des Alphabets zu verkürzen ... und ja, der Generator ist länger als das Hardcodieren des Alphabets um 4 Zeichen, jedoch nicht in Bytes.
_s.b@+kNsYc3[...]_
_ get input (implicit) and reverse
[...] generate "ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ" (see below)
c3 split into 3 equal chunks
.b map over each input digit (as Y) and chunk (as N)...
+kN prepend empty string to N (to support digits of 0)
@ sY get the Yth element of the empty-string-plus-digits array
s concatenate all the digits
_ reverse again to put digits back in the right order
So funktioniert die Funktion zum Generieren von Alphabeten. Nehmen wir alle Codepunkte und subtrahieren 913 (der kleinste Wert):
0 1 2 3 4 75 5 6 7 8 9 10 11 12 13 14 15 71 16 18 19 20 21 22 23 24 79
Ziehen wir nun diejenigen heraus, die nicht zum Muster passen:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
75 71 79
Okay, die Strategie formt sich also: Generieren Sie den Bereich 0 bis 24 (wir werden uns später mit den fehlenden 17 befassen) und fügen Sie dann 75, 71 und 79 an den richtigen Stellen ein.
Wie können wir die Ausreißer einfügen? Pyth hat eine .i
Nterleave-Funktion, die ex nimmt. [1,2,3]
und [4,5,6]
und führt zu [1,4,2,5,3,6]
. Wir müssen jedoch einige Platzhalter hinzufügen, da die Ausreißer offensichtlich weit voneinander entfernt sind. Stellen wir den Platzhalter mit X dar:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
X X X X 75 X X X X X X X X X X 71 X X X X X X X 79
Richtig, das untere Ausreißer-Array beginnt also mit vier X
s. Können wir die Ausreißer so gruppieren, dass jeweils vier X
Sekunden vorangestellt sind, und sehen, was noch übrig ist?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75 X X X X X X [ four X ]71 X X X [ four X ]79
Jetzt machen wir noch eine wichtige Bemerkung: Da 79 ganz am Ende steht , kann eine beliebige Anzahl von X
s davor stehen und eine beliebige Anzahl von X
s, die ihm folgen! Dies liegt daran, dass Interleaving [1,2,3]
und [4,5,6,7,8,9]
Ergebnisse dazu [1,4,2,5,3,6,7,8,9]
führen, dass die zusätzlichen Elemente im zweiten Array am Ende enden. Da sie ohnehin entfernt werden, können wir dies sicher zulassen.
Das heißt, wir können dies so normalisieren, dass jedem Ausreißer vier Sekunden vorausgehen X
und 6 folgen:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75[ six X ] [ four X ]71[ six X ] [four X]79[six X]
Großartig! Jetzt können wir einfach das Array nehmen [75, 71, 79]
, vier Platzhalterwerte vor jedem Element und sechs nach jedem Element einfügen und es dann mit dem Bereich verschachteln 0..24
.
Aber warte, was ist passiert 17
? Denken Sie daran, dass in all diesen Beispielen die oberste Zeile 17 fehlt. Wir können die 17 nach dem Verschachteln einfach entfernen. aber dies lässt eine andere herrlich böse Möglichkeit offen. Sie haben es erraten - der Platzhalterwert, auf den wir uns bezogen haben, X
wird 17. Dies ermöglicht es uns, sowohl die fremden 17 als auch alle Platzhalterwerte auf einen Schlag zu entfernen.
Schließlich! Hier ist der Code, mit dem dies implementiert wird:
mC+913d-.iU25smXm17hT4Cd"KGO"17
m "KGO" for each char in the string "KGO"...
Cd take its ASCII value ("KGO" -> 75,71,79)
m17hT generate an 11-element array filled with 17
X 4 replace the 5th element with the ASCII value ^^
s concatenate all of these together
.iU25 interleave with range(25)
- 17 remove all the 17s
m d for each value in the resulting array...
+913 add 913 (to get the real character value)
C convert to character