Популярний webcomic Homestuck використовує мову програмування, покликану ~ATH
знищувати всесвіти. Хоча ця проблема з гольф-кодом полягає не в тому, щоб написати програму, щоб знищити наше існування, ми знищимо ще кілька ручних (хоча і менш цікавих) сутностей: змінних .
~ATH
(вимовляється "til death", помічайте, як ~ath
працює "tilde ath"), створюючи змінну, яку називають THIS
, виконуючи команду з EXECUTE
і закінчуючи програму THIS.DIE()
. Сторінку вікі для використання мови в Homestuck можна знайти тут . Метою цього виклику буде створення ~ATH
перекладача.
Заради виклику я збираюся створити деякі деталі ~ATH
, які насправді не існують, але зробити їх (дещо) корисними.
- Мова працюватиме лише з цілими числами, які задекларовані за допомогою
import <variable name>;
. Змінна автоматично буде встановлена у значення 0. Лише одна змінна одночасно може бути імпортована. - Змінна
x
може бути скопійована шляхом записуbifurcate x[y,z];
, яка видалить зміннуx
та замінить її ідентичними зміннимиy
таz
. Зауважте, що він не може створити змінну з тим самим іменем, що і видалену. По суті, змінна перейменована, потім створюється копія змінної з іншим іменем. Це здається дурною особливістю, але дурість дуже глибоко вкорінена в Homestuck. - Синтаксис для написання програми , яка виконує код на
x
це~ATH(x){EXECUTE(<code>)}
. Якщо ви хочете , щоб виконати код від двох змінних одночасно, код стає вкладеним, як це:~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Всі команди в<code>
буде виконуватися і на,x
і наy
. - Тепер перейдемо до команд.
+
приріст відповідних змінних (-ів) на 1 і-
зменшення їх на 1. І ... це все. - Кінцева особливість компанії
~ATH
полягає в тому, що вона вбиває все, з чим працює. Змінні друкуються у форматі<name>=<value>
(за ним новий рядок) за командою[<name>].DIE();
. Після цього програма друкує словоDIE <name>
та новий рядок кілька разів, що дорівнює абсолютній величині значення змінної. Коли змінні вбиваються одночасно з[<name1>,<name2>].DIE();
(ви можете мати стільки змінних, скільки хочете, до тих пір, поки вони існують),DIE()
команда виконується над змінними послідовно.
Приклад програм
Програма 1:
import sollux; //calls variable "sollux"
import eridan; //calls variable "eridan"
~ATH(sollux){EXECUTE(--)} //sets the value of "sollux" to -2
~ATH(eridan){EXECUTE(+++++)} //sets the value of "eridan" to 5
[sollux].DIE(); //kills "sollux", prints "DIE sollux" twice
~ATH(eridan){EXECUTE(+)} //sets the value of "eridan" to 6
[eridan].DIE(); //kills "eridan", prints "DIE eridan" 6 times
Вихід:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Програма 2:
import THIS; //calls variable "THIS"
~ATH(THIS){EXECUTE(++++)} //sets the value of "THIS" to 4
bifurcate THIS[THIS1,THIS2]; //deletes "THIS", creates variables "THIS1" and "THIS2" both equal to 4
~ATH(THIS1){EXECUTE(++)} //sets the value of "THIS1" to 6
[THIS1,THIS2].DIE(); //kills "THIS1" and "THIS2", prints "DIE THIS1" 6 times then "DIE THIS2" 4 times
import THAT; //calls variable "THAT"
bifurcate THAT[THESE,THOSE]; //deletes "THAT", creates variables "THESE" and "THOSE"
~ATH(THESE){~ATH(THOSE){EXECUTE(+++)}EXECUTE(++)} //sets the value of "THESE" and "THOSE" to 3, then sets the value of "THESE" to 5
[THESE,THOSE].DIE(); //kills "THESE" and "THOSE", prints "DIE THESE" 5 times then "DIE THOSE" 3 times
Вихід:
THIS1=6
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
THIS2=4
DIE THIS2
DIE THIS2
DIE THIS2
DIE THIS2
THESE=5
DIE THESE
DIE THESE
DIE THESE
DIE THESE
DIE THESE
THOSE=3
DIE THOSE
DIE THOSE
DIE THOSE
Це кодовий гольф, тому застосовуються стандартні правила. Виграє найкоротший код у байтах.
~ATH
використовує точку з коми в якості лінійних закінчень для import
, bifurcate
і DIE
команд. І REPL, і файли чудово. Чутливість до регістру потрібна як у вході, так і у виході (я намагаюся максимально відповідати фактичному ~ATH
).