J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Exemplos:
|: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 solução evoluiu no fórum de programação J: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Autores: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Explicação
As frases J são executadas começando à direita, passando o resultado contínuo para a esquerda à medida que é avaliado. Como é interativo, podemos analisar partes da solução isoladamente para entendê-las melhor.
A parte do meio gera o alfabeto maiúsculo e minúsculo em Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
O verbo "u:" converte seu argumento numérico à direita em caracteres Unicode. O argumento numérico é gerado a partir dos valores ASCII para os caracteres maiúsculos e minúsculos, adicionando os números de "A" e "a" cada aos valores de 0 a 25 gerados 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
A parte direita,
((>:@i.}.[)])"0
procura (i.) a posição do argumento certo (]) à esquerda ([) - que é o vetor de letras acima - e descarta (}.) mais um (>:) que esse número. O '"0' aplica essa frase aos argumentos dimensionais 0 (escalares).
('123H999' (>:@i.}.[)])"0 'H'
999
A frase "25 {." Pega os primeiros 25 elementos do vetor à direita.
A penúltima frase "1j1 #" à esquerda replica seu argumento à direita de acordo com o número à esquerda. Um número simples faz uma replicação simples:
2 # 'ABCD'
AABBCCDD
No entanto, um número complexo - indicado pelo "j" entre as partes real e imaginária - insere um elemento de preenchimento de acordo com a parte imaginária. Aqui, indicamos um elemento de preenchimento pelo lado direito do "j".
2j1 # 'ABCD'
AA BB CC DD
Como na maioria das primitivas J, o verbo replicado (#) funciona em matrizes numéricas de maneira análoga à maneira como funciona nas matrizes de caracteres. Como mostrado aqui,
1j1 # 1 2 3
1 0 2 0 3 0
vemos que o elemento de preenchimento numérico padrão é zero, enquanto que para caracteres é o caractere de espaço.
Por fim, o token mais à esquerda "|:" transpõe o resultado dos verbos anteriores para a direita.
Explicação fornecida por Devon McCormick. Obrigado Devon.