Вступ
Kipple - це езотерична мова програмування на основі стека, винайдена Руном Бергом у березні 2003 року.
Kipple має 27 стеків, 4 оператори та структуру управління.
Стеки
Стеки названі a
- z
і містять 32-бітні цілі числа. Існує також спеціальний стек @
, щоб зробити виведення номерів більш зручним. Коли число висувається @
, значення ASCII цифр цього числа насправді висуваються натомість. (Наприклад, якщо натиснути 12 @
, він нажатиме 49, а потім 50 к @
.)
Введення висувається на вхідний стек i
перед виконанням програми. Інтерпретатор попросить зберегти значення i
перед виконанням. Після завершення виконання все, що на вихідному стеку o
, вискакує для виведення у вигляді символу ASCII. Оскільки це єдиний механізм вводу-виводу Kipple, взаємодія з програмою Kipple неможлива.
Оператори
Операнд є або ідентифікатором стека, або підписаним 32-бітовим цілим числом.
Push: >
або<
Синтаксис: Operand>StackIndentifier
абоStackIndentifier<Operand
Оператор Push відводить операнда вліво і натискає на вказаний стек. Наприклад, 12>a
буде натиснути значення 12 на стек a
. a>b
з'явиться найвище значення зі стека a
і натисне його на стек b
. Вискакуючи порожній стек завжди повертається 0. a<b
еквівалентно b>a
. a<b>c
pops найвище значення від 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
якщо я беру програму-джерело від stdin?