¿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.
code-golf
tips
whitespace-language
Loovjo
fuente
fuente
Respuestas:
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.fuente
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.fuente
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)
fuente
La secuencia vacía es una etiqueta válida.
[LF][Space][Space][LF]
(Control de flujo - Marcar con la etiqueta '') crea una etiqueta vacía que es un objetivo válido para saltos o llamadas de subrutina. Esto ahorra un byte al declarar la etiqueta y un byte cada vez que se llama.( Observado en la respuesta de espacios en blanco para implementar una máquina de verdad )
fuente
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 .
(
STN
usado 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' esSSSTTTTSTSN
). 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):
NSSN
(Crea una Label_0; básicamente iniciando el ciclo)SSSTTSSTSSN
(Empuje la cantidad fija 100)TSSS
(Agregue los dos valores superiores de la pila juntos)TNSS
(Pop e imprima el valor ahora correcto como carácter)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 ell
inHello
), o copiar valores de otra posición aún se puede usar además de esto para jugar más bytes.fuente
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).
fuente
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.fuente
Copiar enteros anteriores puede ser más corto que crear nuevos
(
STN
usado 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 ).fuente