Consejos para jugar golf en idiomas 2D

18

¿Qué consejos generales tiene para jugar al golf en lenguajes de programación bidimensionales? Estoy buscando consejos que puedan aplicarse a problemas de código de golf y que sean específicos de los lenguajes de programación 2D, pero no específicos de ningún idioma (las respuestas como "eliminar comentarios" y "usar la Moperación" no son respuestas).

Por favor, publique un consejo por respuesta.

Asistente de trigo
fuente
¿No debería esta pregunta estar en Meta?
Sr. Lister
2
Aquí hay una meta pregunta relacionada: ¿cuál es el tamaño de un programa 2D? ¿Área cubierta? Área del casco convexo? Área del rectángulo que contiene el eje alineado? Todas podrían ser mejores medidas que alguna forma de tamaño ASCII.
MSalters
Las preguntas de @MrLister Tips son sobre el tema del sitio principal. Si observa, puede ver que ya tenemos muchas preguntas bajo la etiqueta de sugerencias.
Wheat Wizard
@MSalters Al igual que cualquier otro lenguaje de programación, la longitud se mide en bytes. Algunos diseñadores de idiomas permiten que los idiomas 2D se organicen de diferentes maneras, como Hexagony o Cubix, y eso depende de ellos.
Wheat Wizard

Respuestas:

19

Evitar espacios horizontales

A menudo, el código dejará grandes espacios en blanco en el lado izquierdo del programa, así.

abc
  d
  e

Esto agrega 4 bytes, cuando esto podría evitarse alineando a la izquierda.

cde
b
a

Si necesita usar espacios grandes de espacios en blanco, intente hacerlos verticales, en lugar de horizontales.

########
#      #
#      #
#      #

vs

####
#
#
#
#
#
#
####
Un taco
fuente
11

Use una dimensión cuando sea posible

Por lo general, los programas más simples se pueden escribir en una sola línea. Por ejemplo, el programa clásico del gato podría ser:

>iv
^o<

Pero uno podría abusar del comportamiento de envoltura y hacer esto:

io

O, en idiomas sin ese comportamiento de ajuste:

> ?oi<

(Suponiendo ?que no aparece). En el caso de un lenguaje sin envoltura, un bucle explícito es a menudo mejor.

Con comandos de salto

En lenguajes 2D con comandos de salto y salto condicional, un programa podría verse así:

abc >de?v;
    ^hgf<

Esto también podría ser:

abc de?!;hgf04&

(si !es un trampolín y &salta a la posición)

Conor O'Brien
fuente
¿Tu tercer ejemplo no hace ioiioiioietc.?
Solo ASCII
@ Solo ASCII De hecho lo hace. Ups
Conor O'Brien
1
Probablemente debería indicar lo que hacen algunos de los comandos menos regulares. Por ejemplo, no sé qué io;hacer, y todo lo que sé es que ?no aparece. Parece que estos son comandos de peces, pero no creo que sean muy estándar.
Wheat Wizard
2
En algunos lenguajes 2D sin comandos de omisión condicional (como Labyrinth), a menudo también puede escribir programas de bucle de una sola línea al terminar condicionalmente el programa con una división por cero.
Martin Ender
10

Las devoluciones de carro también son bytes

Cuanto menos 2D puedas hacer, mejor. Un retorno de carro es otro no-op. Sin ignorar los consejos de @ATaco y @ ASCII solamente, intente mantener la dimensión Y lo más pequeña posible.

Esta

###
####
########

es mejor que

###
###
###
##
#
#
#
#
MickyT
fuente
Los retornos de carro no siempre son bytes. \n(avance de línea) es un final de línea que se usa regularmente en el texto alineado a la izquierda en los sistemas POSIX, aunque Windows y Mac OS (pre-macOS) usan combinaciones de \n(avance de línea) y \r(retorno de carro).
wizzwizz4
9

SECO (no te repitas)

Si bien la abstracción con funciones suele ser más larga en Code Golf, realmente puede ayudar para los lenguajes 2D. Intente volver a trabajar su código para que pueda reutilizar el mismo fragmento, ingresándolo / saliendo con dos ramas diferentes de ejecución.

Cyoce
fuente
8

Caminos intercalados

Por lo general, en un lenguaje 2D hay una IP que se mueve según los comandos de dirección. Dado que los espacios son bytes desperdiciados, casi siempre es más eficiente reorganizar el programa para que se acerque a la izquierda con la mayor frecuencia posible, lo que ahorra la necesidad de espacios de relleno innecesarios.

Solo ASCII
fuente
2

Usa espejos

Los espejos a veces se pueden usar en dos rutas al mismo tiempo (cada ruta rebota en un lado del espejo). Puede parecer que esto no ayuda, pero puede permitirle reorganizar su programa, o si tiene mucho si los cambios de dirección pueden reemplazarse con menos espejos.

Solo ASCII
fuente
2

Memoriza modismos

Aquí hay algunos "modismos" que hacen ciertas cosas, dependiendo de la naturaleza del idioma.

Código pseudo-lineal

Si alguna vez se requiere la generación dinámica de código, puede ser útil usar el modelo de código pseudo-lineal:

v
\"line 1"
\"line 2"
.
.
\"line N"

Asumiendo \y vsignificando lo que suelen hacer.

Bucle infinito

En casi todos los lenguajes 2D, ><es un bucle infinito e irrompible. Si, por alguna razón, necesita hacer esto, esta es la mejor manera, a pesar de lo agradable que pueda parecer:

>v
^<

De hecho, si convierte su código en un trazador de líneas , puede usar ^o v, como tal:

i?vo;

Esto venviará la IP a sí mismo, envolviendo. Es posible que aún pueda utilizar este enfoque en cualquier caso en el que un comando direccional apunte a una serie de operaciones no relativas (relativas).

Marco Quine

Por lo general, los idiomas con un marco de cadena / cita pueden tener una frase como esta:

<quote><generate "><output stack><terminate>

Para> <>, esto se vería así:

":1-r>o<#

Excepto que este sale con un error como terminación. Es probablemente la quine más corta > <> o, al menos, la más corta que he encontrado.

Conor O'Brien
fuente
Esto realmente no parece un consejo.
Wheat Wizard
@WheatWizard Los mantuve juntos porque dividirlos tenía menos sentido para mí, ya que todos eran modismos comunes de diseño de programas.
Conor O'Brien
¿Por qué tienes <el> <> quine?
Jo King
@JoKing No estoy particularmente seguro jajaja
Conor O'Brien
Además, "termina en el lado equivocado. El consejo es bueno, de lo contrario, he usado ese marco general en muchas de mis respuestas
Jo King