J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Esempi:
|: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 '['
Questa soluzione si è evoluta sul forum di programmazione J: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Autori: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Spiegazione
Le frasi J vengono eseguite a partire da destra, passando il risultato in corso a sinistra mentre viene valutato. Dal momento che è interattivo, possiamo esaminare i pezzi della soluzione in modo isolato per comprenderli meglio.
La parte centrale genera l'alfabeto maiuscolo e minuscolo in Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Il verbo "u:" converte il suo argomento numerico destro in caratteri Unicode. L'argomento numerico viene generato dai valori ASCII per i caratteri maiuscoli e minuscoli aggiungendo i numeri per "A" e "a" ciascuno ai valori da 0 a 25 generati da "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 parte di destra,
((>:@i.}.[)])"0
cerca (i.) la posizione dell'argomento destro (]) a sinistra ([) - che è il vettore di lettere sopra - e ne rilascia uno (}.) uno in più (>:) di quel numero. Lo "" 0 "applica questa frase agli argomenti 0 (dimensionali).
('123H999' (>:@i.}.[)])"0 'H'
999
La frase "25 {." Prende i primi 25 elementi del vettore a destra.
La penultima frase "1j1 #" a sinistra replica il suo argomento a destra in base al numero a sinistra. Un numero semplice esegue una replica semplice:
2 # 'ABCD'
AABBCCDD
Tuttavia, un numero complesso - indicato dalla "j" tra le porzioni reali e immaginarie - inserisce un elemento di riempimento in base alla parte immaginaria. Qui indichiamo un elemento di riempimento per quello a destra di "j".
2j1 # 'ABCD'
AA BB CC DD
Come con la maggior parte delle primitive J, il verbo replicato (#) funziona su array numerici in modo analogo a come funziona su array di caratteri. Come mostrato qui,
1j1 # 1 2 3
1 0 2 0 3 0
vediamo che l'elemento di riempimento numerico predefinito è zero, mentre per i caratteri è il carattere spazio.
Infine, il token più a sinistra "|:" traspone il risultato dei verbi precedenti alla sua destra.
Spiegazione fornita da Devon McCormick. Grazie Devon.