Las terminales son muy aburridas en estos días. Solían verse así:
Ahora son simplemente sosos, aburridos y en blanco y negro. ¡Quiero que me escribas un programa que hará que mi terminal vuelva a ser colorida!
Descripción
Tome este ejemplo de código Ruby:
La mayoría de los terminales de Linux admiten estas secuencias de escape ( \e
significa el carácter de escape), y Windows puede admitirlas con ANSICON . Aquí está la sintaxis de la secuencia de escape específica que puede cambiar el texto o el color de fondo de una cadena:
\e[{{COLOR}}m
donde \e
representa el carácter de escape ( 0x1B
en ASCII) y {{COLOR}}
se reemplaza por el número del color que desea usar (más detalles sobre eso más adelante). El texto que viene después de esta secuencia de escape se formateará como se indica y un valor de 0
restablecerá todo el formato.
Su desafío es tomar una cadena que especifique algún texto que pueda contener color, y generar una versión colorida del mismo.
De entrada y salida
El texto normal funciona igual que el normal y se imprime literalmente. Por ejemplo, la entrada waffles
produce la misma salida, sin color especial.
La sintaxis para especificar un color es similar a la sintaxis de Wikipedia . Por ejemplo, para colorear las palabras "el color rojo" en rojo en la oración This is the color red!
, la entrada sería:
This is {{red|the color red}}!
Los colores de fondo también funcionan. Si quisieras letras negras sobre un fondo blanco, usarías esto:
{{black|white|This text is black on white}}
Para obtener solo un color de fondo, omita el primer plano:
{{|red|This text has a red background}}
Especificación
Dos llaves abiertas siempre especifican el comienzo de una directiva de color . Dos llaves de cierre especifican el final. Los corchetes siempre coincidirán; nunca habrá un {{
sin un correspondiente }}
, y un }}
nunca vendrá antes de su correspondiente {{
. Estas directivas de color no estarán anidadas, y {{
nunca aparecerá dentro de una directiva de color.
Dentro de una directiva de color, siempre habrá uno o dos |
símbolos. Si hay uno, el texto anterior es el color de primer plano y el texto posterior es la cadena que se mostrará en ese color. Si hay dos, el texto antes del primero es el color de primer plano, el texto después del primero pero antes del segundo es el color de fondo, y el texto después del segundo es la cadena a mostrar. Estas barras verticales pueden existir fuera de una directiva de color y deben imprimirse literalmente.
El color de primer plano o el color de fondo (pero no ambos) pueden estar vacíos, en cuyo caso debe dejarlos como predeterminados. La cadena final (la que sale) nunca estará vacía.
Estas son las instrucciones para generar texto de un determinado color:
Una secuencia de color se define en la sección "Descripción". Por ejemplo, una secuencia de color de 42 sería
"\e[42m"
.Para establecer un color, imprima la secuencia de colores del número que se determina a continuación:
Color name | Color sequence number (foreground / background) --------------+---------- black | 30 / 40 red | 31 / 41 green | 32 / 42 yellow | 33 / 43 blue | 34 / 44 magenta | 35 / 45 cyan | 36 / 46 lightgray | 37 / 47 darkgray | 90 / 100 lightred | 91 / 101 lightgreen | 92 / 102 lightyellow | 93 / 103 lightblue | 94 / 104 lightmagenta | 95 / 105 lightcyan | 96 / 106 white | 97 / 107
Los nombres de color distinguen entre mayúsculas y minúsculas, y nunca se proporcionará un nombre de color no válido. No tiene que manejar cosas como
RED
olightgrey
(deletreadas con une
).Después de imprimir una secuencia de colores, se aplicará a todo el texto que le sigue. Para finalizar una secuencia de color (restablecer el color predeterminado), envíe una secuencia de color de
0
("\e[0m"
).
Caso de prueba
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
Esto debería mostrar una cara sonriente ... con malvados ojos rojos.
Reglas
No puede utilizar ninguna biblioteca o función de su lenguaje de programación para analizar automáticamente un color. Esto significa que debe ser usted quien determine qué
"red"
significa; no puede hacer que una biblioteca lo haga automáticamente por usted.Este es el código de golf , ¡así que el código más corto en bytes ganará!
\n\[\e[32m\]\w\n\[\e[0m\]>
(nombre de directorio verde, indicador simple en la siguiente línea), pero no puedo hacer que funcione desde un programa (hasta ahora he intentado con Python y Java). ¿Algunas ideas?echo -e "\e[31mtest\e[0m"
.lolcat
.you
, en sentido figurado, quiere deciryour program
(en oposición a una llamada a una función de biblioteca), y que tomadetermine
en el sentido defigure out
, no como enchoose
. Es decir, es su programa el que debe manejar la asignación: Cadena ("rojo") | -> Entero (31).red
es solo31
porque él lo dice, que la información debe integrarse en el programa. Aunque se puede argumentar exactamente lo que contaría comoyour program
: ¿podemos usar funciones de manipulación de cadenas de propósito general? - no hagas trampa / abuso descaradamente.Respuestas:
Rubí,
205189188186185182174170165161159154 bytesPoner largas cadenas de nombres de colores en su código no parece lo suficientemente nerd.
Abajo a 170 en parte gracias a
rubik
. ¡Ahora las barras de desplazamiento se han ido!Una mejora obvia y una no tan obvia, gracias a la respuesta flexible, sin la mejora, ¡no habría revisado esto!
Ya no, guardé 4 bytes con #sum.
No era mi intención, pero acabo de notar que esta solución tampoco distingue entre mayúsculas y minúsculas. Se procesa felizmente{{RED|Red text}}
.Volcado hexadecimal:
Puedes convertirlo con
xxd -r hex.dump
.El programa con todos los caracteres no imprimibles escapó con fines de referencia:
Esa es una línea. Úselo así
La
-W0
bandera suprime las advertencias que se enviarían a lostderr
contrario. Sin embargo, el programa funciona bien sin ningún indicador.Salida:
fuente
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Sin embargo, mi cuerda tiene 16 de longitud. Veo que el tuyo es 18, así que probablemente tengas que adaptarte.int()
función de Python no puede superar 36). Luego probé todas las combinaciones para el módulo (de 2 a 10000, pero en teoría uno podría ampliar la búsqueda a todo Unicode) y para el xor, que mantuve pequeño (1 a 9). Luego consideré resultados aceptables solo aquellos que no contenían caracteres duplicados.x.to_i(base)%mod+offset
. Luego reemplacé el+
con^
, porque bueno, se ve más fresco. Aparte de eso, es innecesario. Descarte^99
y cambie<<
a+
guardado para más bytes. Gracias por el consejo, no me habría dado cuenta de lo contrario!Ruby, 329 bytes.
fuente
ruby 2.1.2p95
y tirar de error:undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, seguirá en bucle después de que se haya leído toda la entrada. Luegogets
regresanil
, que no posee un#gsub
método, lo que genera un error. Usar en$><<$<.read
lugar deloop{puts gets
, también es más corto; )Flex (lexer) -
226197192182168 (o 166)Para bajarlo a 166, cambie el carácter
\33
a un carácter de escape real.Compilar y ejecutar:
fuente
Python - 351
fuente
Cobra - 496
Casi podría ser una sola declaración impresa.
fuente
Python, 561
Lee el texto para formatear desde stdin.
fuente
is not None
en un codegolf. Puedes usar!=None
, por ejemplo.def p(f,b,t)
, su código arrojará unZeroDivisionError
. Cualquier cosa mod 0 es imposible.re.sub
ejecutar esto