Seu desafio é receber a entrada como uma linha de texto e produzi-la dessa maneira.
Entrada / saída
A entrada será uma sequência que contém apenas caracteres ASCII imprimíveis. O primeiro ou o último caracteres nunca serão espaços e nunca haverá dois espaços seguidos. Sempre terá pelo menos dois caracteres.
Sua saída deve ser a mesma string, convertida em cores do arco-íris, conforme descrito abaixo. A saída pode estar na forma de imagem (salva em um arquivo ou de alguma forma disponibilizada) ou pode simplesmente exibir o resultado na tela (como a implementação de referência abaixo).
Conversão
Para determinar a cor de cada letra na sequência, use o seguinte algoritmo. Observe que cada letra tem sua própria cor individual . Este não é um gradiente!
Se esse personagem for um espaço:
- ... não importa, porque os espaços não podem realmente ... ter uma cor de qualquer maneira. Basta imprimir um espaço.
De outra forma:
Let
i
= o índice desse caractere na string (com base em 0, portanto, para a primeira letra0
), sem contar os espaços. Por exemplo, na cadeiafoo bar
, esse valor seria4
para oa
. Em outras palavras, é esse o número de não-espaços encontrados até agora.Let
n
= o número de não espaços na string.A cor desta letra agora pode ser expressa, no sistema de coordenadas cilíndricas HSL , como [matiz = (
i
/n
) * 360 °, saturação = 100%, luminosidade = 50%].
Observe que essas instruções implicam que a saída foo
e f oo
deve ser exatamente a mesma, exceto por um espaço adicional após a f
. Ou seja, todas as letras devem manter as mesmas cores.
Regras adicionais para o processo de conversão estão descritas abaixo, na seção Regras .
Implementação de referência
Isso está escrito em JavaScript e você pode experimentá-lo pressionando o botão "Executar trecho 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;
}
Regras
Ao calcular o valor de Matiz de uma letra, você quase certamente obterá um número decimal (não inteiro). Você pode arredondar para o número inteiro mais próximo, colocar no chão, pegar o teto ou simplesmente não arredondar.
O tamanho da fonte deve ser legível. Aqui, isso é definido como uma fonte de tamanho 10pt ou superior.
Você pode usar uma tela de largura fixa ou "área de desenho" para produzir o texto, mas ele deve poder se encaixar no exemplo dado na primeira frase desta postagem.
A pontuação é código-golfe , portanto o código mais curto em bytes vencerá.
Respostas:
Perl, 95
Código de 92 bytes + 3 para
-p
Esse script usa uma aproximação das cores disponíveis para o terminal (máximo de 256) atualmente, incluindo apenas alguns pontos de cores selecionados nesta lista ; portanto, é provável que não especifique, mas foi divertido de qualquer maneira! Filtrei a lista para mostrar apenas cores com
S
eL
valores de100%
e50%
, respectivamente, e depois classificadas por matiz, agrupei os números em uma sequência e selecionei as cores dessa lista.Esta implementação inclui caracteres não imprimíveis! Roubou a idéia do @ edc65 de substituir apenas ao
\S
invés de.
, simples, mas inteligente!Hexdump:
Inverta o hexdump copiando o texto acima e executando:
colando nos dados e pressionando Ctrl+ D.
Execute usando:
Produz saída como:
fonte
Python 2: 240 usando PIL e colorsys lib
Exemplo de saída:
Agradecemos a @agtoever e @Trang Oul por algumas dicas de golfe e a @Mauris por apontar os requisitos de espaço.
Para adicionar fontes de tipo verdadeiro, controle de tamanho da fonte, incluindo deslocamento horizontal e alteração de cores com base no comprimento.
A fonte que usei está disponível aqui : O resultado é (a parte superior está imprimindo a sequência de caracteres, a abaixo está imprimindo por letra):
fonte
as P
e escrevaPIL
duas vezes e ganhe um personagem. Mudeimg
parai
e ganhe mais 4 personagens.255
em uma variável, substitua todas as ocorrências e use(a,)*3
como cor branca. Substituafloat(j)
por(j+.0)
.float(j)
para1.*j
u=len(s) a=255
=>u,a=len(s),255
). Remova os[]
suportestuple
, eles não são necessários. Substituir loop pela compreensão da lista (o método será avaliado como um efeito colateral).JavaScript (ES6), 114
117 125Edit2 3 bytes salvos thx @Dom Hastings Edit HTML inválido, mas funcionando de qualquer maneira.
Nota habitual: teste ao executar o snippet em um navegador compatível com EcmaScript 6 (principalmente o Chrome, não o MSIE. Testei no Firefox)
fonte
)
após ahsl(
declaração, pois parece que ainda funciona para mim no Firefox!${c}'
para'+c
economizar mais 2 ... É melhor voltar com o meu!Python 3, 131 bytes
Semelhante à resposta de Dom Hastings, mas implementada em python.
A sequência
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
foi criada a partir da lista,[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
os códigos de cores dos terminais a serem exibidos em ordem. Eles foram filtrados para incluir apenas cores com saturação de 100% e valor de 50%. A lista foi então classificada para que os matizes corretos fossem exibidos primeiro.Pega a entrada de stdin e retorna para stdout.
O terminal que você está usando DEVE suportar códigos de escape ANSI para executar isso corretamente.
Ou versão reduzida com caracteres de bytes literais (não colou corretamente):
Hexdump literal:
Obrigado @swstephe por salvar 9 bytes (e também por me fazer notar que minha contagem de bytes estava levemente muito errada)!
fonte
PHP, 165 bytes
Execute com entrada como o parâmetro "s"
O HTML é inválido, mas deve ser renderizado nos principais navegadores (testado no Chrome e Firefox)
fonte
PHP 4.1,
112103102 bytesEu usei a resposta @DankMemes como ponto de partida. A partir daí, eu implementei um tonelada de mudanças, a ponto de o código ser diferente.
A implementação é semelhante, o código é totalmente diferente.
Para usá-lo, basta definir um valor em SESSION / GET / POST / COOKIE com o nome
s
.Resultado da execução desta função, na sentença de teste:
fonte