Дано арифметическое выражение, которое может включать скобки ( ()
), экспоненты ( ^
), деление ( /
) и умножение ( *
), сложение ( +
) и вычитание ( -
) (в таком порядке работы), например
a ^ (2 / 3) * 9 * 3 - 4 * 6
выведите то же выражение в префиксной записи.
(- (* (* (^ a (/ 2 3)) 9) 3) (* 4 6))
Пробелы необязательны как для ввода, так и для вывода. Вы можете предположить, что все операторы являются левоассоциативными и что все числа в выражении являются однозначными целыми числами (т.е. [0-9]
).
Это сложная задача для гольфа, поэтому выигрывает самое короткое решение.
3+4-5+6 = (((3+4)-5)+6)
или((3+4)-(5+6))
?*
и/
имеют тот же приоритет, что и+
amd-
.Ответы:
Рубин 1,9 - 134
Довольно зло, но это работает:
источник
Питон, 222 символа
Подобно Ruby, за исключением того, что Python не позволяет вам переопределять глобальные операции, только операции класса.
источник
Perl 6 (146 | 150)
Самый простой способ сделать это - просто заменить подпрограммы, которые реализуют операторы, на новые.
Абсолютное минимальное количество байтов для этого:
146 байт, хотя в Perl 6 более логично считать графемы.
Это предполагает, что « вывод одного и того же выражения в префиксной нотации » может просто ссылаться на результат выражения, а не обязательно на вывод программы.
Вам нужно будет добавить
say
перед выражением, чтобы программа напечатала его в STDOUT. (150 байт)источник
Unix TMG , 189 байт
Решение почти прямо из руководства по языку, только с базовым гольфом.
Expanded:
источник