Пора вам реализовать мой новый язык на основе стека! Это называется StackyMath. Это будет основанный на стеке язык с 8 операциями над стеком и способами добавления чисел в стек.
Список операций:
/
: Отдел. Выполняется 2 верхних номера стека. Откладывает результат обратно в стек.*
Умножение. Выполняется 2 верхних номера стека. Откладывает результат обратно в стек-
: Вычитание. Выполняется 2 верхних номера стека. Откладывает результат обратно в стек+
Дополнение Выполняется 2 верхних номера стека. Откладывает результат обратно в стек^
: Экспонирование. Выполняется 2 верхних номера стека. Откладывает результат обратно в стек%
: По модулю. Выполняется 2 верхних номера стека. Откладывает результат обратно в стек!
Факториал. Выполняется по верхнему номеру в стеке. Откладывает результат обратно в стекD
: Дублировать верхний номер в стеке
Операции, определенные в псевдокоде:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
Как поместить числа в стек:
Добавить цифры в стек просто, просто поместите необработанный номер в свою программу там, где он вам нужен. Если вам нужно поместить несколько чисел в стек, вы можете разделить их запятой ( ,
). Ваша программа не должна будет обрабатывать -
числа во входных данных. Если пользователь хочет один, он должен нажать на число, которое он хочет отрицать, ноль и -
. Числа на входе программы также ограничены положительными целыми числами.
Входные данные:
Ваша программа должна принимать данные из командной строки или из стандартного ввода. Ввод будет состоять только из чисел (без научных обозначений или десятичных дробей), разделенных ,
необходимости, и из операций, определенных выше.
Выход:
Ваша программа должна напечатать число на вершине стека.
Случаи ошибки:
- Если программа пытается перегрузить стек, вы должны распечатать
StackUnderflowException!!!
. - Если у вас деление на ноль, выведите
DivisionByZeroException!!!
- Если число превышает 64 бита, либо во время выполнения программы, либо при обработке числа на входе, выведите
NumberOverflowException!!!
- Если каким-то образом вы получили отрицательное число на вершине стека, и вам нужно сделать факториал, выведите
NegativeFactorialException!!!
- Если у вас есть число с плавающей запятой на вершинах стека, и следующая операция будет факториальной, выведите
FloatingFactorialException!!!
- Если при выходе из программы в стеке нет чисел (т. Е. Программа была пуста), выведите
EmptyProgram!!!
Примечания:
- Все выходные данные об ошибках должны получить либо ошибку, либо ближайший эквивалент.
- Все числа ограничены 64-битной плавающей точкой.
Примеры программ:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(Я могу добавить больше, если это необходимо)
источник
!
вF
).654,489,48,43/5*7D+-*%
должен вернуться77.6875
. (43/48*5-(7+7)
должно быть(7+7)-43/48*5
)Ответы:
Рубин,
412410404392380377 символовЭто обычная прецизионная версия с использованием
Float
. Точность результата такая же, как в примере кода, но обнаружение переполнения чисел не является точным.Образец прогона:
Рубин,
378377 символовЭто высокоточная версия с использованием
Rational
. Точность результата не всегда такая же, как в примере кода, но точное определение числового переполнения.Образец прогона:
источник
JavaScript (ES6), 430 байт
422 байта с ES7, изменив
Math.pow(2,2)
на2**2
объяснение
Используется
eval
для замены некоторых общих фраз. Без разгула и безeval
него это выглядит так:источник
Math.pow(p(),p())
наp()**p()
.Groovy, 718 байт. Fore!
Можно также опубликовать мой импл гольф. Встречайте мою большую стену кода:
Ungolfed:
Редактировать 1: сэкономить ~ 15 байт благодаря @Doorknob
Редактировать 2: сбросить ~ 130 байтов с помощью нескольких хитростей
источник
for
/if
и т. Д.System.in.text
вместоSystem.in.newReader().readLine()
..text
является жадным и пока данные в считывателе не возвращаются.Конфеты ,
298348392 байтаХотя Candy основана на стеке, я не уверен, что это действительно помогло ...
Немного отформатированный показывает немного структуры:
Фактическая математика происходит в последних двух строках. Его ведет там таблица прыжков на третьей строке.
источник