Аліса , 14 12 байт
/O
\i@/t&Yd&
Спробуйте в Інтернеті!
Зворотна функція (не для гольфу):
/o Q
\i@/~~\ /dt&Z
Спробуйте в Інтернеті!
Пояснення
Аліса має вбудовану біекцію між ℤ та ℤ 2 , яку можна обчислити Y
(розпакувати) та її зворотну Z
(пакет). Ось уривок із документів, що пояснюють біекцію:
Деталі біекції, ймовірно, не мають значення для більшості випадків використання. Основний момент полягає в тому, що він дозволяє користувачу кодувати два цілих числа в одне і витягувати цілі цілі числа знову згодом. Застосовуючи команду pack багаторазово, цілі списки або дерева цілих чисел можуть зберігатися в одному номері (хоча не особливо ефективним способом пам'яті). Відображення, обчислене операцією пакету, є бієктивною функцією ℤ 2 → ℤ (тобто відображенням один на один). По-перше, цілі числа {..., -2, -1, 0, 1, 2, ...} відображаються до натуральних чисел (включаючи нуль), як {..., 3, 1, 0, 2, 4 , ...}(інакше кажучи, від’ємні цілі числа відображаються на непарні натурали, а негативні цілі числа - у натуральні). Потім два натуральних числа відображаються на одне за допомогою функції спарювання Кантора , яка записує натурали по діагоналях першого квадранта цілої сітки. В Зокрема, {(0,0), (1,0), (0,1), (2,0), (1,1), (0,2), (3,0), ...} є відображено на {0, 1, 2, 3, 4, 5, 6, ...} . Отримане натуральне число потім відображається назад до цілих чисел, використовуючи обернену попередню біекцію. Команда unpack обчислює саме зворотну частину цього відображення.
Як уже згадувалося вище, ми можемо використовувати цю операцію розпакування для відображення від ℤ до ℤ k . Застосувавши його до початкового цілого числа, ми можемо знову розпакувати друге ціле число результату, що дає нам список із трьох цілих чисел. Отже, k-1 додатки Y
дають нам k цілі числа.
Ми можемо обчислити зворотне, запакувавши список з Z
кінця.
Отже сама програма має таку структуру:
/O
\i@/...d&
Це лише основний шаблон для програми, яка читає змінну кількість десяткових цілих чисел як вхідних даних і друкує змінне число як результат. Тож власне код справді просто:
t Decrement k.
& Repeat the next command k-1 times.
Y Unpack.
Я хотів би сказати одне - "чому б Аліса мала вбудований для бікей ℤ → ction 2 , це не територія мови для гольфу"? Як і у більшості дивних вбудованих програм Аліси, головна причина полягає в принципі проектування Аліси, що кожна команда має два значення: одне для режиму кардиналів (цілих чисел) і одне для звичайного (рядкового) режиму, і ці два значення повинні бути якось пов'язані з поданням У режимі кардинала та ординала відчуття, що вони є дзеркальними всесвітами, де речі наче однакові, але й різні. І досить часто у мене була команда для одного з двох режимів, які я хотів додати, а потім доводилося з'ясовувати, з якою іншою командою спарити її.
У разі Y
і Z
режиму Порядковий прийшов першим: Я хотів би мати функцію чергування двох рядків (ZIP) і відокремити їх знову (розпакувати). Якість цього, яке я хотів зафіксувати в режимі Кардинала, полягала в тому, щоб сформувати одне ціле число з двох і мати змогу витягти цілі цілі знову пізніше, що робить такий біекція природним вибором.
Я також подумав, що це насправді буде дуже корисно за межами гольфу, оскільки це дозволяє зберігати цілий список або навіть дерево цілих чисел в одній одиниці пам'яті (елемент стека, клітинка стрічки або комірка сітки).
k
іx
замість цілих чисел?