Вступление
Kipple - основанный на стеке эзотерический язык программирования, изобретенный Руне Бергом в марте 2003 года.
Киппл имеет 27 стеков, 4 оператора и структуру управления.
Стеки
Стопки названы a
- z
и содержат 32-битные целые числа. Существует также специальный стек @
, чтобы сделать вывод чисел более удобным. Когда число вводится, @
вместо него на самом деле вставляются значения ASCII цифр этого числа. (Например, если вы нажмете 12 к @
, @
вместо этого будет 49, а затем 50 ).
Ввод помещается в стек ввода i
перед выполнением программы. Интерпретатор запросит значения для хранения i
перед выполнением. После завершения выполнения все в выходном стеке o
выводится как символ ASCII. Так как это единственный механизм ввода-вывода в Kipple, взаимодействие с программой Kipple невозможно.
операторы
Операндом является либо идентификатор стека, либо 32-разрядное целое число со знаком.
Нажмите: >
или<
Синтаксис: Operand>StackIndentifier
илиStackIndentifier<Operand
Оператор Push берет операнд влево и помещает его в указанный стек. Например, 12>a
поместит значение 12 в стек a
. вытолкнет a>b
самое верхнее значение из стека a
и поместит его в стек b
. Выгрузка пустого стека всегда возвращает 0. a<b
Это эквивалентно b>a
. a<b>c
выскакивает самое верхнее значение из b
и выдвигает к обоим c
и a
.
Добавлять: +
Синтаксис: StackIndentifier+Operand
Оператор Add помещает сумму самого верхнего элемента в стеке и операнда в стек. Если операнд является стеком, то значение извлекается из него. Например, если самое верхнее значение стека a
равно 1, то a+2
на него будет помещено 3. Если a
пусто, то a+2
нажмите 2 на него. Если самые верхние значения стека a
и b
1 и 2, то вытолкнет a+b
значение 2 из стека b
и вставит 3 в стек a
.
Вычесть: -
Синтаксис: StackIndentifier-Operand
Оператор Subtract работает точно так же, как оператор Add, за исключением того, что он вычитает вместо добавления.
Ясно: ?
Синтаксис: StackIndentifier?
Оператор Clear очищает стек, если его самый верхний элемент равен 0.
Переводчик будет игнорировать все , что не рядом с оператором, поэтому следующая программа будет работать: a+2 this will be ignored c<i
. Тем не менее, правильный способ добавления комментариев - использование #
символа. Все, что находится между a #
и символом конца строки, удаляется перед выполнением. ASCII символ # 10 определяется как конец строки в Kipple.
Операнды могут совместно использоваться двумя операторами, например, a>b c>b c?
могут быть записаны как a>b<c?
.
Программа 1>a<2 a+a
будет a
содержать значения [1 4]
(снизу вверх), а не содержать [1 3]
. Аналогично для -
оператора.
Структура управления
В Kipple есть только одна структура управления: цикл.
Синтаксис: (StackIndentifier code )
Пока указанный стек не пуст, код в соответствующих скобках будет повторяться. Петли могут содержать другие петли. Например, (a a>b)
переместит все значения стека a
в стек b
, хотя порядок будет обратным . Функционально идентичный, но более элегантный способ сделать это (a>b)
.
Примеры
100>@ (@>o)
Это будет выводить 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
Это напечатает "Hello World!"
. Когда o
выводится стек, он начинает выскакивать символы сверху вниз в стеке.
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
Это генератор простых чисел, но я не уверен, как он работает.
правила
Вы должны написать программу / функцию, которая интерпретирует Kipple. Эта программа / функция может получить программу Kipple через исходный файл или получить ее через STDIN непосредственно от пользователя. Если STDIN недоступен, он должен получить его с клавиатуры и продолжать получать до тех пор, пока не будет введен определенный непечатаемый символ. Например, если ваш интерпретатор написан на машинном коде x86, он будет получать символьно-программную программу Kipple с клавиатуры и продолжит делать это до тех пор, пока esc(или любая другая клавиша, которая не выдает печатный символ), не будет нажата.
Если есть ошибка, например, синтаксическая ошибка или переполнение стека, она должна каким-то образом подтвердить ее, например, возвращая 10 вместо 0 или сообщения об ошибках, выданные интерпретатором / компилятором, НО НЕ ПЕЧАТЬ СООБЩЕНИЙ ОШИБКИ .
Любые другие обычные правила для кода гольф применяются для этой задачи.
Ваш код будет протестирован с некоторыми примерами в архиве примеров Kipple.
Это код-гольф . Самый короткий код в байтах победит. Удачи!
Обратите внимание, что в Kipple есть необязательный оператор, "
но он не является частью спецификации, а просто дополнительной функцией в официальном интерпретаторе. Я не упомянул об этом здесь, поэтому его не нужно поддерживать в вашем представлении.
Если у вас есть какие-либо сомнения относительно какой-либо части спецификации, вы можете проверить ее с помощью официального переводчика, написанного на Java . Это загрузит zip-файл, содержащий скомпилированную программу и исходный код. Он лицензирован по лицензии GPL.
i
если я беру исходную программу из стандартного ввода ?