Su desafío es tomar la entrada como una línea de texto y generarla de esta manera.
De entrada y salida
La entrada será una cadena que contiene solo caracteres ASCII imprimibles. El primer o el último carácter nunca serán espacios, y nunca habrá dos espacios seguidos. Siempre tendrá al menos dos caracteres de longitud.
Su salida debe ser la misma cadena, convertida a colores del arco iris como se describirá a continuación. La salida puede estar en forma de imagen (guardada en un archivo o de alguna manera disponible), o simplemente puede mostrar el resultado en la pantalla (como lo hace la implementación de referencia a continuación).
Conversión
Para determinar en qué color debe convertirse cada letra en la cadena, use el siguiente algoritmo. Tenga en cuenta que cada letra es su propio color individual . ¡Esto no es un gradiente!
Si este personaje es un espacio:
- ... no importa, porque los espacios no pueden ... tener un color de todos modos. Simplemente genera un espacio.
De otra manera:
Let
i
= el índice de este carácter en la cadena (basado en 0, por lo que para la primera letra, esto es0
), sin contar espacios. Por ejemplo, en la cadenafoo bar
, este valor sería4
para ela
. En otras palabras, esta es la cantidad de no espacios que se han encontrado hasta ahora.Let
n
= el número de no espacios en la cadena.El color de esta letra ahora se puede expresar, en el sistema de coordenadas cilíndricas HSL , como [hue = (
i
/n
) * 360 °, saturation = 100%, lightness = 50%].
Tenga en cuenta que estas instrucciones implican que la salida para foo
y f oo
debería ser exactamente la misma, excepto por un espacio adicional después de f
. Es decir, todas las letras deben conservar los mismos colores.
Las reglas adicionales para el proceso de conversión se describen a continuación, en las Reglas sección .
Implementación de referencia
Esto está escrito en JavaScript, y puede probarlo presionando el botón "Ejecutar fragmento de código".
window.addEventListener('load', function() {
addRainbow('Your challenge is to take input as a line of text and ' +
'output it like this.');
});
// append this text rainbow-ified to the argument (document.body by default)
function addRainbow(text, el) {
(el || document.body).appendChild(makeRainbow(text));
}
// returns a <div> that contains the text in a rainbow font
function makeRainbow(text) {
var div = document.createElement('div');
var letterCount = text.replace(/ /g, '').length, spaceCount = 0;
text.split('').forEach(function(letter, idx) {
if (letter == ' ') ++spaceCount;
div.appendChild(makeLetter(letter, (idx - spaceCount) / letterCount));
});
return div;
}
// returns a <span> that contains the letter in the specified color
function makeLetter(letter, hue) {
hue = Math.floor(hue * 360);
var span = document.createElement('span');
span.appendChild(document.createTextNode(letter));
span.style.color = 'hsl(' + hue + ', 100%, 50%)';
return span;
}
Reglas
Al calcular el valor de tono de una letra, es casi seguro que obtendrá un número decimal (no entero). Puede redondear esto al número entero más cercano, colocarlo en el piso, tomar el techo o simplemente no redondear en absoluto.
El tamaño de la fuente debe ser legible. Aquí, esto se define como una fuente de tamaño 10pt o mayor.
Puede usar un lienzo de ancho fijo o "área de dibujo" para generar el texto, pero debe poder ajustarse al ejemplo dado en la primera oración de esta publicación.
La puntuación es el código de golf , por lo que ganará el código más corto en bytes.
Respuestas:
Perl, 95
Código de 92 bytes + 3 para
-p
Este script utiliza una aproximación de los colores disponibles para el terminal (256 máximo) que actualmente solo incluye algunos puntos de color seleccionados de esta lista , por lo que es probable que no especifique, ¡pero de todos modos fue divertido! Filtré la lista para mostrar solo los colores
S
yL
valores de100%
y50%
respectivamente, luego los ordené por tono, empaqué los números en una cadena y seleccioné los colores de esa lista.¡Esta implementación incluye caracteres no imprimibles! ¡La idea de Stole @ edc65 de reemplazar solo en
\S
lugar de.
, simple, pero inteligente!Hexdump:
Invierta el hexdump copiando el texto anterior y ejecutando:
pegando los datos y presionando Ctrl+ D.
Ejecutar usando:
Produce resultados como:
fuente
Python 2: 240 usando PIL y colorsys lib
Salida de ejemplo:
Gracias a @agtoever y @Trang Oul por algunos consejos de golf, y a @Mauris por señalar el requisito de espacios.
Para agregar fuentes de tipo verdadero, control de tamaño de fuente, incluyendo desplazamiento horizontal y cambio de color según la longitud.
La fuente que utilicé está disponible desde aquí : El resultado es (la parte superior solo imprime la cadena, la siguiente se imprime por letra):
fuente
as P
y escribePIL
dos veces y gana un personaje. Cambiarimg
ai
y ganar 4 caracteres más.255
en una variable, reemplazar todas las ocurrencias y usar(a,)*3
como color blanco. Reemplazarfloat(j)
por(j+.0)
.float(j)
a1.*j
u=len(s) a=255
=>u,a=len(s),255
). Retire los[]
soportes detuple
, no son necesarios. Reemplazar el bucle por la comprensión de la lista (el método se evaluará como un efecto secundario).JavaScript (ES6), 114
117 125Edit2 3 bytes guardados thx @Dom Hastings Editar HTML no válido, pero funciona de todos modos.
Nota habitual: prueba ejecutando el fragmento en un navegador compatible con EcmaScript 6 (notablemente no Chrome ni MSIE. Probé en Firefox)
fuente
)
después de tuhsl(
declaración, ya que parece que todavía funciona para mí en Firefox!${c}'
a'+c
para ahorrar 2 más ... ¡Es mejor que sigas con el mío!Python 3, 131 bytes
Simular a la respuesta de Dom Hastings pero implementado en python.
La cadena
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
se creó a partir de la lista.[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
los códigos de color del terminal para mostrar en orden. Se han filtrado por lo que solo incluyen colores con una saturación del 100% y un valor del 50%. La lista se ordenó para que los tonos correctos se mostraran primero.Toma la entrada de stdin y la devuelve a stdout.
Su terminal que está utilizando DEBE admitir códigos de escape ANSI para ejecutar esto correctamente.
O versión abreviada con caracteres de byte literal (No se pegó correctamente):
Hexdump literal:
¡Gracias @swstephe por guardar 9 bytes (y también por hacerme notar que mi recuento de bytes fue un poco muy incorrecto)!
fuente
PHP, 165 bytes
Ejecutar con entrada como el parámetro "s"
El HTML no es válido, pero debe mostrarse en todos los principales navegadores (probado en Chrome y Firefox)
fuente
PHP 4.1,
112103102 bytesHe usado la respuesta de @DankMemes como punto de partida. A partir de ahí, he implementado un montón de cambios, hasta el punto de que el código es diferente.
La implementación es similar, el código es totalmente diferente.
Para usarlo, simplemente establezca un valor en SESSION / GET / POST / COOKIE con el nombre
s
.Resultado de ejecutar esta función, en la oración de prueba:
fuente