Creo que las preguntas de arte ASCII sobre PPCG son divertidas de hacer, pero personalmente creo que puede ser bastante difícil, especialmente cuando la pregunta está etiquetada como código-golf .
Me pregunto si alguien aquí podría tener algunos consejos que sean útiles para producir arte ASCII.
Simplemente organizar los caracteres es fácil, pero con algoritmos (cortos), las cosas se volverán más complicadas.
Estoy hablando del arte ASCII como:
- Texto al arte ASCII (caracteres)
- Imágenes (logotipos o íconos)
Solo estoy buscando consejos generales, pero se permiten idiomas específicos, ya que la mayoría de ellos se pueden traducir de todos modos.
[0-9A-Za-z]
Busque simetría
A veces, el arte ASCII requerido es simétrico en algún momento. Por ejemplo, Argyle ASCII Art requiere una salida similar a esta:
Uno podría imprimir esto normalmente, pero dependiendo del idioma, el código requerido puede acortarse generando solo la mitad superior del resultado, invirtiéndolo e intercambiando
/
y\
.Intenta transponer
En ASCII Art Archery Arrows, el resultado para imprimir es este, escalado a un dado
n
:Si echamos un vistazo a la flecha, podemos ver que hay 8 tipos de líneas:
Probemos lo mismo para su transposición.
Aquí, hay 10 tipos de líneas.
Pero aquí está el truco: los 5 inferiores son idénticos a los 5 superiores, excepto por el intercambio
/
y\
. Según la regla anterior, primero puede generar los primeros 5, copiar, hacer el intercambio y finalmente transponer para obtener la flecha. Esto puede ahorrar mucho código.fuente
Controlar personajes, secuencias de escape y códigos de consola
A menos que la pregunta los prohíba, el consenso actual sobre Meta es que los desafíos de arte ASCII no requieren un flujo de bytes específico, sino un resultado que se ve correcto.
Esto significa que podemos usar caracteres de control ASCII , secuencias de escape ANSI y códigos de consola Linux en nuestras respuestas, suponiendo un terminal compatible.
A menos que se especifique lo contrario, el resto de esta respuesta explicará el comportamiento de los terminales de Linux, que es lo que tengo disponible para probar en este momento.
Caracteres de control ASCII
El soporte / interpretación varía de terminal a terminal y de personaje a personaje. El más portátil debería ser el salto de línea (
\n
,\x0a
), que mueve al personaje al comienzo de la siguiente línea.Otros caracteres útiles incluyen:
La pestaña vertical (
\v
,\x0b
) mueve el cursor una posición hacia la derecha, luego una posición hacia abajo.El retorno de carro (
\r
,\x0d
) mueve el cursor al comienzo de la línea actual . Cualquier carácter imprimible posterior sobrescribirá el primer carácter de la línea actual.El retroceso (
\b
,\x08
) mueve el cursor una posición hacia la izquierda. Cualquier carácter imprimible posterior sobrescribirá el carácter antes del retroceso.El escape (
\e
,\x1b
) no hace nada por sí solo, sino que forma parte de las secuencias de escape ANSI (opcionalmente) y los códigos de la consola de Linux.Muchos idiomas permiten caracteres de control reales en el código fuente.
Secuencias de escape ANSI
(está por venir)
Códigos de consola de Linux
Si bien hay muchos más, los códigos de consola más útiles para el arte ASCII son probablemente estos:
La secuencia
\ec
se restablecer el terminal. Esto borra la pantalla, mueve el cursor a la esquina superior izquierda y establece el color anterior y de fondo, la velocidad de parpadeo del cursor, etc. a sus valores predeterminados.La secuencia
\eM
provoca un salto de línea inverso , es decir, el cursor se moverá una posición hacia arriba.La secuencia
\eH
establece la tabulación en la columna actual.fuente
Busca patrones
Este puede ser un poco obvio, pero ... busque patrones, similitudes y repeticiones en la salida. Por ejemplo, cuando vi el número Transformar en una tarea de patrón de visualización de 7 segmentos , comencé a pensar en cómo se podía jugar golf y comencé a buscar similitudes. Debido a la forma en que los segmentos horizontales van entre los verticales en la matriz de caracteres, probablemente sería más fácil tratar con tres segmentos a la vez, agrupados como tales (agregando dos segmentos "siempre vacíos" para el primero, el superior) :
Por lo tanto, se podía hacer algo como
).
lc + " "*N + rc + "\n"
N-1 veces y luegolc + bc*N + rc
una vez, por cada tres segmentos (lc
,bc
,rc
siendo los caracteres izquierda arriba, abajo, a la derecha y del segmento, es decir, uno de|
,_
ofuente
Usar conversión base
Esta respuesta fue a una pregunta que quería arte ASCII que consistía en los personajes
+ |-
y las nuevas líneas. Como solo hay 5 caracteres posibles, estos pueden tratarse como un número base 5 y convertirse en bytes, con 3.45 caracteres por byte.Explotar regularidades
A menudo, los datos tendrán algunas regularidades, incluso si esas regularidades no son lo suficientemente fuertes como para emplear herramientas específicas como la duplicación. Por ejemplo, en la pregunta anterior, el resultado deseado tenía líneas nuevas espaciadas aproximadamente de manera uniforme a lo largo de la prueba, ya que el texto era aproximadamente rectangular. Exploté esto para acortar mi código, usando la función dividir en n piezas de Pyth, luego uniéndome en nuevas líneas.
Conozca sus herramientas y elija la correcta para el trabajo.
Las herramientas de procesamiento de texto más potentes y eficientes que conozco son:
Motores Regex:
///
Retina, Perl, en orden de compensación de potencia / concisión.Úselo si lo que quiere hacer puede describirse de manera concisa en sustituciones de expresiones regulares, como esta respuesta
Herramientas oscuras de procesamiento de texto: gema, etc. (estoy seguro de que hay otras, pero son demasiado oscuras)
Úselo si tienen una función que es exactamente lo que necesita, que nada más tiene. Como en esta pregunta , con la coincidencia recursiva de gema.
Lenguajes de golf de código general: CJam, Pyth, etc.
Úselo si está explotando alguna sutileza lo suficientemente compleja como para que ninguna otra herramienta haga el trabajo o simplemente haga el trabajo más corto.
Prueba muchos enfoques
Esto se aplica en todas las preguntas de código de golf, pero especialmente aquí. No vas a saber si una regularidad es explotable hasta que la pruebes. Posiblemente en varios idiomas.
fuente