J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Ejemplos:
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's'
tuvwxyzabcdefghijklmn opqr
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 's.'
t
u
v
w
x
y
z
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0 '['
Esta solución evolucionó en el foro de programación J: http://jsoftware.com/pipermail/programming/2012-Austust/029072.html
Autores: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Explicación
Las frases J se ejecutan comenzando por la derecha, pasando el resultado continuo hacia la izquierda a medida que se evalúa. Como es interactivo, podemos ver partes de la solución de forma aislada para comprenderlas mejor.
La parte central genera el alfabeto en mayúsculas y minúsculas en Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
El verbo "u:" convierte su argumento numérico a la derecha en caracteres Unicode. El argumento numérico se genera a partir de los valores ASCII para los caracteres en mayúscula y minúscula agregando los números para "A" y "a" cada uno a los valores del 0 al 25 generados por "i.26":
65 97+/i.26
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
La porción de la derecha,
((>:@i.}.[)])"0
busca (i.) la posición del argumento derecho (]) en la izquierda ([), que es el vector de letras arriba) y suelta (}.) uno más (>:) que ese número. El "" 0 "aplica esta frase a los argumentos de 0 dimensiones (escalares).
('123H999' (>:@i.}.[)])"0 'H'
999
La frase "25 {." Toma los primeros 25 elementos del vector a la derecha.
La penúltima frase "1j1 #" de la izquierda replica su argumento de la derecha según el número de la izquierda. Un número simple hace una replicación simple:
2 # 'ABCD'
AABBCCDD
Sin embargo, un número complejo, indicado por la "j" entre las porciones real e imaginaria, inserta un elemento de relleno de acuerdo con la parte imaginaria. Aquí indicamos un elemento de relleno por el que está a la derecha de la "j".
2j1 # 'ABCD'
AA BB CC DD
Como con la mayoría de las primitivas J, el verbo replicado (#) funciona en matrices numéricas de forma análoga a cómo funciona en matrices de caracteres. Como se muestra aquí,
1j1 # 1 2 3
1 0 2 0 3 0
vemos que el elemento de relleno numérico predeterminado es cero, mientras que para los caracteres es el carácter de espacio.
Finalmente, el token más a la izquierda "|:" transpone el resultado de los verbos anteriores a su derecha.
Explicación proporcionada por Devon McCormick. Gracias Devon