Está faltando o sinal de libra (#) necessário para as saídas de amostra na pergunta.
Iszi
5
PowerShell: 71 52 51 41
Os agradecimentos a @manatwork por apontar ForEach-Objectpodem ser usados no lugar de um forloop.
Obrigado a @Joey por apontar que eu poderia usar -joina saída do loop, em vez de precisar colocá-la em variáveis.
Código de golfe:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
Nota:
Não há erro ao verificar aqui se há entradas inválidas. O script aceita 256, 4096 e 65536 como entradas e, em seguida, gera a saída # 100100010000 (que obviamente não funciona como RGB).
Ungolfed, com comentários:
# Put a hashtag in front of the output.
'#'+
# Join the nested code into one string.
-join(
# Pipe 1..3 to ForEach-Object to run a loop three times.
1..3|%{
# Take user input and format it as hex, with minimum two digits in output.
"{0:X2}"-f+(read-host)
}
)
Faça o loop foreach($i in 1,2,3)para reduzi-lo para 68 caracteres.
manatwork
@ manatwork Eu não acho que essa seja a sintaxe apropriada para um foreachno PowerShell. (Pelo menos, não consegui fazer algumas execuções de teste funcionarem.) No entanto, usando a sintaxe correta, um alias interno e outro atalho do PowerShell que descobri recentemente, acho que tenho algo melhor: fazer a barba outros 12 caracteres fora da sua sugestão. (1..3)|%{...}(Insira uma declaração entre colchetes do script existente no lugar das reticências.) Ainda preciso testar isso completamente no script, mas obrigado por me indicar nessa direção!
Iszi 13/11
Não faço ideia se é a sintaxe adequada ou não, mas a referência do SS64 foreachmenciona isso e funciona para mim. (Nenhuma idéia sobre a versão. A que acompanha o Windows 7.)
manatwork
@ manatwork Isso é interessante. Eu gostaria de descobrir um pouco mais sobre o que há de errado nisso (eu estava recebendo erros de "token inesperado 'em' ..."). É possível que o artigo SS64 tenha sido escrito para uma versão diferente do PowerShell - não tenho certeza. Por enquanto, confirmei que (1..3)|%funciona e reduz o script para 56 caracteres. Vou editar isso na resposta e, definitivamente, dar crédito a você pela ideia. Obrigado novamente!
Iszi
2
Oh, caramba. Você pode obter este a 41 usando -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey
4
bash 22 21 caracteres
(Obrigado @manatwork por 1 caractere usando em \vez de aspas duplas)
Adicionado em 06-10-2015: bash ( método não ortodoxo ) 84 83 chars
c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d
Eu sei, poderia ter 82 caracteres se 020escrito 16, mas eu prefiro isso ... Ou talvez o d+=${c[$b$a 0x10]}que foi o primeiro post.
hexcolor() {
local a b c=({0..9} {a..f}) d=\#
for b ;do
for a in / % ;do
d+=${c[$b$a 0x10]}
done
done
echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f
Eu gosto desta resposta :) mais algumas e acho que posso resolver isso se nada melhor acontecer.
Quillion 7/11
Legal! Apenas uma unpackpergunta: você pode fazer o hexadecimal a..f em maiúsculas, como na pergunta?
113813 manatwork
Manatwork @ Eu tentei encontrar uma maneira de fazê-lo dentro de unpack, mas sem sorte. Uma maneira é usar em sprintfvez de unpack, mas isso é mais longo e completamente ortodoxo. A outra maneira é apenas modificar a string para maiúscula:, map{uc unpack H2,chr}a um custo de três caracteres.
breadbox
Obrigado, @breadbox. Esses pequenos truques packe unpacknunca entram no meu estilo de codificação. Portanto, não é ortodoxo o suficiente para mim.
Oi @ratchetfreak. Funciona para mim. Apenas testado com gforth. Dando 1 1 1saídas #010101. Quaisquer outros valores de 0 a 255 também funcionam. Que ambiente ou você está usando?
precisa
2
C (67 caracteres sem clichê principal)
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
Bom trabalho! Shows Ainda tenho muito a aprender sobre golfe!
Iszi
Ah, sua ideia com as variáveis também foi inteligente; nunca teria passado pela minha cabeça. Acontece que é mais do que o meu favorito de sempre: -splite -join.
Você pode salvar alguns bytes, livrando-se do [byte]dado que recebemos a entrada como números inteiros e editando sua saída para "#$o"- que fornece 31 bytes para$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@ TimmyD não sei se a remoção de [byte] funciona corretamente em todas as versões de uma versão em que eu testei (iirc 2.0 em xp) sem [byte] não estava concatenando como hexadecimal, mas como ints, isto é, 72 61 139 era # 7261139 e não # 483d8b "# $ o" dentro de aspas não é uma string literal, mas uma string avaliada é bom saber obrigado, comentários sobre a conversão hexadecimal serão apreciados
blabb
Aparentemente, é uma diferença entre o PowerShell v2 e a v3 - deve haver algo em como a versão .NET correspondente lida com a conversão hexadecimal, mas não consigo encontrar documentação.
(Nota: imprime '#' antes de ler a entrada - a tarefa não proíbe isso; dados três números no stdin, ele produz a saída correta no stdout. Também não se incomoda com as novas linhas e, como você pode ver, não adicione '#' corretamente quando executar "interativamente".)
Solicita RGB de 3 a 9 dígitos. Retorna hexadecimal com sinal hexadecimal GML,$
d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e
Faça disso um script. Além disso, compile com variáveis não inicializadas tratadas como 0.
Coincidentemente, acabei escrevendo quase exatamente a mesma coisa que você antes de ver a sua. Muito bom =) Eles estão próximos o suficiente para eu não publicar os meus, mas você pode salvar alguns bytes no seu mapeamento com este: # x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Além disso, não há necessidade de incluir o r=no início. Ele ainda conta como uma função, mesmo como uma função anônima, pois você pode invocá-la sem precisar atribuir nada.
Mwr247
Ops. O mapa era o seguinte: o x=>(x<16?0:'')+(x*1).toString(16)seu e o meu primeiro indicam valores incorretos no momento x>9.
Mwr247
Atualmente, ele retorna em #7261139vez de #483D8Bpara o primeiro caso de teste.
Dennis
0
Python 2, 40 bytes
s='#';exec's+="%02X"%input();'*3;print s
Lê a entrada de três linhas separadas. Abusosexec e multiplicação de strings.
Respostas:
Ruby: 19 caracteres
Exemplo de execução:
fonte
Rubi
Eu estava indo mais para a parte "não ortodoxa". ;)
A fonte (no meu navegador da web) é um pouco alta, portanto parece distorcida, mas fica melhor no Courier New:
Exemplo de execução:
fonte
q / k (3 caracteres)
Não exatamente heterodoxo, mas bastante curto
Exemplo
Para corresponder exatamente ao formato de saída na pergunta, podemos fazer (por 9 caracteres):
fonte
PowerShell:
71525141Código de golfe:
Nota:
Não há erro ao verificar aqui se há entradas inválidas. O script aceita 256, 4096 e 65536 como entradas e, em seguida, gera a saída # 100100010000 (que obviamente não funciona como RGB).
Ungolfed, com comentários:
fonte
foreach($i in 1,2,3)
para reduzi-lo para 68 caracteres.foreach
no PowerShell. (Pelo menos, não consegui fazer algumas execuções de teste funcionarem.) No entanto, usando a sintaxe correta, um alias interno e outro atalho do PowerShell que descobri recentemente, acho que tenho algo melhor: fazer a barba outros 12 caracteres fora da sua sugestão.(1..3)|%{...}
(Insira uma declaração entre colchetes do script existente no lugar das reticências.) Ainda preciso testar isso completamente no script, mas obrigado por me indicar nessa direção!foreach
menciona isso e funciona para mim. (Nenhuma idéia sobre a versão. A que acompanha o Windows 7.)(1..3)|%
funciona e reduz o script para 56 caracteres. Vou editar isso na resposta e, definitivamente, dar crédito a você pela ideia. Obrigado novamente!-join
:'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
.bash
2221 caracteres(Obrigado @manatwork por 1 caractere usando em
\
vez de aspas duplas)ou lendo STDIN em um loop: 48 caracteres:
Adicionado em 06-10-2015: bash ( método não ortodoxo )
8483 charsEu sei, poderia ter 82 caracteres se
020
escrito16
, mas eu prefiro isso ... Ou talvez od+=${c[$b$a 0x10]}
que foi o primeiro post.Outra abordagem bash
Isso exibirá uma janela do navegador, com:
Onde você pode rolar o botão do mouse para alterar os valores (com a tecla Shift pressionada no passo 15) ...
fonte
printf \#%02X%02X%02X
é suficiente.d+=${c[$b$a 0x10]}
algo sexy !d+=${c[$b$a 020]}
irá fazer o trabalho e aparência agradávelPerl, 31 caracteres
É difícil tornar um programa tão curto não ortodoxo, mas acho que isso funciona.
fonte
unpack
pergunta: você pode fazer o hexadecimal a..f em maiúsculas, como na pergunta?unpack
, mas sem sorte. Uma maneira é usar emsprintf
vez deunpack
, mas isso é mais longo e completamente ortodoxo. A outra maneira é apenas modificar a string para maiúscula:,map{uc unpack H2,chr}
a um custo de três caracteres.pack
eunpack
nunca entram no meu estilo de codificação. Portanto, não é ortodoxo o suficiente para mim.Script de Ação 3 | 43 caracteres
Resultado:
#483D8B
fonte
Perl 24 chars
Desculpe, não é tão sexy quanto usar
unpack
, mas mais curto!Versão mais obscura:
Mas se você realmente preferir usar
unpack
, poderá:Por exemplo, não é a versão mais curta, mas eu gosto! (Observe o uso de
rand
para randering this :-)fonte
> <>
10360Utilizou o espaço em branco desperdiçado e moveu algum código para ele
Execute com entradas da linha de comandos:
saída: "# FF2448"
fonte
Quarto, 62 caracteres
fonte
1 1 1
saídas#010101
. Quaisquer outros valores de 0 a 255 também funcionam. Que ambiente ou você está usando?C (67 caracteres sem clichê principal)
o uso padrão do pântano printf & bit twiddler
fonte
readf
? Não deveria serscanf
?Dc:
3532 caracteresExemplo de execução:
Dc:
2724 caracteres(Mas precisa dos números de entrada em linhas separadas.)
Exemplo de execução:
fonte
dc
respostas suficientes neste site.JavaScript, 89 caracteres
Convertidos
72 61 139
para256*(256*(72)+61)+139
e evals TI.fonte
eval('(('+DEC.replace(/ /g,'<<8)+'))
vez deeval('256*(256*('+DEC.replace(/ /g,')+'))
permitir salvar 5 caracteres!PowerShell, 45
Ou, se puder ser usado canalizando os dados, você pode apenas usar
o que reduz para 42 .
fonte
-split
e-join
.PowerShell 37
economizou um byte graças a TimmyD
fonte
[byte]
dado que recebemos a entrada como números inteiros e editando sua saída para"#$o"
- que fornece 31 bytes para$args|%{$o+="{0:X2}"-f$_};"#$o"
R, 16 bytes
É isso aí. Use o incorporado.
fonte
C,
6773 caracteres (65 caracteres, exceto principal)Programa C chato - muito ortodoxo.
fonte
Python 2.7 (80 caracteres)
Estou procurando uma maneira melhor de lidar com os valores hexadecimais de um dígito. Alguma ideia?
fonte
Befunge-98, 45 caracteres
Bleh, código duplicado. Ah bem. Apenas uma implementação direta da conversão de raiz.
Execução de amostra
(Nota: imprime '#' antes de ler a entrada - a tarefa não proíbe isso; dados três números no stdin, ele produz a saída correta no stdout. Também não se incomoda com as novas linhas e, como você pode ver, não adicione '#' corretamente quando executar "interativamente".)
fonte
Linguagem do Game Maker, 175 (Erro na posição 81)
Solicita RGB de 3 a 9 dígitos. Retorna hexadecimal com sinal hexadecimal GML,
$
Faça disso um script. Além disso, compile com variáveis não inicializadas tratadas como 0.
Fonte
fonte
Gema, 93 caracteres
Exemplo de execução:
fonte
Burlsque, 12 bytes (10 bytes para minúsculas)
Se letras minúsculas também forem permitidas, 10 bytes:
Uso:
Se você precisar desesperadamente de letras maiúsculas, adicione
ZZ
:Se você não receber os números inteiros como em uma string, vá com:
Explicação:
Experimente online aqui .
Bônus:
Para convertê-lo novamente, use o seguinte:
fonte
Powershell, 28 bytes
Script de teste:
Resultado:
fonte
Python3.3 a 60 caracteres
Não pude resistir:
fonte
Clojure 76 Personagens
Isso pode ser tarde, por uma questão de integridade:
Chamadas de exemplo:
fonte
Mathematica, 40 caracteres
fonte
Lisp comum, 39 caracteres
Leia três números inteiros, retorne uma string.
fonte
Javascript ES6, 63 bytes
fonte
x=>(x<16?0:'')+x.toString(16)
r=
no início. Ele ainda conta como uma função, mesmo como uma função anônima, pois você pode invocá-la sem precisar atribuir nada.x=>(x<16?0:'')+(x*1).toString(16)
seu e o meu primeiro indicam valores incorretos no momentox>9
.#7261139
vez de#483D8B
para o primeiro caso de teste.Python 2, 40 bytes
Lê a entrada de três linhas separadas. Abusos
exec
e multiplicação de strings.Exemplo de uso:
fonte
Python (55 caracteres)
fonte