J 43
|:1j1#(25{.(u:,2#65 97+/i.26)(>:@i.}.[)])"0
Примеры:
|: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 '['
Это решение появилось на форуме по программированию J: http://jsoftware.com/pipermail/programming/2012-August/029072.html
Авторы: AlvordBossCerovskiCyrEllerHuiLambertMcCormickMillerQuintanaSchottSherlockTaylorTherriault
объяснение
J фразы выполняются, начиная справа, передавая текущий результат влево, когда он оценивается. Поскольку он интерактивный, мы можем посмотреть на отдельные части решения, чтобы лучше понять их.
Средняя часть генерирует прописные и строчные буквы в Unicode:
u:,2#65 97+/i.26
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Глагол "u:" преобразует свой числовой правый аргумент в символы Юникода. Числовой аргумент генерируется из значений ASCII для символов верхнего и нижнего регистра путем добавления чисел для «A» и «a» каждый к значениям от 0 до 25, сгенерированным «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
Правая часть,
((>:@i.}.[)])"0
ищет (i.) позицию правого аргумента (]) слева ([) - который является вектором букв выше - и отбрасывает (}.) еще на один (>:), чем это число. «0» применяет эту фразу к 0-мерным (скалярным) аргументам.
('123H999' (>:@i.}.[)])"0 'H'
999
Фраза «25 {.» Берет первые 25 элементов вектора справа.
Предпоследняя фраза «1j1 #» слева повторяет свой правый аргумент в соответствии с номером слева. Простое число делает простую репликацию:
2 # 'ABCD'
AABBCCDD
Однако комплексное число, обозначенное буквой «j» между действительной и мнимой частями, вставляет элемент заполнения в соответствии с мнимой частью. Здесь мы указываем один элемент заполнения справа от «j».
2j1 # 'ABCD'
AA BB CC DD
Как и в большинстве J-примитивов, реплицирующий глагол (#) работает с числовыми массивами аналогично тому, как он работает с массивами символов. Как показано здесь,
1j1 # 1 2 3
1 0 2 0 3 0
мы видим, что элемент числовой заливки по умолчанию равен нулю, тогда как для символов это символ пробела.
Наконец, крайний левый токен "|:" транспонирует результат предыдущих глаголов справа от него.
Объяснение предоставлено Девоном Маккормиком. Спасибо, Девон.