Популярный веб-комикс Homestuck использует язык программирования, предназначенный ~ATHдля уничтожения вселенных. В то время как задача кода в гольф не состоит в том, чтобы написать программу, которая уничтожит наше существование, мы будем уничтожать некоторые более ручные (хотя и менее интересные) объекты: переменные .
~ATH(произносится как «до смерти», обратите внимание, как ~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максимально соответствовать фактическому ).