Решение в J:
('abcdefghijklmnopqrstuvwxyz';'ABCDEFGHIJKLMNOPQRSTUVWXYZ') (4 : '(y#~y e. >1{x)([: I. '' ''= ])} }._1&|.&.((1,~y e. >0{x)&#)y,'' ''') 'abcDEfghI'
abDEcfgIh
Давайте разберем это на именованные фрагменты для более легкого понимания. Последняя строка «abDEcfgIh
» является результатом применения функции к строке «abcDEfghI
», которая является правильным аргументом для функции. Пара алфавитов составляет левый аргумент функции (которая начинается с части «(4 :
…»)). Таким образом, вместо двухэлементного вектора строк в штучной упаковке мы можем назвать каждую из них по отдельности:
'lc uc'=. 'abcdefghijklmnopqrstuvwxyz';'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Теперь, когда у нас есть две переменные «lc
» и «uc
» для строчных и прописных алфавитов, давайте рассмотрим тело функции более подробно. Взяв логически связный фрагмент с правого конца, так как это будет оценено в первую очередь, мы можем назвать это так:
rmUCshift=: 4 : 0
}._1&|.&.((1,~y e. >0{x)&#)y,' '
)
Это определяет «rmUCshift
» как то, что требует правого и левого аргумента (это указывает «4 :
»), причем тело начинается со следующей строки и продолжается до чистого закрывающего элемента. Форма «4 : 0
», за которой следует тело, является вариантом формы «4 :
‘ body », показанной изначально. Этот глагол rmUCshift
может быть вызван независимо, как это:
(lc;'') rmUCshift 'abcDEfghI' NB. Remove upper-case, shift, then insert
ab cfg h NB. spaces where the upper-case would now be.
Вызов имеет отступ в три пробела, и результат сразу следует за ним. Левый аргумент (lc;'')
- это двухэлементный вектор с пустым массивом, указанным в качестве второго элемента, поскольку он не используется в этом фрагменте кода - мы могли бы использовать любое значение после точки с запятой, но две одинарные кавычки легко набрать .
Следующие названия, которые следует назвать, - это (определения, сопровождаемые примерами):
ixSpaces=: [:I.' '=]
ixSpaces 'ab cfg h'
2 3 7
onlyUC=: 4 : 'y#~y e.>1{x'
('';uc) onlyUC 'abcDEfghI'
DEI
Объединение этих именованных частей вместе дает нам следующее:
(lc;uc) (4 : '(x onlyUC y)(ixSpaces x rmUCshift y)}x rmUCshift y') 'abcDEfghI'
abDEcfgIh
Однако повторение «x rmUCshift y
» не является необходимым и может быть упрощено, чтобы дать нам это:
(lc;uc) (4 : '(x onlyUC y) ((ixSpaces ]) } ]) x rmUCshift y') 'abcDEfghI'
abDEcfgIh