Популярний 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).