J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Beispiele:
|: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 '['
Diese Lösung wurde im J-Programmierforum entwickelt: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Autoren: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Erläuterung
J-Phrasen werden von rechts beginnend ausgeführt und geben das laufende Ergebnis bei der Auswertung nach links weiter. Da es interaktiv ist, können wir Teile der Lösung isoliert betrachten, um sie besser zu verstehen.
Der mittlere Teil generiert das Groß- und Kleinbuchstaben in Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Das Verb "u:" konvertiert sein numerisches Argument nach rechts in Unicode-Zeichen. Das numerische Argument wird aus den ASCII-Werten für die Groß- und Kleinbuchstaben generiert, indem die Zahlen für "A" und "a" zu den von "i.26" generierten Werten von 0 bis 25 addiert werden:
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
Der rechte Teil,
((>:@i.}.[)])"0
Nachschlagen (i.) der Position des rechten Arguments (]) im linken ([) - das ist der Vektor der darüber liegenden Buchstaben - und Ablegen (}.) eines weiteren (>:) als diese Zahl. Die "0" wendet diesen Ausdruck auf 0-dimensionale (skalare) Argumente an.
('123H999' (>:@i.}.[)])"0 'H'
999
Die Phrase "25 {." Nimmt die ersten 25 Elemente des Vektors auf der rechten Seite.
Der vorletzte Ausdruck "1j1 #" auf der linken Seite wiederholt sein rechtes Argument entsprechend der Zahl auf der linken Seite. Eine einfache Zahl führt eine einfache Replikation durch:
2 # 'ABCD'
AABBCCDD
Eine komplexe Zahl - angegeben durch das "j" zwischen Real- und Imaginärteil - fügt jedoch ein Füllelement entsprechend dem Imaginärteil ein. Hier geben wir ein Füllelement nach dem anderen rechts vom "j" an.
2j1 # 'ABCD'
AA BB CC DD
Wie bei den meisten J-Primitiven funktioniert das Replikatverb (#) bei numerischen Arrays auf analoge Weise wie bei Zeichenarrays. Wie hier gezeigt,
1j1 # 1 2 3
1 0 2 0 3 0
Wir sehen, dass das standardmäßige numerische Füllelement Null ist, während es bei Zeichen das Leerzeichen ist.
Schließlich transponiert das am weitesten links stehende Token "|:" das Ergebnis der vorhergehenden Verben nach rechts.
Erklärung von Devon McCormick. Vielen Dank, Devon.