J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Exemples:
|: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 '['
Cette solution a évolué sur le forum de programmation J: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Auteurs: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
Explication
Les phrases J sont exécutées en commençant à droite, en passant le résultat en cours vers la gauche lors de son évaluation. Puisqu'il est interactif, nous pouvons examiner des éléments de la solution isolément pour mieux les comprendre.
La partie centrale génère l'alphabet majuscule et minuscule en Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Le verbe "u:" convertit son argument numérique de droite en caractères Unicode. L'argument numérique est généré à partir des valeurs ASCII pour les caractères majuscules et minuscules en ajoutant les nombres pour "A" et "a" chacun aux valeurs de 0 à 25 générées par "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 partie droite,
((>:@i.}.[)])"0
recherche (i.) la position de l'argument de droite (]) dans la gauche ([) - qui est le vecteur des lettres ci-dessus - et laisse tomber (}.) un de plus (>:) que ce nombre. Le "" 0 "applique cette phrase aux arguments (scalaires) à 0 dimension.
('123H999' (>:@i.}.[)])"0 'H'
999
La phrase "25 {." Prend les 25 premiers éléments du vecteur à droite.
L'avant-dernière phrase "1j1 #" à gauche reproduit son argument de droite en fonction du nombre à gauche. Un simple numéro fait une simple réplication:
2 # 'ABCD'
AABBCCDD
Cependant, un nombre complexe - indiqué par le "j" entre les parties réelle et imaginaire - insère un élément de remplissage en fonction de la partie imaginaire. Ici, nous indiquons un élément de remplissage par celui à droite du "j".
2j1 # 'ABCD'
AA BB CC DD
Comme pour la plupart des primitives J, le verbe répliqué (#) fonctionne sur les tableaux numériques de manière analogue à son fonctionnement sur les tableaux de caractères. Comme montré ici,
1j1 # 1 2 3
1 0 2 0 3 0
nous voyons que l'élément de remplissage numérique par défaut est zéro alors que pour les caractères c'est le caractère espace.
Enfin, le jeton le plus à gauche "|:" transpose le résultat des verbes précédents à sa droite.
Explication fournie par Devon McCormick. Merci Devon.