Использование итерации для вычисления последовательностей
Как правило, решение проблемы последовательности OEIS потребует использования одной из формул, приведенных на его странице. Некоторые из них хорошо адаптируются к J, а другие - не так. Рекурсивные формулы просты, однако итерация может быть непростой. Шаблон, который я начал использовать,
(s(]f)^:[~]) n
] Gets n
s The first value in the sequence
~ Commute the argument order, n is LHS and s is RHS
[ Gets n
^: Nest n times with an initial argument s
(]f) Compute f s
Returns (f^n) s
где s
- первое значение в последовательности, f
это глагол, который будет вычислять следующий термин, заданный предыдущим термином, и n
основанный на нуле индекс термина, который вы хотите вычислить. Этот метод основан на том факте, что при вычислении мощности диады LHS связывается с диадой, чтобы сформировать новую монаду, и эта монада вкладывается в начальное значение. Диада, передаваемая наречению власти, - это ловушка, в которой (]f)
указывается индекс n
на LHS и значение члена в последовательности s
. Крюк будет применяться f
на s
как монады, а затем игнорировать , n
чтобы вернуть результат f s
.
Стандартная библиотека
Иногда вы можете обнаружить, что у J будет поддержка глагола в его стандартной библиотеке . Например, большинство побитовых целочисленных операций связаны с именами, которые короче, чем примитивный вызов.
AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'
Встроенные дата и время также доступны.
Изменяется
Если у вас есть набор значений, [a, b, c]
и вы хотите сформировать диапазон на основе их продукта [0, 1, 2, ..., a*b*c-1]
, типичным подходом будет найти их продукт, а затем сформировать диапазон, который может [:i.*/
стоить 6 байтов. Более короткий путь - ,@i.
4 байта, поскольку он i.
может образовывать многомерные массивы, продолжая отсчитывать, и его выравнивание приведет к эквивалентному диапазону.
Непрерывная печать
Неявный способ напечатать значение и продолжать использовать его без явного цикла - ([echo)
для монадического случая. echo
это глагол в стандартной библиотеке, который печатает его содержимое stdout
в том же формате, который используется в интерпретаторе. Затем ловушка передает то же входное значение, используя левый [
глагол.
База 10 цифр целого числа
Стандартный способ получения базовых 10 цифр целого числа - 10#.inv]
это 8 байтов, слишком много! Альтернатива состоит в том, чтобы преобразовать ее в строку и проанализировать ее на уровне 0, "."0@":
что позволяет сэкономить байт, но еще лучше - ,.&.":
сохранить еще один байт, получив окончательную стоимость 6 байт вместо 8.
GolfScript gets its own way far too often
в 2019 году.