Escreva um programa que imprima a cor RGB de um determinado pixel na tela.
O programa deve ler uma linha de stdin no formato x,y
, onde xey são números inteiros não assinados. O pixel (0,0) é o pixel superior esquerdo da tela.
O programa deve emitir uma linha para stdout no formato RRR,GGG,BBB
, que representa a cor do pixel em ( x
, y
).
RRR
,, GGG
e BBB
devem ser números de ponto flutuante entre 0 e 1, números inteiros OR no intervalo [0, 255]. Os zeros à esquerda não importam, por exemplo: ambos 074
e 74
são aceitáveis.
Comportamento indefinido
Não há problema em o programa exibir um comportamento indefinido (travamento, saída incorreta etc.) nas seguintes condições:
- O usuário insere uma sequência de caracteres, número inteiro assinado, número flutuante ou qualquer outro tipo de dados inválido.
- A entrada do usuário não está no formato
x,y
- O pixel especificado está fora da tela
Notas:
- O programa não pode modificar o pixel nas coordenadas fornecidas.
- Se você tiver vários monitores, não importa em que monitor o pixel esteja ativado, desde que o mesmo monitor seja usado sempre que o programa for executado.
A resposta com o menor número de bytes vence.
RRR
,GGG
eBBB
ser pontos flutuantes entre 0 e 1? Geralmente eles são números inteiros no intervalo[0,255]
. Eu sugeriria permitir ambos.RRR
,GGG
eBBB
na especificação, masR
,G
,B
0, 0, 0
, derrotando o objetivo do desafio.Respostas:
Java 10 (função lambda),
10575 bytesUma função que pega dois parâmetros inteiros e retorna uma String
RRR,GGG,BBB
, onde as cores são números inteiros no intervalo[0, 255]
.-30 bytes graças a @LukeStevens usando
java.awt.Color
atoString()
saída padrão da e modificando-a para que apenas os dígitos e vírgulas permaneçam.Explicação:
NOTA: A
toString()
implementação padrão dojava.awt.Color
sempre foi a mesma nas versões da JVM, tanto quanto eu sei, mas pode potencialmente mudar no futuro. Eu testei em Java 8 e Java 10 e ele retornou"java.awt.Color[r=#,g=#,b=#]"
.Mas, como o desafio afirma:
x,y
de STDINR,G,B
para STDOUTR
,G
,B
como pontos flutuantes na faixa[0.0, 1.0]
O código se torna MUITO mais detalhado:
Java 10 (programa completo), 266 bytes
Explicação:
fonte
x->y->(new java.awt.Robot().getPixelColor(x,y)+"").replaceAll("[^\\d,]","")
75 bytestoString()
dejava.awt.Color
. Obrigado!toString()
caminho ... ;-) Exceto que eu tinha que baixar um IDE para fazer tudo isso: só uso o TIO agora :(Color::toString
é discricionário na implementação. Portanto, pode ser bom especificar qual JVM foi usada para os testes (funciona como está com o OpenJDK e o Oracle JDK)." "
por","
para cumprir com oRRR,GGG,BBB
formato estrito (nãoRRR GGG BBB
).Código da máquina 6502 (C64),
280260 bytesEu esperava que isso fosse possível em muito menos bytes, mas infelizmente ... bem, desde que eu terminei, publicando agora de qualquer maneira. Pelo menos, o formato restritivo ajudou com uma coisa: algo semelhante a
stdin
(entrada de um dispositivo atual) só existe no C64 no modo de texto, porque o sistema operacional suporta apenas esse modo - portanto, não é necessário considerar outros modos do chip gráfico .Nota sobre a saída dos valores das cores: o chip gráfico C64 não usa cores RGB, mas gera diretamente um sinal de vídeo com cores YUV, com uma paleta fixa de 16 cores. Usei valores arredondados da conversão do colodore para RGB com as configurações do monitor "padrão" aqui.
-20 bytes : melhor rotina de saída, codificando a saída de 3 caracteres por canal de cor em um único byte.
Em relação ao comentário: teoricamente é possível usar o modo de caracteres multicoloridos da VIC com o sistema operacional C64, mas requer uma fonte personalizada legível com apenas 4 pixels horizontais de largura duplicada. Não é totalmente impossível, mas muito improvável. Da mesma forma, o modo de cor estendida (ou modo de plano de fundo estendido, que é o mesmo) pode ser usado com o sistema operacional C64, mas requer a reconfiguração direta do chip gráfico. Opto por ignorar todas essas possibilidades no sentido de codificar golfe aqui: não é o ambiente padrão que você encontra em um Commodore 64 com sistema operacional em estoque. O que é possível com o sistema operacional padrão é alternar entre duas fontes integradas (shift + key do comodoro), o programa é responsável por isso.
Demonstração online
Uso:
SYS49152
para começar.Desmontagem comentada :
fonte
cc65
.. bem possível :) mas, pelo menos, o código compilado vai ser maior :)TI-BASIC (TI-83/84 +), 22 bytes
Como a tela é em preto e branco, precisamos apenas testar se o pixel especificado está ativado ou desativado e mapeá-lo para RGB preto ou branco. Além disso, os pixels são acessíveis apenas por linha e coluna nessa ordem, por isso as coordenadas são invertidas.
fonte
bash, 103/86 bytes
Com uma interpretação estrita da especificação (a entrada de STDIN e a saída em STDOUT são separadas por vírgula):
Com um formato de entrada mais flexível (entrada mais separada como argumento de linha de comando, saída separada por espaço:
Depende de imagemagick, awk e coreutils.
fonte
Conjunto TI-Nspire - 112 bytes
Este programa gera números inteiros no intervalo de 0 a 31 para R e B e de 0 a 63 para G, porque o dispositivo usa nativamente um buffer de quadro RGB565. Ele usa serial para entrada e saída.
Fonte:
fonte
Bash no Linux com xserver, 30 bytes
Usando a idéia apresentada no meu comentário sobre a pergunta, esta solução deve desligar completamente a saída da tela e depois ecoar que a tela é realmente preta.
Eu também estava pensando em usar
xbacklight =0
, mas isso não muda as cores dos pixels.fonte
Biblioteca Python 2 + PIL,
9691 bytesImplementa a especificação literalmente conforme solicitado. Porém, apenas no Windows - não funciona no Linux e produz saída extra (valor alfa) no Mac.
fonte
from PIL import ImageGrab as i
→from PIL import*
,i.grab
→ImageGrab.grab
.__import__('...')
caminho funcionar.Mathematica, 69 bytes
Apenas a função é 34 bytes.
CurrentScreenImage[]~PixelValue~#&
Recebe entrada no formato {x, y}.
A imagem é a fusão de imagens em todos os monitores. Se você deseja uma tela específica, use o índice inteiro - por exemplo
CurrentScreenImage[1]
O programa completo exatamente como especificado é 69 bytes
CurrentScreenImage[]~PixelValue~ToExpression["{"<>InputString[]<>"}"]
fonte
AutoHotKey, 113 bytes
Use caixas de diálogo em vez de stdin / stdout.
fonte
Bash + coreutils + scrot + netpbm, 90 bytes
Versão de E / S frouxa
Toma
x
ey
como argumentos separados da linha de comando.Gravuras
r
,g
,b
como ints de 0-255 em linhas separadasBash + coreutils + scrot + netpbm + bc + sed, 172 bytes
Versão estrita de E / S
Entrada no stdin como
x,y
Saída em stdout como
r.rr,g.gg,b.bb
(sem nova linha).fonte
TI-BASIC (TI-83/84 +), 15 bytes
Retira um número inteiro
Ans
e um do prompt.rand(3)
cria uma lista de três números aleatórios diferentes de zero, para que o produto seja zero se o pixel estiver escuro.fonte