Pyth, 49 48 46 44 bytes
_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_
Pruébalo aquí
Todavía estoy trabajando en acortar la función para generar el alfabeto ... y sí, el generador es más largo que codificar el alfabeto en 4 caracteres, pero no en 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
Así es como funciona la función generadora de alfabeto. Tomemos todos los puntos de código y restemos 913 (el valor más pequeño):
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
Ahora saquemos los que no se ajustan al patrón:
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
Bien, entonces la estrategia se está formando: genere el rango de 0 a 24 (trataremos con los 17 que faltan más tarde), y luego inserte 75, 71 y 79 en las ubicaciones correctas.
¿Cómo podemos insertar los valores atípicos? Pyth tiene una .i
función nterleave que toma ex. [1,2,3]
yy [4,5,6]
resultados en [1,4,2,5,3,6]
. Sin embargo, tendremos que agregar algunos marcadores de posición, ya que obviamente los valores atípicos están muy separados. Representemos el marcador de posición con X:
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
Correcto, entonces la matriz de valores atípicos inferiores comienza con cuatro X
s. ¿Podemos agrupar los valores atípicos para que cada uno sea precedido por cuatro X
sy ver qué queda?
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
Ahora hacemos otra observación clave: dado que 79 viene al final , puede haber cualquier número de X
s que lo preceden, ¡y cualquier número de X
s que lo sigan también! Esto se debe a que el entrelazado [1,2,3]
y[4,5,6,7,8,9]
da resultado: [1,4,2,5,3,6,7,8,9]
tenga en cuenta que los elementos adicionales en la segunda matriz terminan en el extremo, y dado que se eliminarán de todos modos, podemos permitirlo de manera segura.
Eso significa que podemos normalizar esto de modo que cada valor atípico esté precedido por cuatro X
sy tenga éxito por 6:
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]
¡Excelente! Ahora podemos simplemente tomar la matriz[75, 71, 79]
, insertar cuatro valores de marcador de posición antes de cada elemento y seis después, y luego intercalarlo con el rango 0..24
.
Pero espera, ¿qué pasó con 17
? Recuerde, la línea superior en todos estos ejemplos ha faltado 17. Simplemente podemos eliminar el 17 después de intercalar; pero esto deja abierta otra posibilidad deliciosamente malvada. Lo has adivinado: el valor de marcador de posición al que nos hemos referido X
será 17. Esto nos permite eliminar tanto el 17 extraño como todos los valores de marcador de posición de una sola vez.
¡Finalmente! Aquí está el código utilizado para implementar esto:
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