Befunge - 37 x 5 = 185 38 x 3 = 114 caracteres
Isso é limitado a números inteiros, pois o Befunge não possui suporte a ponto flutuante.
&v /& _ #`&# "-"$# -#< v
>~:0`!#v_:" "`! #v_:","`#^_"*"`#v_&*>
^ ># $ .# @#< >&+
Explicação
A maior característica distintiva do Befunge é que, em vez de ser um conjunto linear de instruções, como a maioria dos idiomas; é uma grade 2D de instruções de caracteres únicos, onde o controle pode fluir em qualquer direção.
O primeiro &
simplesmente digita o primeiro número. O v
e>
seguida, redirecione o controle para o caminho principal na segunda linha.
~:0`!#v_
Isso insere um caractere ( ~
), duplica-o ( :
), empurra zero para a pilha ( 0
), exibe os dois elementos superiores e determina se o segundo é maior que o primeiro (`
estou surpreso que você não possa usar `` para obter backticks de código. ), inverte a veracidade do elemento superior ( !
) e, então, vai para a direita se for zero; caso contrário, para baixo ( #v_
).
Basicamente, está verificando se a entrada -1
não representa mais entrada.
># $ .# @
Se a entrada foi -1
, o valor duplicado é descartado ( $
), a parte superior da pilha é exibida como um número inteiro (.
) e o programa é interrompido ( @
).
:" "`! #v_
Caso contrário, um processo semelhante é repetido para determinar se a entrada é menor ou igual a um espaço. Se for um espaço, o controle será desativado; caso contrário, o controle será direcionado para a direita.
^ ># $ .# @#<
Se for um espaço, será redirecionado para a esquerda ( <
); o programa halt ( @
), output ( .
) e redirecionamento direito ( >
) são todos ignorados usando #
; mas o descarte é executado para remover o espaço da pilha. Finalmente, ele é redirecionado para iniciar a próxima execução ( ^
).
:","`#^_
Se não fosse um espaço, o mesmo processo é usado para dividir se estiver dentro [+, *]
ou [-, \]
indo para a direita e para cima, respectivamente.
>~ "*"`#v_&*>
^ >&+
Pois [+, *]
é novamente dividido para determinar se é um +
ou a *
. Se +
for direcionado para baixo, o próximo número será inserido ( &
) e eles serão adicionados ( +
), o controle se moverá e será redirecionado para o caminho principal do próximo caractere. Se, *
então, ele entra ( &
) e multiplica (*
), então envolve diretamente.
/& _ #`&# "-"$# -#<
Para [-, \]
isso começa no cabeçalho direito à esquerda. Eles #
pulam o caractere depois deles, então o caminho inicial é o "-"`_
que simplesmente determina se é -
ou /
. Se for, /
então continua a esquerda para inserir ( &
) e dividir ( /
). Se estiver, -
então ele vai para a direita, pulando novamente os caracteres para que seja executado, &"-"$-
resultando no número que está sendo inserido ( &
), o -
caractere sendo empurrado para a pilha e depois descartado ( "-"$
) e, em seguida, a subtração sendo calculada ( -
). O controle é então redirecionado de volta ao caminho principal.