Вступ
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>cpops найвище значення від 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?