J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Przykłady:
|: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 '['
To rozwiązanie ewoluowało na forum programowania J: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Autorzy: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Wyjaśnienie
Wyrażenia J są wykonywane od prawej, przekazując bieżący wynik w lewo, gdy jest on oceniany. Ponieważ jest interaktywny, możemy spojrzeć na fragmenty rozwiązania w izolacji, aby lepiej je zrozumieć.
Środkowa część generuje wielkie i małe litery alfabetu w Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Czasownik „u:” konwertuje swój prawy argument liczbowy na znaki Unicode. Argument numeryczny jest generowany na podstawie wartości ASCII dla wielkich i małych liter poprzez dodanie liczb dla „A” i „a” do wartości od 0 do 25 generowanych przez „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
Część po prawej,
((>:@i.}.[)])"0
sprawdza (i.) pozycję prawego argumentu (]) w lewym ([) - który jest wektorem liter powyżej - i upuszcza (}.) jeszcze jeden (>:) niż ta liczba. „0” stosuje to wyrażenie do argumentów 0-wymiarowych (skalarnych).
('123H999' (>:@i.}.[)])"0 'H'
999
Fraza „25 {.” Bierze pierwsze 25 elementów wektora po prawej stronie.
Przedostatnia fraza „1j1 #” po lewej stronie replikuje swój prawy argument zgodnie z liczbą po lewej. Prosta liczba wykonuje prostą replikację:
2 # 'ABCD'
AABBCCDD
Jednak liczba zespolona - oznaczona literą „j” między częścią rzeczywistą a urojoną - wstawia element wypełniający zgodnie z częścią urojoną. W tym miejscu wskazujemy jeden element wypełniający jeden po prawej stronie „j”.
2j1 # 'ABCD'
AA BB CC DD
Podobnie jak w przypadku większości prymitywów J, czasownik replikacyjny (#) działa na tablicach numerycznych w sposób analityczny, jak działa na tablicach znaków. Jak pokazano tutaj,
1j1 # 1 2 3
1 0 2 0 3 0
widzimy, że domyślnym numerycznym elementem wypełniającym jest zero, podczas gdy dla znaków jest to znak spacji.
Wreszcie lewy token „|:” transponuje wynik poprzednich czasowników na prawo.
Wyjaśnienie dostarczone przez Devona McCormicka. Dziękuję Devon.