Befunge - 37 x 5 = 185 38 x 3 = 114 caracteres
Esto está limitado a números enteros ya que Befunge no tiene soporte de coma flotante.
&v /& _ #`&# "-"$# -#< v
>~:0`!#v_:" "`! #v_:","`#^_"*"`#v_&*>
^ ># $ .# @#< >&+
Explicación
La mayor característica distintiva de Befunge es que, en lugar de ser un conjunto lineal de instrucciones como la mayoría de los idiomas; Es una cuadrícula 2D de instrucciones de un solo carácter, donde el control puede fluir en cualquier dirección.
El primero &
simplemente ingresa el primer número. El v
y >
luego redirige el control a la ruta principal en la segunda fila.
~:0`!#v_
Esto ingresa un carácter ( ~
), lo duplica ( :
), empuja cero a la pila ( 0
), muestra los dos elementos superiores y determina si el segundo es mayor que el primero ( `
me sorprende que no pueda usar `` para obtener código backticks. ), invierte la veracidad del elemento superior ( !
), luego va a la derecha si es cero, de lo contrario hacia abajo ( #v_
).
Básicamente es verificar si la entrada -1
no representa más entradas.
># $ .# @
Si la entrada fue -1
entonces, el valor de entrada duplicado se descarta ( $
), la parte superior de la pila se emite como un entero ( .
) y el programa se detiene ( @
).
:" "`! #v_
De lo contrario, se repite un proceso similar para determinar si la entrada es menor o igual que un espacio. Si es un espacio, entonces el control se cae, de lo contrario, los cabezales de control están a la derecha.
^ ># $ .# @#<
Si es un espacio, se redirige a la izquierda ( <
); el programa halt ( @
), output ( .
) y right redirection ( >
) se omiten usando #
; pero el descarte se ejecuta para eliminar el espacio de la pila. Finalmente se redirige para comenzar la próxima ejecución ( ^
).
:","`#^_
Si no era un espacio, el mismo proceso se usa para dividir si está dentro [+, *]
o dentro[-, \]
entrando yendo hacia la derecha y hacia arriba respectivamente.
>~ "*"`#v_&*>
^ >&+
Porque [+, *]
nuevamente se divide para determinar si es a +
o a *
. Si +
se dirige hacia abajo, el siguiente número es input ( &
) y se agregan ( +
), el control se envuelve y se redirige a la ruta principal para el siguiente carácter. Si *
luego ingresa ( &
) y multiplica ( *
), entonces se envuelve directamente.
/& _ #`&# "-"$# -#<
Porque [-, \]
comienza por la derecha en dirección a la izquierda. Se #
omiten los caracteres después de ellos, por lo que la ruta inicial es la "-"`_
que simplemente determina si es -
o /
. Si es /
así, continúa a la izquierda para ingresar ( &
) y dividir ( /
). Si es -
así, se dirige hacia la derecha, nuevamente omitiendo caracteres para que se ejecute, lo que da como &"-"$-
resultado que se ingrese el número ( &
), el -
carácter se empuje a la pila y luego se descarte ( "-"$
) y luego se calcule la resta ( -
). El control se redirige a la ruta principal.