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.
Respuestas:
Aprovecha el desverbosificador
Usar el desverbosificador significa que puede escribir en ASCII (
--dv
o--deverbosify
desverbosificar,-v
o--verbose
ejecutar 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
-vl
o-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.fuente
-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.Usar sobrecargas
Por ejemplo, muchos comandos solo necesitan un argumento:
Rectangle
,Oblong
yBox
haga un cuadrado si solo se da un argumentoReflect
comandos por defecto para reflejar a la derechaRotate
comandos predeterminados a 90 grados en sentido antihorarioPolygon
yPolygonHollow
puede aceptar una longitud lateral y multidireccional. Esto se puede usar si todos los lados tienen la misma longitud.fuente
PolygonHollow
por 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".ReflectButterfly dls
llamarReflectButterfly
a cada dirección, pero (como la wiki documenta correctamente) en realidad llamaReflectOverlap
.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⁺¹×ι²
yPlus(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.fuente
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.
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.
fuente
y
yf
son al revés de lo que he pegado? (Puede que haya leído mal las letras griegas cuando originalmente escribí esto).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:
/
podría convertirse\
después de una rotación o volteo.Reflexiones
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
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.
fuente
Transform
significa?Transform
funciona la respuesta en alguna parte.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)
fuente
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.fuente
ReflectButtterflyOverlap(:¬, Modulo(g, 2));
.)Hacer pleno uso de
Sum
Sum
tiene muchas sobrecargas prácticas:Join(..., "")
úselo..
carácter, toma la suma de los dígitos.-
cuenta que cuenta como un separador).Un efecto secundario conveniente de las dos últimas reglas es que si usa
Sum
un personaje, los dígitos1-9
se convierten en su valor y todo lo demás devuelve cero, a diferencia de loCast
que falla para los valores que no son dígitos.fuente
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.
fuente
Use Filtro para cortar el primer carácter de una matriz o cadena
Incluso si tienes suerte, utilizando
Slice
para 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 casoSlice
querrá 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.fuente