Pitão, 49 48 46 44 bytes
_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_
Experimente aqui.
Ainda trabalhando para reduzir a função para gerar o alfabeto ... e sim, o gerador é mais do que codificado em 4 caracteres, mas não em 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
Veja como a função de geração de alfabeto funciona. Vamos pegar todos os pontos de código e subtrair 913 (o menor valor):
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
Agora vamos escolher os que não se encaixam no padrão:
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
Ok, então a estratégia está se formando: gere o intervalo de 0 a 24 (trataremos dos 17 que faltam mais tarde) e insira 75, 71 e 79 nos locais corretos.
Como podemos inserir os valores discrepantes? Pyth tem uma .i
função nterleave que leva ex. [1,2,3]
ee [4,5,6]
resulta em [1,4,2,5,3,6]
. No entanto, teremos que adicionar alguns espaços reservados, já que obviamente os discrepantes estão distantes. Vamos representar o espaço reservado com 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
Certo, então a matriz inferior discrepante começa com quatro X
s. Podemos agrupar os outliers para cada um deles sendo precedido por quatro se X
ver o que resta?
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
Agora, fazemos outra observação importante: desde que o 79 chega ao fim , pode haver qualquer número de X
s precedendo-o e qualquer número de X
s seguindo-o também! Isso ocorre porque a intercalação [1,2,3]
e [4,5,6,7,8,9]
resulta em[1,4,2,5,3,6,7,8,9]
note que os elementos extras na segunda matriz terminam no final e, como serão removidos de qualquer maneira, podemos permitir isso com segurança.
Isso significa que podemos normalizar isso de modo que todos os valores extremos sejam precedidos por quatro se X
sucedidos 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]
Ótimo! Agora podemos simplesmente pegar a matriz [75, 71, 79]
, inserir quatro valores de espaço reservado antes de cada elemento e seis depois e, em seguida, intercalá-la com o intervalo 0..24
.
Mas espere, o que aconteceu 17
? Lembre-se de que a linha principal de todos esses exemplos está faltando 17. Podemos simplesmente remover os 17 após a intercalação; mas isso deixa em aberto outra possibilidade deliciosamente maligna. Você adivinhou: o valor do espaço reservado ao qual nos referimos X
será 17. Isso nos permite remover os 17 valores externos e todos os valores do espaço reservado de uma só vez.
Finalmente! Aqui está o código usado para implementar isso:
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