¿Qué consejos generales tienes para jugar al golf en Befunge? Estoy buscando ideas que puedan aplicarse a los problemas de golf de código en general que sean al menos algo específicos de Befunge (por ejemplo, "eliminar comentarios" no es una respuesta). Por favor, publique un consejo por respuesta.
12
Respuestas:
Cuando use un bucle de varias líneas, intente usar la mayor cantidad posible:
vs
fuente
¿Necesita soltar un valor después de un condicional (por ejemplo, porque la otra ruta depende del valor, pero esta no)? En lugar de usar
>$
o$<
, aproveche el hecho de que conoce el valor verdadero de la variable y use_
en su lugar tanto para cambiar la dirección como para apilar.Ejemplo
se convierte en
fuente
No olvides que
0
siempre está en la pila. Por ejemplo, esto significa que, con una pila vacía,g
es equivalente a00g
yp
es equivalente a000p
.fuente
Si necesita ingresar un número mayor que 15, use
'
para obtener el valor ASCII del siguiente carácter:empujar 42 en lugar de:
fuente
67*
también funciona'
instrucción.En lugar de usar
|
, requiriendo otra línea (a menudo con muchos espacios adicionales), intente usarj
. Por ejemplo:se detendría si el número en la parte superior de la pila fuera negativo y de lo contrario continuaría adelante. Si necesita múltiples caracteres, uso
n*j
, donden
es el número de caracteres que se necesita cuando el valor pasado aj
es0
. Ejemplo:lo que negaría un número negativo.
fuente
j
instrucción.En Befunge-93, si lo primero que empujas en la pila es una cuerda, a menudo puedes saltarte la cita de apertura. Por ejemplo esto:
podría simplificarse a esto:
Pruébalo en línea!
Lo que sucede es que el intérprete primero intenta ejecutar los caracteres en la cadena sin comillas. Los
!
lleva a cabo un inofensivo no , y eli
yH
no son instrucciones válidas, por lo que son ignorados (aunque en algunas implementaciones puede recibir una advertencia).Cuando
"
se encuentra, se considera el inicio de la cadena, pero debido a que no hay una cita de cierre, se envuelve todo el campo de juego hasta que"
se encuentra por segunda vez. Lo que termina empujado a la pila es entonces esto:Sin embargo, dado que solo nos preocupamos por los últimos personajes, ninguna de esas otras cosas importa. Entonces, después de la cita, finalmente podemos ejecutar los tres
,
comandos, escribir el mensaje y el@
comando, que sale.Tenga en cuenta que esto no suele funcionar en Befunge-98, ya que una instrucción no reconocida hará que el intérprete reflexione en lugar de ignorarla.
fuente
",,,@!iH
. Tenga en cuenta que Pyfunge agrega un espacio extra, mientras que FBBI no.En Befunge-93, a menudo puede ser ventajoso aplanar un bucle en una sola línea, con la sección de bucle del código ejecutándose en ambas direcciones.
Por ejemplo, considere el siguiente código, que genera la letra
a
ocho veces:Esto se puede aplanar en una sola línea intercalando la secuencia del bucle con las instrucciones del puente (
#
):Pruébalo en línea!
Si solo está mirando los caracteres que no son espacios en blanco, puede tener la impresión de que es más largo que el original. Pero una vez que tiene en cuenta el salto de línea y el relleno adicional requerido en la versión de dos líneas, en realidad termina ahorrando cuatro bytes.
En este caso particular, el código se comprime aún más al observar que esa secuencia
:#:
simplemente se puede reemplazar con:
.Pruébalo en línea!
De hecho, cada vez que repita la misma instrucción a cada lado de un
#
comando, puede simplificar eso a una sola instrucción, por lo que esto es algo que siempre debe tener en cuenta al aplanar un bucle.Para entender cómo funciona esto, puede ayudar escribir la secuencia del bucle dos veces, una con todos los caracteres que siguen a los
#
eliminados (es decir, lo que sucede cuando se ejecuta de izquierda a derecha) y una vez con los caracteres que preceden a los#
eliminados (es decir, ejecutar de derecha a izquierda )Ahora puede ver claramente cómo esto coincide con la versión original de dos líneas del código.
fuente
Salida por código de salida, donde este es un formulario de salida permitido. Si el desafío le pide que imprima un número, puede guardar un byte al finalizar el programa con en
q
lugar de.@
fuente
q
instrucción tenía una función diferente (modo de cola) o no era compatible.En Befunge-93, el comando de entrada de caracteres (
~
) a menudo se puede usar como un atajo para -1, ya que ese es el valor que devuelve en EOF.Como ejemplo, el siguiente código generará -1:
Pruébalo en línea!
Esto no se recomienda en el código de producción, ya que cuando se ejecuta en un entorno interactivo, el programa se detendría y esperaría la entrada del usuario. Y, obviamente, si el usuario ingresara algo, el resultado ya no sería -1.
Dicho esto, la regla en PPCG es que un programa puede asumir una secuencia de entrada vacía , y así es como normalmente se ejecutaría en TIO .
También tenga en cuenta que no necesariamente se le impide usar este truco solo porque su programa necesita leer algo de la secuencia de entrada. Solo tiene que asegurarse de procesar sus entradas por adelantado, después de lo cual todos los usos futuros de
~
deberían devolver -1.fuente
Use la dirección de la IP cuando trate con
_
o|
, en lugar de usar un carácter adicional para!
.Ejemplo real (de esta publicación ):
Se puede cambiar a
fuente
No olvide que
0k
no ejecuta la siguiente instrucción. Esto significa que en lugar de hacer:Puedes guardar un personaje haciendo
fuente
k
instrucción.No te olvides del
k
operador. En lugar de"!dlroW olleH",,,,,,,,,,,,@
hacerlo"!dlroW olleH"bk,@
. Tenga en cuenta quek
hace el funcionamiento de la célula que es en lo que9k,
se imprimiría no 9 veces, pero 10; 9 veces con elk
, y una vez con,
.fuente
k
instrucción.Al insertar números pequeños en la pila, probablemente puedas darte cuenta con la suficiente facilidad que
45*
te atrapará20
y67*
te atrapará42
. Sin embargo, cuando se trata de números más grandes, realmente necesita un programa que pueda calcular la representación más eficiente para usted.La opción más fácil para esto es la interfaz en línea de Mike Schwörer para BefunRep . Simplemente escriba un número y escupirá una representación Befunge equivalente. No siempre es el más óptimo, pero está lo suficientemente cerca, y es casi seguro que sea mejor que cualquier cosa que se te ocurra a mano.
El sistema en línea está limitado a números en el rango de 0 a 16777215, por lo que si necesita algo más grande que eso, querrá descargar la utilidad BefunRep independiente y ejecutar los cálculos usted mismo.
Si está programando en Befunge-98, otra opción a considerar es Fungify . En general, no es tan óptimo como BefunRep, pero para algunos de los números más bajos, donde los dígitos hexadecimales y los caracteres de comillas simples son más efectivos, a veces puede producir mejores resultados.
fuente
'
. Por ejemplo42
:'*