Використання ітерації для обчислення послідовностей
Як правило, для вирішення завдання послідовності 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 року є щось смішне