Os terminais são tão chatos hoje em dia. Eles costumavam ficar assim:
Agora eles são apenas sem graça, sem graça e em preto e branco. Quero que você me escreva um programa que torne meu terminal colorido de novo!
Descrição
Veja este exemplo de código Ruby:
A maioria dos terminais Linux suporta essas seqüências de escape ( \e
significa o caractere de escape) e o Windows pode suportá-los com o ANSICON . Aqui está a sintaxe da sequência de escape específica que pode alterar o texto ou a cor de fundo de uma string:
\e[{{COLOR}}m
onde \e
representa o caractere de escape ( 0x1B
em ASCII) e {{COLOR}}
é substituído pelo número da cor que você deseja usar (mais detalhes sobre isso posteriormente). O texto que vem após essa sequência de escape será formatado conforme indicado e um valor de 0
redefinirá toda a formatação.
Seu desafio é pegar uma sequência que especifique algum texto que possa conter cores e gerar uma versão colorida.
Entrada / Saída
O texto normal funciona exatamente como o normal e é impresso literalmente. Por exemplo, a entrada waffles
produz a mesma saída, sem cor especial.
A sintaxe para especificar uma cor é semelhante à sintaxe da Wikipedia . Por exemplo, para colorir as palavras "a cor vermelha" em vermelho na frase This is the color red!
, a entrada seria:
This is {{red|the color red}}!
As cores de fundo também funcionam. Se você quisesse letras pretas sobre fundo branco, usaria o seguinte:
{{black|white|This text is black on white}}
Para obter apenas uma cor de fundo, omita o primeiro plano:
{{|red|This text has a red background}}
Especificação
Dois colchetes abertos sempre especificam o início de uma diretiva de cores . Dois colchetes de fechamento especificam o final. Parênteses sempre coincidem; nunca haverá a {{
sem um correspondente }}
e a }}
nunca virá antes do seu correspondente {{
. Essas diretivas de cores não serão aninhadas e a {{
nunca aparecerá em uma diretiva de cores.
Dentro de uma diretiva de cores, sempre haverá um ou dois |
símbolos. Se houver, o texto anterior à cor do primeiro plano e o texto posterior serão a sequência a ser mostrada nessa cor. Se houver dois, o texto antes do primeiro é a cor do primeiro plano, o texto após o primeiro, mas antes do segundo, a cor do plano de fundo e o texto após o segundo, a sequência a ser exibida. Essas barras verticais podem existir fora de uma diretiva de cores e devem ser impressas literalmente.
A cor do primeiro plano ou da cor do plano de fundo (mas não as duas) pode estar vazia; nesse caso, você deve deixá-las como padrão. A string final (a que será impressa) nunca estará vazia.
Aqui estão as instruções para gerar texto de uma determinada cor:
Uma sequência de cores é definida na seção "Descrição". Por exemplo, uma sequência de cores de 42 seria
"\e[42m"
.Para definir uma cor, imprima a sequência de cores do número determinado abaixo:
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
Os nomes de cores diferenciam maiúsculas de minúsculas e nunca será fornecido um nome de cor inválido. Você não precisa lidar com coisas como
RED
oulightgrey
(soletrado com ume
).Depois de imprimir uma sequência de cores, ela será aplicada a todo o texto a seguir. Para finalizar uma sequência de cores (redefinir para a cor padrão), imprima uma sequência de cores de
0
("\e[0m"
).
Caso de teste
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
Isso deve dar um rosto sorridente ... com maus olhos vermelhos.
Regras
Você não pode usar nenhuma biblioteca ou função da sua linguagem de programação para analisar automaticamente uma cor. Isso significa que você deve ser o único a determinar o que
"red"
significa; você não pode ter uma biblioteca automaticamente fazer isso por você.Isso é código-golfe , então o código mais curto em bytes vencerá!
\n\[\e[32m\]\w\n\[\e[0m\]>
(nome do diretório verde, prompt simples na próxima linha), mas não consigo fazê-lo funcionar em um programa (tentei python e Java até agora). Alguma ideia?echo -e "\e[31mtest\e[0m"
.lolcat
.you
ele quer dizer figurativamenteyour program
(em oposição a uma chamada para uma função de biblioteca), e que ele assumedetermine
no sentido defigure out
, não como emchoose
. Ou seja, é o seu programa que deve lidar com o mapeamento: String ("red") | -> Inteiro (31).red
é somente31
porque ele diz isso, que as informações precisam ser integradas ao programa. Embora possa ser discutido exatamente o que seria consideradoyour program
- podemos usar funções de manipulação de String de uso geral? - não trapaceie / abuse descaradamente.Respostas:
Ruby,
205189188186185182174170165161159154 bytesColocar longas seqüências de nomes de cores no seu código não parece suficientemente nerd.
Até 170 em parte graças a
rubik
. Agora as barras de rolagem se foram!Uma melhoria óbvia e outra não tão óbvia, graças à resposta flexível, sem a melhoria, eu não teria revisitado isso!
Não é mais, salvei 4 bytes com #sum.
Eu não pretendia isso, mas percebi que essa solução também não diferencia maiúsculas de minúsculas. Felizmente processa{{RED|Red text}}
.Despejo hexagonal:
Você pode convertê-lo com
xxd -r hex.dump
.O programa com todos os caracteres não imprimíveis escapou para fins de referência:
Essa é uma linha. Use-o assim
O
-W0
sinalizador suprime avisos que seriam enviados para ostderr
contrário. No entanto, o programa funciona bem sem nenhum sinalizador.Resultado:
fonte
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Minha corda é de 16 no entanto. Vejo que o seu é 18, então você provavelmente precisa se ajustar.int()
função do Python não pode ultrapassar 36). Depois, tentei todas as combinações para o módulo (de 2 para 10000, mas, em teoria, era possível ampliar a pesquisa para todo o Unicode) e para o xor, que eu mantive pequeno (1 a 9). Então, considerei resultados aceitáveis apenas aqueles que não continham caracteres duplicados.x.to_i(base)%mod+offset
. Eu então substituí o+
com^
, porque bem, parece mais legal. Fora isso, é desnecessário. Soltando^99
e alterando<<
para+
salvo por mais bytes. Obrigado pela dica, eu não teria notado o contrário!Ruby, 329 bytes.
fonte
ruby 2.1.2p95
e jogue erro:undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, ele continuará em loop após toda a entrada ter sido lida. Entãogets
retornanil
, que não possui um#gsub
método, gerando um erro. Use em$><<$<.read
vez deloop{puts gets
, também é mais curto; )Flex (léxico) -
226197192182168 (ou 166)Para reduzi-lo para 166, altere
\33
para um caractere de escape real.Compile e execute:
fonte
Python - 351
fonte
Cobra - 496
Quase poderia ser uma única declaração impressa.
fonte
Python, 561
Lê o texto para formatar a partir de stdin.
fonte
is not None
em um codegolf. Você pode usar!=None
, por exemplo.def p(f,b,t)
, seu código lançará aZeroDivisionError
. Qualquer coisa mod 0 é impossível.re.sub
executar este