Befunge - 37 х 5 = 185 38 х 3 = 114 символов
Это ограничено целыми числами, поскольку у Befunge нет поддержки с плавающей запятой.
&v /& _ #`&# "-"$# -#< v
>~:0`!#v_:" "`! #v_:","`#^_"*"`#v_&*>
^ ># $ .# @#< >&+
объяснение
Самая большая отличительная черта Befunge состоит в том, что вместо линейного набора инструкций, как большинство языков; это двумерная сетка односимвольных инструкций, где управление может проходить в любом направлении.
Первый &
просто вводит первый номер. Затем v
и >
перенаправить элемент управления на основной путь во второй строке.
~:0`!#v_
Он вводит символ ( ~
), дублирует его ( :
), помещает ноль в стек ( 0
), выводит два верхних элемента и определяет, больше ли второй, чем первый ( `
я удивлен, что вы не можете использовать `` `, чтобы получить backticks кода. ), инвертирует истинность верхнего элемента ( !
), затем идет вправо, если он равен нулю, в противном случае - вниз ( #v_
).
По сути, он проверяет, не -1
представляет ли вход больше ввода.
># $ .# @
Если вход был -1
тогда, дублированное входное значение отбрасывается ( $
), вершина стека выводится как целое число ( .
), и программа останавливается ( @
).
:" "`! #v_
В противном случае аналогичный процесс повторяется, чтобы определить, является ли ввод меньше или равен пробелу. Если это пробел, управление падает, иначе управление движется вправо.
^ ># $ .# @#<
Если это пробел, то он перенаправляется влево ( <
); программа halt ( @
), output ( .
) и перенаправление справа ( >
) пропускаются с помощью #
; но сброс выполняется, чтобы удалить пространство из стека. Наконец, он перенаправляется вверх, чтобы начать следующее выполнение ( ^
).
:","`#^_
Если это был не пробел, то для разделения используется тот же процесс, если он идет [+, *]
или [-, \]
идет вправо и вверх соответственно.
>~ "*"`#v_&*>
^ >&+
Поскольку [+, *]
это снова разделено, чтобы определить, является ли это +
или *
. Если +
он направлен вниз, то следующим числом является input ( &
), и они добавляются ( +
), затем элемент управления оборачивается и перенаправляется на основной путь для следующего символа. Если *
тогда он вводит ( &
) и умножает ( *
), то непосредственно оборачивается.
/& _ #`&# "-"$# -#<
Ибо [-, \]
он начинается с правой стороны влево. Символ #
пропускает после них символ, поэтому начальный путь "-"`_
просто определяет, является ли он -
или /
. Если это так, /
то он продолжается влево до input ( &
) и split ( /
). Если это так, -
то он направляется вправо, снова пропуская символы, чтобы он выполнялся, в &"-"$-
результате чего число вводится ( &
), -
символ помещается в стек, затем отбрасывается ( "-"$
), а затем вычисляется вычитание ( -
). Затем элемент управления перенаправляется обратно на основной путь.