Befunge - 37 x 5 = 185 38 x 3 = 114 znaków
Jest to ograniczone do liczb całkowitych, ponieważ Befunge nie obsługuje zmiennoprzecinkowych.
&v /& _ #`&# "-"$# -#< v
>~:0`!#v_:" "`! #v_:","`#^_"*"`#v_&*>
^ ># $ .# @#< >&+
Wyjaśnienie
Największą cechą wyróżniającą Befunge jest to, że zamiast być liniowym zestawem instrukcji, jak większość języków; jest siatką 2d instrukcji jednoznakowych, w których kontrola może płynąć w dowolnym kierunku.
Pierwsza &
po prostu wprowadza pierwszą liczbę. v
A >
następnie przekierowanie sterowania do głównej ścieżki w drugim rzędzie.
~:0`!#v_
To wprowadza znak ( ~
), powiela go ( :
), wypycha zero na stos ( 0
), wyskakuje z górnych dwóch elementów i określa, czy drugi jest większy od pierwszego ( `
jestem zaskoczony, że nie można użyć `` '', aby uzyskać kod backticks. ), odwraca prawdziwość górnego elementu ( !
), a następnie idzie w prawo, jeśli wynosi zero, w przeciwnym razie ( #v_
).
Zasadniczo sprawdza, czy dane wejściowe -1
nie reprezentują już danych wejściowych.
># $ .# @
Jeśli dane wejściowe były -1
następnie zduplikowane wartości wejściowe są odrzucane ( $
), górna część stosu jest wyprowadzana jako liczba całkowita ( .
), a program jest zatrzymywany ( @
).
:" "`! #v_
W przeciwnym razie podobny proces powtarza się w celu ustalenia, czy dane wejściowe są mniejsze lub równe spacji. Jeśli jest to spacja, kontrola spada, w przeciwnym razie kieruj w prawo.
^ ># $ .# @#<
Jeśli jest to spacja, to przekierowuje left ( <
); program halt ( @
), output ( .
) i prawe przekierowanie ( >
) są pomijane za pomocą #
; ale odrzucenie jest wykonywane w celu usunięcia przestrzeni ze stosu. Wreszcie jest przekierowywany w celu rozpoczęcia następnego wykonania ( ^
).
:","`#^_
Jeśli nie była to spacja, ten sam proces jest używany do podziału, jeśli jest odpowiednio w [+, *]
lub w [-, \]
prawo i w górę.
>~ "*"`#v_&*>
^ >&+
Na [+, *]
to jest podzielona w celu określenia, czy jest to +
albo *
. Jeśli +
jest skierowany w dół, to wprowadzana jest następna liczba ( &
) i są one dodawane ( +
), a następnie formant zawija się i zostaje przekierowany do głównej ścieżki dla następnego znaku. Jeśli *
następnie wpisze ( &
) i mnoży ( *
), wówczas bezpośrednio się zawija.
/& _ #`&# "-"$# -#<
Ponieważ [-, \]
zaczyna się po prawej stronie po lewej stronie. #
„S pominąć znak po nich tak początkowa jest ścieżka "-"`_
, która określa, czy po prostu jest -
albo /
. Jeśli tak, /
to kontynuuje wprowadzanie ( &
) i dzielenie ( /
). Jeśli tak, -
to kieruje się w prawo, ponownie pomijając znaki, aby wykonać, &"-"$-
powodując wprowadzenie liczby ( &
), -
znak jest wypychany na stos, a następnie odrzucany ( "-"$
), a następnie obliczane jest odejmowanie ( -
). Sterowanie jest następnie przekierowywane z powrotem do głównej ścieżki.