Consejos para jugar al golf en Befunge

12

¿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.

Justin
fuente
No estoy seguro de si esto debería cambiarse a Befunge en general, pero Befunge 93 es mucho menos ideal para el golf que el 98.
Justin
66
Hemos tenido un tema reciente de Befunge 93 , pero creo que sería mejor generalizar este tema. ¿Eso estaría bien? (y tal vez marque qué consejos son buenos para qué versión / s, de la misma manera que los consejos de Python dicen si son o no específicos de Python 2 / Python 3)
Sp3000

Respuestas:

9

Cuando use un bucle de varias líneas, intente usar la mayor cantidad posible:

>1234....v
^        <

vs

>1234v
^....<
Justin
fuente
7

¿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

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

se convierte en

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.
Luciérnaga
fuente
6

No olvides que 0siempre está en la pila. Por ejemplo, esto significa que, con una pila vacía, ges equivalente a 00gy pes equivalente a 000p.

Justin
fuente
5

Si necesita ingresar un número mayor que 15, use 'para obtener el valor ASCII del siguiente carácter:

'*

empujar 42 en lugar de:

4a*2+
Justin
fuente
O 67*también funciona
Pomo de la puerta
44
@Pomo de la puerta Tal vez debería haber elegido un número primo para aclarar mi punto, pero 42 es un número tan bueno.
Justin
2
Tenga en cuenta que este consejo solo se aplica a Befunge-96 y versiones posteriores. Befunge-93 no apoyó la 'instrucción.
James Holderness
4

En lugar de usar |, requiriendo otra línea (a menudo con muchos espacios adicionales), intente usar j. Por ejemplo:

01-`j@more code here

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, donde nes el número de caracteres que se necesita cuando el valor pasado a jes 0. Ejemplo:

01-`4*j01-*more code

lo que negaría un número negativo.

Justin
fuente
Tenga en cuenta que este consejo solo se aplica a Befunge-96 y versiones posteriores. Befunge-93 no apoyó la jinstrucción.
James Holderness
4

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:

"!iH",,,@

podría simplificarse a esto:

!iH",,,@

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 el iy Hno 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:

,,,@  ···72 spaces···  !iH

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.

James Holderness
fuente
En Befunge-98 puedes colocar la cadena requerida al final de la línea, así; ",,,@!iH. Tenga en cuenta que Pyfunge agrega un espacio extra, mientras que FBBI no.
Jo King
@JoKing No quería sugerir eso, porque, como usted señaló, el comportamiento difiere de un intérprete a otro. E incluso cuando parece funcionar, es inconsistente (tenga en cuenta el espacio adicional en FBBI en este caso ), por lo que es muy probable que sea un error que pueda terminar solucionado en algún momento.
James Holderness
Hmm ... Creo que el espacio podría ser parte de la especificación. Recuerdo haber leído en algún lugar que se omitirán múltiples espacios y se contarán como un solo espacio. Ejemplo en PyFunge y FBBI. FBBI parece rellenar cada línea a la longitud de la línea más larga mientras PyFunge agrega los espacios adicionales implícitamente.
Jo King
Tienes razón: la especificación dice que varios espacios en una cadena deben tratarse como un solo espacio. De hecho, esa regla se propuso específicamente para tratar el problema de envolver cadenas en un campo de juego infinito (por lo que PyFunge es claramente correcto AFAIC). Pero la descripción de las especificaciones del algoritmo de ajuste está algo abierta a la interpretación, por lo que puedo entender por qué algunas implementaciones pueden hacer las cosas de manera diferente. Pero la conclusión es que este es un problema bastante complicado, y creo que estaría mejor cubierto como un consejo separado específico para Befunge-97/98.
James Holderness
4

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 aocho veces:

"a"9>1-:#v_@
    ^\,:\<

Esto se puede aplanar en una sola línea intercalando la secuencia del bucle con las instrucciones del puente ( #):

"a"9>1#\-#,:#:>#\_@

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 :.

"a"9>1#\-#,:>#\_@

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 )

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

Ahora puede ver claramente cómo esto coincide con la versión original de dos líneas del código.

James Holderness
fuente
3

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 qlugar de.@

pppery
fuente
2
Tenga en cuenta que este consejo solo se aplica a Befunge-98 y versiones posteriores. En versiones anteriores de Befunge, la qinstrucción tenía una función diferente (modo de cola) o no era compatible.
James Holderness
3

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.

James Holderness
fuente
2

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 ):

#v~
,>:!#@_

Se puede cambiar a

#v~
:<,_@#
Justin
fuente
2

No olvide que 0kno ejecuta la siguiente instrucción. Esto significa que en lugar de hacer:

;some boolean test;!jv;code if false;
       ;code if true;<

Puedes guardar un personaje haciendo

;some boolean test;kv;code if false;
      ;code if true;<
Justin
fuente
Tenga en cuenta que este consejo solo se aplica a Befunge-98 y versiones posteriores. Las versiones anteriores de Befunge no admitían la kinstrucción.
James Holderness
1

No te olvides del koperador. En lugar de "!dlroW olleH",,,,,,,,,,,,@hacerlo "!dlroW olleH"bk,@. Tenga en cuenta que khace el funcionamiento de la célula que es en lo que 9k,se imprimiría no 9 veces, pero 10; 9 veces con el k, y una vez con ,.

Justin
fuente
1
Tenga en cuenta que este consejo solo se aplica a Befunge-98 y versiones posteriores. Las versiones anteriores de Befunge no admitían la kinstrucción.
James Holderness
1

Al insertar números pequeños en la pila, probablemente puedas darte cuenta con la suficiente facilidad que 45*te atrapará 20y 67*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.

James Holderness
fuente
Al empujar números pequeños en Befunge 98, usarías '. Por ejemplo 42:'*
Justin
@Justin mencioné eso en el último párrafo, pero el punto principal de este consejo es que no necesitas conocer muchos de estos trucos para generar números si solo usas una herramienta para hacerlo por ti.
James Holderness