Вы должны оценить строку, написанную в обратной польской записи, и вывести результат.
Программа должна принять ввод и вернуть вывод. Для языков программирования, которые не имеют функций для приема ввода / вывода, вы можете принять такие функции, как readLine / print.
Вам не разрешено использовать какие-либо "eval" в программе.
Числа и операторы разделены одним или несколькими пробелами.
Вы должны поддерживать как минимум операторы +, -, * и /.
Вам необходимо добавить поддержку для отрицательных чисел (например, -4
это не то же самое, что 0 4 -
) и чисел с плавающей запятой.
Вы можете предположить, что ввод действителен и следует правилам выше
Тестовые случаи
Входные данные:
-4 5 +
Выход:
1
Входные данные:
5 2 /
Выход:
2.5
Входные данные:
5 2.5 /
Выход:
2
Входные данные:
5 1 2 + 4 * 3 - +
Выход:
14
Входные данные:
4 2 5 * + 1 3 2 * + /
Выход:
2
~
. :-Peval
разбора чисел? Это звучит довольно разбито. (Насколько мне известно, GolfScript - один из таких языков. Я думаю, он тоже сломан.)eval(s)
float(s)
Ответы:
Рубин -
9577 символовПринимает вход на стандартный ввод.
Тестовый код
дает
В отличие от версии C это возвращает последний действительный результат, если есть дополнительные числа, добавленные к вводу, который кажется.
источник
Питон - 124 символа
Питон - 133 символа
источник
0
качестве второго операнда ...[a/b]
должен быть заменен наb and[a/b]
так, чтобы вы могли иметь 0 в качестве второго операнда.Схема, 162 символа
(Разрывы строк добавлены для ясности - все необязательно.)
Полностью отформатированная (негольфированная) версия:
Выбранный комментарий
`(,foo ,@bar)
это то же самое, что(cons foo bar)
(т. е. он (эффективно † ) возвращает новый список сfoo
добавленным перед нимbar
), за исключением того, что он на один символ короче, если сжать все пробелы.Таким образом, вы можете прочитать итерации положения , как
(loop (cons token stack))
и(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
если это легче на ваших глазах.`((+ ,+) (- ,-) (* ,*) (/ ,/))
создает список ассоциации с символом в+
паре с процедурой+
, а также с другими операторами. Таким образом, это простая таблица поиска символов (голые слова представлены(read)
в виде символов, поэтому дальнейшая обработкаtoken
не требуется). Списки ассоциаций имеют поиск O (n) и поэтому подходят только для коротких списков, как здесь. :-П† Это не является технически точным, но для программистов, не являющихся пользователями Lisp, оно дает достаточно правильное представление.
источник
lambda (ass)
+1 для выбора имени переменной: Pc - 424 необходимых символа
Предполагается, что у вас достаточно нового libc для включения
getdelim
в stdio.h. Подход прямой, весь входной поток считывается в буфер, затем мы используем токеныstrsep
и используем длину и начальный символ для определения класса каждого. Нет защиты от плохого ввода. Подайте ему «+ - * / + - ...», и он с радостью вытолкнет содержимое из памяти «ниже» стека, пока не обнаружит ошибки. Все неоператоры интерпретируются как числа с плавающей точкой,atof
что означает нулевое значение, если они не похожи на числа.Читается и комментируется:
Проверка:
Хех! Должен процитировать что-нибудь с
*
этим ...и мой собственный контрольный пример
источник
case
на макро.Хаскелл (155)
источник
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
спас бы 14 символов.MATLAB -
158, 147(ввод читается с пользовательского ввода, вывод распечатывается).
Ниже приведен код, предварительно проверенный и прокомментированный, он в значительной степени реализует описанный алгоритм постфикса (при условии, что выражения верны):
Бонус:
В приведенной выше коде, мы предполагаем , операторы всегда бинарные (
+
,-
,*
,/
). Мы можем обобщить его, используяnargin(f)
для определения количества аргументов, которые требуются операнду / функции, и извлекать правильное количество значений из стека соответственно, как в:Таким образом, мы можем оценить такие выражения, как:
где
mean_of_three
пользовательская функция с тремя входами:источник
Perl (134)
В следующий раз я собираюсь использовать рекурсивное регулярное выражение.
Ungolfed:
Я думаю, что F # - мой единственный язык программирования мечты ...
источник
Windows PowerShell, 152
181192В удобочитаемой форме, потому что на данный момент это только две строки без шансов их разбить:
2010-01-30 11:07 (192) - Первая попытка.
2010-01-30 11:09 (170) - Превращение функции в блок сценариев решает проблемы области видимости. Просто делает каждый вызов на два байта длиннее.
2010-01-30 11:19 (188) - Проблема с областью действия не решена, контрольный пример просто замаскировал ее. Удалил индекс из конечного вывода и удалил лишний разрыв строки. И поменял дважды на
float
.2010-01-30 11:19 (181) - Даже не помню своего собственного совета. Приведение к числовому типу может быть сделано в одном символе.
2010-01-30 11:39 (152) - Значительно уменьшено с помощью сопоставления регулярных выражений в
switch
. Полностью решает предыдущие проблемы с областью доступа к стеку для его извлечения.источник
Ракетка 131:
Разрывы строки необязательны.
Основано на решении Криса Джестера-Янга для Схемы.
источник
Python, 166 символов
источник
raw_input()
код не разбито на несколько строк.from operator import*
и заменитьo.div
наdiv
.Python 3, 119 байт
Входные данные:
5 1 1 - -7 0 * + - 2 /
Выход:
2.5
(Вы можете найти 128-символьную версию Python 2 в истории редактирования.)
источник
/
в строке.ZeroDivisionError
когда второй операнд равен 0 (например5 0 +
).ord(x) - 42
метод.JavaScript (157)
В этом коде предполагается, что есть две функции: readLine и print
источник
prompt()
вместоreadLine()
(и, возможно,alert()
вместо того,print()
чтобы соответствоватьprompt()
).Perl, 128
Это не совсем конкурентоспособно рядом с другим ответом Perl, но исследует другой (неоптимальный) путь.
Символы учитываются как diff для простого
perl -e ''
вызова.источник
Python, 161 символов:
источник
PHP,
439265263262244240 символовЭтот код должен работать с stdin, хотя он не тестируется с stdin.
Он был протестирован во всех случаях, вывод (и код) для последнего здесь:
http://codepad.viper-7.com/fGbnv6
Ungolfed,
314330326 символовисточник
flex - 157
Если вы не знакомы, скомпилируйте с
flex rpn.l && gcc -lfl lex.yy.c
источник
Питон, 130 символов
Было бы 124 символа, если мы отбросили
b and
(чего не хватает в некоторых ответах Python). И это включает в себя 42!источник
Python 3,
126132 знакаУже были более лучшие решения, но теперь, когда я написал его (конечно, не прочитав предыдущие материалы - хотя я должен признать, что мой код выглядит так, как будто я их копировал вместе), я хотел поделиться им, слишком.
источник
b/a
должно быть заменено наa and b/a
, иначе это решение не будет работать, если второй операнд равен 0 (например4 0 -
).C99 GCC 235
Это работает для меня (с предупреждениями):
Но если вы компилируете его с помощью mingw32, вам нужно отключить глобализацию (см. Https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ), скомпилировав его так:
Если вы не * автоматически расширяется с помощью CRT mingw32.
Кто-нибудь знает, как повернуть
break;case'*':s[--d]*=s[d+1];
в макрос, который принимает символ + в качестве параметра, потому что тогда все четыре случая будут простоO(+)O(-)O(*)O(/)
источник
C
232229 байтВеселье с рекурсией.
Ungolfed:
Тестовые случаи:
источник
JavaScript ES7, 119 байт
Я получаю ошибку с массивами, поэтому я использовал
.map
Попробуйте онлайн на ESFiddle
источник
PHP - 259 символов
Предполагая ввод в переменной POST i .
источник
C # - 392 символа
Однако, если аргументы могут использоваться вместо стандартного ввода, мы можем свести его к
C # - 366 символов
источник
Scala
412 376 349 335312:источник
Питон - 206
Безголовая версия:
Ввод из аргумента командной строки; вывод на стандартный вывод.
источник
ECMAScript 6 (131)
Просто наберите вместе за несколько секунд, так что, возможно, вы сможете продолжить игру в гольф или даже лучше. Я мог бы вернуться к нему завтра
источник
C # -
323284241Изменить: замена стека массивом намного короче
Edit2: заменил ifs троичным выражением
источник
string[] i
=>string[]i
.Python 2
Я опробовал несколько разных подходов к тем, которые опубликованы до сих пор. Ни один из них не такой короткий, как лучшие Python-решения, но они все еще могут быть интересны некоторым из вас.
Используя рекурсию, 146
Использование манипуляции со списком, 149
Использование
reduce()
, 145источник
Матлаб, 228
Ungolfed:
источник
;
. Так что я думаю, что количество байтов одинаковоcr+lf
для новой строки, которая состоит из 2 символов. Мой блокнот ++ насчитывал 230 символов в вашей 3-строчной версии, но только 128, если я вставил все в одну строку (удалил 2 * 2 = 4 символа из 2 новых строк и добавил две;
). Попробуйте сами;)К5, 70 байт
Я не уверен, когда K5 был выпущен, так что это может не учитываться. Все еще потрясающе!
источник