Consejos para jugar golf en espacios en blanco


14

¿Qué consejos generales tienes para jugar al golf en Whitespace? Estoy buscando ideas que se puedan aplicar a los problemas de código de golf y que también sean al menos algo específicas para el espacio en blanco (por ejemplo, "eliminar comentarios" no es una respuesta).

Por favor, publique un consejo por respuesta.


82
Eliminar espacios en blanco innecesarios.
KSFT

1
s / [^ [: espacio:]] // g
Trauma digital

Respuestas:


11

No estoy completamente seguro de si es una pregunta de broma o no, así que espero que no me burlen por tomarlo en serio, pero ...

Consejo 1: no finalice su programa

La especificación dice que un programa debe terminar con tres avances de línea [LF][LF][LF], donde el primero es el IMP de control de flujo y los dos siguientes son el comando de salida, pero muchos intérpretes simplemente ejecutarán su código sin el final apropiado. Le ahorra 3 caracteres en cualquier programa.


6

Consejo 2: use el montón lo menos posible

Solía ​​usar mucho el montón para contar mis bucles y demás, pero me di cuenta de que en realidad era extremadamente ineficiente; primero empujando una dirección, obteniendo el conteo actual, tomando / agregando una, re-empujando la dirección, etc.

Ahora solo presiono un valor en la pila para que actúe como contador de bucle, luego uso el [Space][LF][Tab]comando de intercambio para volver a él cuando lo necesito. Se necesita mucho trabajo en / alrededor, pero cuando lo obtienes realmente puede reducir tu recuento de carbonos.


5

Usar direcciones de montón arbitrarias

Muchos intérpretes le permiten leer / escribir en direcciones de montón arbitrarias en lugar de comenzar en 0 o 1 y contar hacia atrás. Puede duplicar un valor de pila existente (3 bytes) para usarlo como dirección en lugar de insertar un nuevo valor (mínimo 4 bytes)


+1. Tenga en cuenta que esto solo se aplica a las direcciones de montón no negativas. Entonces, si la parte superior de la pila es un entero negativo, no puede usarlo como dirección de montón.
Kevin Cruijssen


5

Baje todos los caracteres en una cantidad fija y agréguelo justo antes de imprimir en un bucle

Gracias a @LukStorms , que utiliza un enfoque similar en su respuesta para el desafío Hello World .

( STNusado para Espacio, Tabulador y Nueva línea respectivamente).

Empujar los valores para letras siempre es de 11 bytes (es decir, empujar el valor 65 para el carácter 'A' es SSSTSSSSSTN; empujar el valor 122 para el carácter 'z' es SSSTTTTSTSN). Cuando desea generar una gran cantidad de texto, esto puede ser costoso. En cambio, puede reducir los valores de todos los caracteres que desea imprimir en una cantidad fija, y luego en el ciclo para imprimirlos agregue esta cantidad fija.

Esto se puede hacer con el siguiente código (supongamos que el valor fijo es 100 en este caso):

  1. Empuje todos los valores para los caracteres (menos la cantidad fija 100) en orden inverso
  2. NSSN (Crea una Label_0; básicamente iniciando el ciclo)
    1. SSSTTSSTSSN (Empuje la cantidad fija 100)
    2. TSSS (Agregue los dos valores superiores de la pila juntos)
    3. TNSS (Pop e imprima el valor ahora correcto como carácter)
    4. NSNN (Salte a Label_0; vaya a la siguiente iteración del bucle)

Esto detendrá el programa con un error ( que se permite según el meta ) tan pronto como intente hacer el Add ( TSSS) sin nada más en la pila. He usado esto para jugar esta respuesta mía (ver ítems 5 y 6 de Cosas que hice para reducir el conteo de bytes ).

Si una cantidad fija de 100 es el enfoque más corto depende de lo que esté imprimiendo. @LukStorm, por ejemplo, usó 107 en su respuesta de Hello World.

Tenga en cuenta que copiar el valor superior ( SNS) para dos de los mismos caracteres adyacentes (como el lin Hello), o copiar valores de otra posición aún se puede usar además de esto para jugar más bytes.


4

Saltar a etiquetas indefinidas finaliza el programa (en algunos intérpretes)

Esto comienza a entrar en un comportamiento específico de implementación, pero creo que esto está permitido .

TIO (y posiblemente otros intérpretes? Al menos no funciona en ideone) detendrá la ejecución cuando se intente saltar a una etiqueta que no existe. Si necesita hacer una comparación para salir de un ciclo, esto le permite guardar bytes al no declarar la etiqueta de corte. (Vea mi comentario sobre Imprimir texto invisible para ver un ejemplo).


4

El valor 0 puede declararse como un número sin dígitos binarios.

El tutorial de espacios en blanco menciona que los números pueden tener cualquier número de bits / dígitos binarios de ancho. Esto significa que un número sin bits (más allá del bit de signo requerido) es una representación válida del valor 0. [Space][Space][Space][LF]y [Space][Space][Space][Space][LF]ambos empujan el valor 0 a la pila, pero el primero es un byte más corto.


0

Copiar enteros anteriores puede ser más corto que crear nuevos

( STNusado para Espacio, Tabulador y Nueva línea respectivamente).

STS+ Argumento número puede ser utilizado para copiar el n º elemento en la pila (propuesta por el argumento) en la parte superior de la pila . En algunos casos, esto puede usarse para guardar bytes.

Por ejemplo, en esta respuesta mía , expliqué en el cuarto elemento de Cosas que hice para reducir el conteo de bytes cómo copiar el primer valor (indexado a 0) ( STSSTN) es más corto que presionar 12 para crear el carácter 'p' ( SSSTTSSN) en la parte "pop"de la salida. (NOTA: utilizo el valor 12 en lugar de 112 para el carácter 'p', porque he aplicado este otro consejo para reducir todos los valores en una cantidad fija, que agregamos antes de imprimir los caracteres en el bucle ).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.