Вы должны написать программу для оценки строки, которая будет введена в калькулятор.
Программа должна принимать ввод и выводить правильный ответ. Для языков, которые не имеют стандартных функций ввода / вывода, вы можете принять на себя функции readLine
и print
.
Требования
- Не использует какие-либо "eval" функции
- Может обрабатывать числа с плавающей запятой и отрицательные числа
- Поддерживает как минимум операторы +, -, * и /
- Может обрабатывать ввод, содержащий один или несколько пробелов между операторами и числами
- Оценивает выражение слева направо
Программа, которая является самой короткой, побеждает. В случае ничьей первая программа выигрывает.
Вы можете предположить, что ввод действителен и соответствует правильному формату
Тестовые случаи
вход
-4 + 5
Выход
1
вход
-7.5 / 2.5
Выход
-3
вход
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Выход
-12
code-golf
math
arithmetic
Кевин Браун
источник
источник
Ответы:
Рубин -
74696765 символовисточник
b[0],b[1].to_f
можно заменить|b|
с|b,c|
и использованиеb,c.to_f
a.send(b,c.to_f)
, чтобы использоватьa.send b,c.to_f
. Это спасает чар$<
вместоARGF
Befunge -
37 х 5 = 18538 х 3 = 114 символовЭто ограничено целыми числами, поскольку у Befunge нет поддержки с плавающей запятой.
объяснение
Самая большая отличительная черта Befunge состоит в том, что вместо линейного набора инструкций, как большинство языков; это двумерная сетка односимвольных инструкций, где управление может проходить в любом направлении.
Первый
&
просто вводит первый номер. Затемv
и>
перенаправить элемент управления на основной путь во второй строке.Он вводит символ (
~
), дублирует его (:
), помещает ноль в стек (0
), выводит два верхних элемента и определяет, больше ли второй, чем первый (`
я удивлен, что вы не можете использовать `` `, чтобы получить backticks кода. ), инвертирует истинность верхнего элемента (!
), затем идет вправо, если он равен нулю, в противном случае - вниз (#v_
).По сути, он проверяет, не
-1
представляет ли вход больше ввода.Если вход был
-1
тогда, дублированное входное значение отбрасывается ($
), вершина стека выводится как целое число (.
), и программа останавливается (@
).В противном случае аналогичный процесс повторяется, чтобы определить, является ли ввод меньше или равен пробелу. Если это пробел, управление падает, иначе управление движется вправо.
Если это пробел, то он перенаправляется влево (
<
); программа halt (@
), output (.
) и перенаправление справа (>
) пропускаются с помощью#
; но сброс выполняется, чтобы удалить пространство из стека. Наконец, он перенаправляется вверх, чтобы начать следующее выполнение (^
).Если это был не пробел, то для разделения используется тот же процесс, если он идет
[+, *]
или[-, \]
идет вправо и вверх соответственно.Поскольку
[+, *]
это снова разделено, чтобы определить, является ли это+
или*
. Если+
он направлен вниз, то следующим числом является input (&
), и они добавляются (+
), затем элемент управления оборачивается и перенаправляется на основной путь для следующего символа. Если*
тогда он вводит (&
) и умножает (*
), то непосредственно оборачивается.Ибо
[-, \]
он начинается с правой стороны влево. Символ#
пропускает после них символ, поэтому начальный путь"-"`_
просто определяет, является ли он-
или/
. Если это так,/
то он продолжается влево до input (&
) и split (/
). Если это так,-
то он направляется вправо, снова пропуская символы, чтобы он выполнялся, в&"-"$-
результате чего число вводится (&
),-
символ помещается в стек, затем отбрасывается ("-"$
), а затем вычисляется вычитание (-
). Затем элемент управления перенаправляется обратно на основной путь.источник
Python 3, 105 байт
Управляет четырьмя основными операциями, но для добавления
^
или стоит всего 5 символов каждая%
.Приоритет операций слева направо.
источник
Питон (156)
источник
C -
168126 знаковисточник
Tcl 8,6,
5748 символов.Ввод из аргументов:
От Стдина (
6453 )Вы должны использовать интерактивную оболочку для обоих решений.
Я рассматриваю входные данные как список (Tcl использует пробелы в качестве разделителя), беру первый элемент и присваиваю его
a
, затем перехожу по остальным, беря 2 элемента каждый раз, оператор и второе число, применяю оператор$a
и$b
и назначаю результат кa
. В конце концов результат вa
.источник
lmap
такforeach
что это хорошая замена.Haskell:
124114 символовДовольно простой ответ, использующий сопоставление с образцом и простую инструкцию для тяжелой работы. Использование:
источник
((case m of{..})(read u)(read b))
тебя можно написать((case m of{..}$read u)$read b)
, на 2 символа меньше.C:
111108 символовОн выполняет все требования, использование:
источник
~scanf
можно заменить+1
. Также,c^45
->c%5
иc^42
->c%2
должно работать.C ++ 0x
205203198194 символаКрасиво отформатирован:
источник
Perl (97)
читать из аргументов
читать из ввода
источник
PostScript (145)
Еще одна запись PostScript (спасибо luser droog за то, что выкопал гольф, интересный для PostScript!):
Un-golfed:
источник
Питон - 308
Читаемая версия:
Принимает выражение в качестве аргумента командной строки, выводит на стандартный вывод.
источник
Постскриптум (340)
И немного более читабельно:
источник
JavaScript (сжато 208 символов)
Для ясности, это код до того, как я его сжал ( JS-Fiddle of it ):
Здесь он сжат до 208 символов ( JS-Fiddle of it ):
Поскольку я заканчиваю строки точкой с запятой, все удаляемые пробелы игнорировались при подсчете символов, но оставлялись для ясности.
источник
Хаскель - 124
Результат будет завернут в
Maybe
монадуТакже требуется импорт
<*>
изControl.Applicative
, но импорт может быть выполнен вне кода, поэтому я надеюсь, что это разрешено.источник
C #
(234)(231)(229)(223)(214)источник
JavaScript (87 символов)
источник
Java 11, 151 (как лямбда-функция)
Лямбда-функция принимает строковый ввод и выводит число с плавающей точкой.
Попробуйте онлайн.
Java 11, 241 байт (как полная программа с запрашиваемым вводом / выводом)
Полная программа, принимающая String-line через STDIN и выводящая в STDOUT.
Попробуйте онлайн.
Объяснение:
источник
05AB1E , 30 байтов
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Если
eval
встроенная функция была разрешена, это может быть альтернативный подход ( 16 байт ):Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Это изменится
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
на"((((((-2)+6)/2)*8)-1)/2.5)-18"
перед использованиемeval
встроенной функции (использование.E
напрямую даст оператору приоритет*/
над+-
, поэтому сначала выполняется преобразование с круглыми скобками).источник