Consejos para jugar al golf en carbón


15

Charcoal es un lenguaje creado solo por ASCII y DLosc que se especializa en desafíos de arte ASCII.

¿Qué consejos tienes para jugar al golf en carbón? Obviamente, estoy buscando consejos relacionados específicamente con el carbón vegetal, no aquellos que se pueden aplicar a la mayoría, si no a todos, los idiomas.


A la mierda, voy a tratar de hacer una respuesta de carbón en algo, brb. Tal vez pueda dar pequeños consejos sobre este hilo.
Urna mágica del pulpo

Respuestas:


5

Aprovecha el desverbosificador

Usar el desverbosificador significa que puede escribir en ASCII ( --dvo --deverbosifydesverbosificar, -vo --verboseejecutar como código detallado). Además, comprime cadenas para usted, lo que puede ser útil en algunos desafíos de arte ASCII cuando la cadena para comprimir es demasiado larga.

@Neil recomienda usar -vlo -v --sl. Esto es la abreviatura de --verbose --showlength, lo que significa que se interpretará como carbón vegetal detallado, y se mostrará la longitud del código normal de carbón vegetal. Además, cuando desverbosifique, verifique la salida para asegurarse de que la entrada se haya analizado correctamente, ya que el carbón generalmente ignora los errores de análisis. Si no es un error de sintaxis, el uso -a( --astify) o --oa( --onlyastify) para ayudar a determinar el problema.


Además de esto, recomiendo usar -v -sl. Además, al desverbosificar, verifique la salida para asegurarse de que la entrada realmente se analizó correctamente, ya que no siempre obtiene un error de análisis.
Neil

3

Usar sobrecargas

Por ejemplo, muchos comandos solo necesitan un argumento:

  • Rectangle, Oblongy Boxhaga un cuadrado si solo se da un argumento
  • Reflect comandos por defecto para reflejar a la derecha
  • Rotate comandos predeterminados a 90 grados en sentido antihorario
  • Polygony PolygonHollowpuede aceptar una longitud lateral y multidireccional. Esto se puede usar si todos los lados tienen la misma longitud.

Descubrí ese hecho PolygonHollowpor accidente. Incluso puede tener varios multidireccionales, pero tienen que venir antes que las flechas normales (no sé si esta limitación es intencional). Lo utilicé en mi respuesta al desafío "Dibujar un cubo".
Neil

Hmm, la limitación es un poco intencional, pero creo que debería cambiarla porque de todos modos no dolería
Solo ASCII

Te veo arreglado Polygon para aceptar flechas y multidireccionales en cualquier orden, ¡gracias! Mientras estoy aquí, esperaba ReflectButterfly dlsllamar ReflectButterflya cada dirección, pero (como la wiki documenta correctamente) en realidad llama ReflectOverlap.
Neil

@Neil lol oops, intentaré arreglarlo lo antes posible (creo que también es una coincidencia jaja)
Solo ASCII

3

Evite constantes consecutivas del mismo tipo.

Por ejemplo, Plus(Times(i, 2), 1)se traduce como ⁺×鲦¹, pero puede guardar un byte al cambiar los parámetros: Plus(1, Times(i, 2))se traduce como ⁺¹×ι²y Plus(Times(2, i), 1)como ⁺ײι¹ambos de los cuales guardar un byte. Plus(1, Times(2, i))(que se traduce como ⁺¹×²ι) sería aún mejor si hubiera otra constante numérica que lo siguiera.


3

Use las variables predefinidas

Aquí hay una lista de todas las variables que se pueden usar, dando la sucinta letra griega y la letra detallada que la representa.

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

Las variables que representan entradas estarán vacías si no existe suficiente entrada, pero todas las demás variables que no se muestran aquí deben asignarse antes de su uso.


Esto debería solucionarse en TIO ahora, sería bueno si pudieras verificar que funciona
solo ASCII el

@ Solo ASCII ¿Puede confirmar eso yy fson al revés de lo que he pegado? (Puede que haya leído mal las letras griegas cuando originalmente escribí esto).
Neil

Sí, son al revés
solo ASCII el

3

Aprende tus reflejos y rotaciones

Hay muchas variaciones de la reflexión básica y la rotación, por lo que vale la pena saber cuáles son las diferencias sutiles. Clave para las mesas:

  • Comando: nombre del comando en modo detallado.
  • Transformar: si Charcoal debería intentar voltear o rotar a los personajes mientras los refleja o gira. Por ejemplo, un /podría convertirse \después de una rotación o volteo.
  • Mantener original: si el carbón debe fusionar el resultado con el lienzo original.
  • Superposición: (Solo se aplica cuando Conservar original es Sí). Determina la posición del eje de reflexión / rotación, en la mitad de los caracteres desde el borde. En el caso de reflexiones, equivalente al número de filas / columnas que no se ven afectadas y terminan en el medio del resultado. En el caso de rotaciones, la copia rotada puede sobrescribir áreas claras (pero no espacios) en el original.

Reflexiones

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

La dirección de reflexión es opcional. El valor predeterminado es reflejar una vez a la derecha. Para aquellas reflexiones que mantienen el original, se permite una dirección múltiple, que simplemente repite el comando para cada dirección. (Esto significa que, por ejemplo ReflectMirror(:¬), creará cuatro copias en total).

El cursor se mueve junto con el reflejo (incluso cuando se mantiene el original).

Rotaciones

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

Para aquellas rotaciones que mantienen el original, existe un origen opcional de rotación. El valor predeterminado es la esquina inferior derecha del lienzo. Los valores permitidos son cualquiera de las direcciones diagonales.

La cantidad de rotación (en incrementos de 45 °) es opcional. El valor predeterminado es 2, es decir, 90 ° en sentido antihorario (en sentido antihorario). Para aquellas rotaciones que mantienen el original, hay dos opciones alternativas: un número entero de múltiples dígitos especifica rotar el lienzo una vez por cada dígito y luego fusionar los resultados, mientras que una lista entera simplemente repite el comando para cada rotación, con resultados variables dependiendo de cómo el lienzo cambia en el medio.


Pregunta: ¿Qué Transformsignifica?
CalculatorFeline

@CalculatorFeline Buena pregunta. Los casos en que Transform es no son simplemente una copia de carácter por carácter. Por ejemplo, un reflejo estándar de "4> 2" son solo los caracteres en orden inverso, es decir, "2> 4". Esto no siempre es deseable, por lo que Transformar intenta cambiar los caracteres de la manera más adecuada, por lo que el reflejo de "4> 2" se convertiría en "2 <4". La transformación puede no ser la mejor descripción de esto, así que siéntete libre de sugerir algo mejor.
Neil

No se me ocurre nada mejor, por lo que debería explicar cómo Transformfunciona la respuesta en alguna parte.
CalculatorFeline

@CalculatorFeline He agregado una clave a la tabla, por si las otras columnas tampoco estaban claras.
Neil

Los errores deberían ser reparados ahora. ¡También muchas gracias por tomarse el tiempo para escribir esta explicación!
Solo ASCII

2

Usar comandos sin un carácter de comando

Se imprime una expresión que no es parte de un comando.
Si está precedido por una dirección, la expresión se imprime en la dirección especificada.
Los números se imprimen como una línea con la longitud especificada utilizando un carácter seleccionado de \/-|.

Si una dirección no es seguida por una expresión, se cuenta como un movimiento un espacio en la dirección especificada.

Nota: Esto a veces puede contarse como parte del comando anterior, por lo que el carácter del comando puede ser realmente requerido. (gracias Neil por recordármelo)


1
Sin embargo, debe tener cuidado con las ambigüedades porque el comando anterior puede aceptar un parámetro opcional.
Neil

2

Usa multidireccionales

Algunos comandos pueden aceptar multidirectionals: +X*|-\/<>^KLTVY7¬⌊⌈. A lo que se expanden está aquí . En general, la lista de direcciones comienza desde arriba y continúa en sentido horario.


¿Alguna razón particular por la que algunos comandos aceptan multidireccionales pero otros requieren una lista de direcciones? (Puede haber una buena razón para esto que estoy pasando por alto, pero estaba tratando de hacerlo ReflectButtterflyOverlap(:¬, Modulo(g, 2));.)
Neil

@Neil, no lo creo, cambiará lo antes posible
solo ASCII el

0

Hacer pleno uso de Sum

Sum tiene muchas sobrecargas prácticas:

  • En una lista de cadenas, las concatena juntas. Sin embargo, si es posible que la lista esté vacía, esto daría Ninguno, así que en este caso, Join(..., "")úselo.
  • En una lista de números no vacía, simplemente toma su suma.
  • En una lista de listas no vacía, las concatena juntas (se aplana hasta la profundidad 1).
  • En un entero, toma la suma de sus dígitos. (Los valores de coma flotante se truncan a entero. Si desea la suma de los lugares decimales, convierta primero a cadena).
  • En una cadena que contiene solo dígitos y opcionalmente un .carácter, toma la suma de los dígitos.
  • En una cadena que contiene números y separadores, toma la suma de los números emitidos a int o float (pero tenga en -cuenta que cuenta como un separador).

Un efecto secundario conveniente de las dos últimas reglas es que si usa Sumun personaje, los dígitos 1-9se convierten en su valor y todo lo demás devuelve cero, a diferencia de lo Castque falla para los valores que no son dígitos.


0

Use dividir para una matriz de cadenas, dividir y emitir para una matriz de números

Dividir para una matriz de cadenas tiene solo tres caracteres de sobrecarga, y dividir y emitir solo tiene cuatro caracteres de sobrecarga. Compare esto con escribir la matriz literalmente, lo que requeriría el inicio y el final de la matriz, y un separador entre cada elemento de la matriz.

Si su matriz de números solo tiene números menores que 95, use un molde (si todos los números son menores que 10) o indexe en una de las variables predefinidas.


0

Use Filtro para cortar el primer carácter de una matriz o cadena

Incluso si tienes suerte, utilizando Slicepara cortar el primer carácter de una cadena tarda 2 bytes: Slice(..., 1). Tomará más tiempo si la expresión que se va a dividir termina en un número, lo que requiere un separador, o si el siguiente código puede interpretarse como una expresión, ya que en ese caso Slicequerrá consumirlo como un parámetro adicional.

En cambio, solo use Filter(..., k), que suelta el primer elemento, logrando así el resultado deseado. (Obviamente, use la variable de índice de bucle apropiada si su expresión está anidada dentro de otro bucle). Esto siempre es de 2 bytes y no puede verse afectado por el código circundante.

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.