Desafio:
Escreva um programa que produza um arquivo gráfico de 1920 pixels de largura por 1080 pixels de altura. Cada um dos 2.073.600 pixels no gráfico deve ser de uma cor única e nenhum valor de cor deve ser repetido. As cores devem ser especificadas em RGB e começar em 0,0,0 e contar para cima em sequência até 255.255.255. Você verá que uma imagem de 1920 x 1080 pixels conterá muitos pretos, azuis e verdes.
Por exemplo, (uma versão reduzida reduzida). Se a altura estiver definida como 5 e a largura definida como 5, será gerado um gráfico quadrado de 25 pixels e cada pixel terá uma cor exclusiva. A matriz de cores RGB ficaria assim:
Array (
[0] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[1] => Array
(
[0] => 0
[1] => 0
[2] => 1
)
[2] => Array
(
[0] => 0
[1] => 0
[2] => 2
)
[3] => Array
(
[0] => 0
[1] => 0
[2] => 3
)
[4] => Array
(
[0] => 0
[1] => 0
[2] => 4
)
[5] => Array
(
[0] => 0
[1] => 0
[2] => 5
)
[6] => Array
(
[0] => 0
[1] => 0
[2] => 6
)
[7] => Array
(
[0] => 0
[1] => 0
[2] => 7
)
[8] => Array
(
[0] => 0
[1] => 0
[2] => 8
)
[9] => Array
(
[0] => 0
[1] => 0
[2] => 9
)
[10] => Array
(
[0] => 0
[1] => 0
[2] => 10
)
[11] => Array
(
[0] => 0
[1] => 0
[2] => 11
)
[12] => Array
(
[0] => 0
[1] => 0
[2] => 12
)
[13] => Array
(
[0] => 0
[1] => 0
[2] => 13
)
[14] => Array
(
[0] => 0
[1] => 0
[2] => 14
)
[15] => Array
(
[0] => 0
[1] => 0
[2] => 15
)
[16] => Array
(
[0] => 0
[1] => 0
[2] => 16
)
[17] => Array
(
[0] => 0
[1] => 0
[2] => 17
)
[18] => Array
(
[0] => 0
[1] => 0
[2] => 18
)
[19] => Array
(
[0] => 0
[1] => 0
[2] => 19
)
[20] => Array
(
[0] => 0
[1] => 0
[2] => 20
)
[21] => Array
(
[0] => 0
[1] => 0
[2] => 21
)
[22] => Array
(
[0] => 0
[1] => 0
[2] => 22
)
[23] => Array
(
[0] => 0
[1] => 0
[2] => 23
)
[24] => Array
(
[0] => 0
[1] => 0
[2] => 24
)
)
Regras:
Qualquer linguagem de programação pode ser usada para gerar a imagem.
A resposta com mais votos positivos vence.
As cores devem ser usadas apenas uma vez.
O pixel na posição 0,0 deve começar com a cor 0,0,0
As cores devem estar dentro do intervalo de 24 bits da cor verdadeira.
A imagem deve ter tamanho de 1920 x 1080 pixels.
As cores devem estar no formato RGB.
Usar uma biblioteca para produzir a imagem está ok.
A saída deve estar no formato de um arquivo gráfico, por exemplo, output.png
Como o texto que representa os valores das cores não conta, o código deve gerar um arquivo gráfico.
O tamanho do arquivo da imagem de saída não importa.
Você deve poder visualizar a saída abrindo-a como um gráfico no navegador Chrome.
Eu ficaria impressionado se você conseguir fazer isso com um código muito curto, seu programa também gera o tempo em segundos decorridos para gerar a imagem incorporada na própria imagem sobreposta nos pixels sequenciais, seu programa gera a imagem em 10 segundos. Eu ficaria realmente impressionado se o seu programa exibir a imagem dentro de 1 segundo.
fonte
x==y==0
parece um pouco arbitrário. De qualquer forma, é ambíguo porque essas coordenadas podem se referir ao canto superior esquerdo ou inferior esquerdo da imagem.Respostas:
Python - mais de 660 bytes
Versão Incremental
Tamanho completo: http://www.pictureshack.net/images/57626_all_colors.png (4.52MB)
Esta é uma imagem baseada em um fractal de Julia Set . Cada cor é adicionada à imagem de forma incremental, embora exista uma quantidade substancial de pré-cálculo.
Versão Luminosidade
Tamanho completo: http://www.pictureshack.net/images/95389_all_colors4.png (5.24MB)
Eu adicionei uma opção para iterar cada cor pela luminosidade, e não pelo índice. Isso não se qualifica como "contar" a partir de zero, mas parece ser um requisito negligente. É interessante que esses dois pedidos exponham estruturas completamente diferentes na imagem. Para usar isso, defina o
use_luminosity
sinalizador paraTrue
.Fonte
Requer PIL .
Esteja avisado : isso levará alguns minutos para ser executado. O uso do PyPy com Pillow é executado em cerca de um quinto do tempo do CPython com PIL, então eu recomendaria isso, se possível.
Editar : atualizado para que
#000000
fique no canto superior esquerdo, conforme especificado.Editar : adicionada uma bandeira para iterar as cores pela luminosidade.
Editar : alternado para cálculos complexos nativos e pesos de luminosidade inteira, que são um pouco mais rápidos.
Soluções em que trabalhei antes do critério principal se tornar um concurso de popularidade
PHP - 161 bytes
Isso está buscando a saída mais rápida possível. Nenhuma biblioteca é usada, apenas um cabeçalho pré-calculado e saída direta de bytes. É executado em menos de 2 segundos no meu comp. Aumentando em 256 em vez de 1 , produz um efeito pseudo-gradiente, sem necessidade de computação real. A única queda é que ( 0, 0 ) não é preto, mas o resultado parece muito melhor.
ob_start();
eob_end_flush();
não são estritamente necessários, mas armazenar em buffer a saída a torna muito mais rápida.Outros incrementos interessantes incluem:
17: http://i.stack.imgur.com/ieyyZ.png
103: http://i.stack.imgur.com/WD2wa.png
326: http://i.stack.imgur.com/c4DSF. png
557: http://i.stack.imgur.com/eTTWE.png
943: http://i.stack.imgur.com/7rrmR.png
2125: http://i.stack.imgur.com/Ct1kM .png
E muitos outros. Embora a maioria dos padrões parecidos com algo pareça listras de algum tipo
PHP - 105 bytes
Versão desprezível imprudente.
Content-type
cabeçalho quebrado , o Chrome fará o possível para descobrir o que foi enviado. Nesse caso, ele identifica corretamente comoimage/bmp
. As últimas versões do FireFox e IE também podem corrigir o cabeçalho quebrado.BM
,I5S2
eCS
irá gerar umNOTICE
erro. Para impedir a corrupção da imagem,php.ini
será necessário definir o relatório de erros para evitar isso (por exemploerror_reporting = E_ALL & ~E_NOTICE
).PHP-CLI - 83 bytes
Execute diretamente da linha de comando e canalize para um arquivo (por exemplo
$ php all-colors.php > out.bmp
), nenhumContent-type
cabeçalho é necessário. O arquivo resultante é idêntico à versão de 105 bytes e pode ser visualizado no Chrome.fonte
C com a biblioteca de gráficos GD (err, cerca de 2,5 KB?)
As regras não proibiram a modificação de uma imagem existente. Eu criei um programa para substituir todos os pixels de uma imagem por valores RGB sequenciais de
#000000
até#1fa3ff
e estou bastante satisfeito com os resultados. Aqui está o que foi produzido a partir de uma foto postada no Flickr por Michael Carian ( cc-by-sa 2.0 ):(A imagem de saída bruta é bastante grande (5,6 MB) )
Aqui está um close do canto superior esquerdo (aumentado em 400%):
O tempo de processamento é de aproximadamente 3 segundos para uma imagem desse tamanho:
e sim, todos os pixels são de cores diferentes:
(
identify
é um utilitário ImageMagick; a-format %k
opção conta o número de cores exclusivas em uma imagem)Aqui está o código fonte:
fonte
C ++, 750 bytes
Um PNG de resolução total (5.1MB)
O código cria uma coleção de todos os números inteiros de 0 a 1080 * 1920 e os classifica pelo brilho geral. Em seguida, ele cria um conjunto de Mandelbrot e classifica as posições com base em sua iteração e valor de escape. Depois, percorre os dois conjuntos, atribuindo cores na ordem do escuro ao brilhante, passando pelos valores de Mandelbrot, do menor para o maior. Por fim, ele grava uma imagem BMP de 32 bits por pixel no nome do arquivo de saída especificado como um parâmetro de linha de comando.
O código não é totalmente golfe, mas não vai ficar muito menor.
fonte
C - 854 bytes (quando compactado)
Originalmente, eu tinha algo com cantos ciano, magenta e amarelo e gradações suaves de cores que pareciam muito boas, mas não atendiam às especificações.
O seguinte cumpre as especificações: usa as "primeiras" 2.073.600 cores, sem repetições e preto no canto superior esquerdo.
Como isso funciona é bem legal. Ele cria uma matriz com as cores e depois classifica vertical e horizontalmente por diferentes critérios algumas vezes. O resultado final são transições agradáveis entre azul e verde e entre escuro e claro. Demora cerca de 1,5 segundos para executar. Compile usando:
gcc -o many many.c -lm
e execute usando:./many > many.ppm
Para sua informação, esta era a imagem original ...
E para os interessados no código usado para gerar esta imagem:
fonte
./a.out | hexdump | head
mostra7d ff de
várias vezes repetidas), (2) não usa valores RGB sequenciais000000
completos1dffff
e (3) pixel em (x = 0, y = 0) não é preto. (Embora eu não possa ver o ponto de (3) a mim mesmo.)Ruby, 109
EDIT: Devo observar que enviei isso quando a pergunta ainda estava marcada como code-golf , antes de se tornar um concurso de popularidade, então eu estava procurando por um código curto. Isso não é muito imaginativo, mas acredito que seja um envio válido.
Os valores das cores variam de
00 00 00
a1f a3 ff
, incrementando em1
, para que a falta dered
resultado não seja surpreendente.Pelo custo de adicionar 1 caractere ao comprimento do código-fonte (substitua
<<8
por<<11
), pode ser obtida a seguinte saída. Isso cobre uma maior variedade do espectro ao custo dablue
resolução. Aumenta através do espaço RGB a oito vezes a taxa. Os valores das cores variam de00 00 00
afd 1f f8
.fonte
Raquete
Nunca usei programação orientada a objetos de raquete antes (passagem de mensagens), portanto, não tenho certeza se isso é ideal, mas parece que o trabalho está sendo feito.
Ao não usar os 3 primeiros bits no canal vermelho, recebo as três cores na imagem resultante.
Brainfuck
O código imprime uma imagem de 24 bits BMP em STDOUT para intérpretes de 8 bits de células BF. Ele cria a mesma imagem que a versão Racket. É baseado na versão pnm.
O Ubuntu é fornecido com
bf
células de 8 bits:Versão antiga que viola a capacidade de abrir no Chrome. Ele cria um arquivo .pnm compatível com a maioria dos visualizadores de imagem.
fonte
Atualizado, a primeira versão não tinha todas as cores exclusivas no espaço de 24 bits:
Mathematica: 110
Verificação de regras:
O primeiro pixel é preto:
Todas as cores são únicas:
Mathematica: 146Leva 14,778 segundos.
Verificação de regras:
O primeiro pixel é preto:
Todas as cores são únicas:
fonte
Python - 104
Esta é a versão, que teria sido para o desafio do código-golfe. Como está apenas aumentando o valor de 0 até 2073599, ele contém apenas cores exclusivas.
Python - 110
Como não gostei da versão acima (o intervalo de cores não é totalmente usado), tentei algo como o seguinte:
Python - 122
Outra extensão ao acima:
fonte
i.show()
pode ser usado para abrir a imagem no visualizador padrão. Não há um requisito estrito de que ele seja salvo em um arquivo..show()
não funciona para mim. Não sei porquê. : PProcessing, 301
Esta não é uma tentativa da solução mais concisa, mas mantém todo o controle para alcançar o arranjo desejado de cores. Sim, as cores não são consecutivas, mas isso não é divertido.
fonte
0,0
seja RGB0,0,0
. Eu vejo31,31,31
. De fato, toda a coluna zero parece ser dessa cor.Visual Basic .NET, 273 bytes
Isso gera um arquivo de 5,61 MB:
O código acima é uma versão compactada desse código mais legível. Os espaços foram removidos para salvar bytes.
Link para a imagem: http: //µ.pw/k
fonte
ImageMagick - Converter 119
Vamos usar o
convert
da caixa de ferramentas ImageMagick para criar imagens. É executado em 0 segundos. É jogado com 119 caracteres. Sobreponho dois gradientes (vermelho-azul e preto-branco) convertendo-os em HSL e de volta a RGB.Exemplos de sobreposição de gradiente podem ser encontrados nas páginas de manual do ImageMagick .
fonte
identify -format %k o.png
. Eu tenho 1762920, 2073600 nãoPHP, 507
Você provavelmente precisará aumentar a quantidade de memória alocada ao PHP para executar. Usa GD. Demora cerca de 9 segundos para gerar a imagem.
Link para a imagem de saída: http://i.stack.imgur.com/AAKqW.png
Veja em execução na Web: http://ben-paton.co.uk/portfolio/pixel.php?w=1920&h=1080
fonte
DELPHI / PASCAL (Versão # 1), 361 bytes
fonte
Tcl / Tk, 149
150fonte
Java
411386 + 24 bytesGolfe
Ungolfed
Resultado
Explicação
Esta não é a minha tentativa de encontrar a solução mais curta, mas a mais portátil. Somente deixou a importação para BufferedImage porque os outros não salvaram bytes. Em vez de carregar a imagem em um JPanel e escrevê-lo, economizei o tempo necessário, do início até a gravação no disco como o nome do arquivo. Para mim, isso levou a nomes de arquivos de cerca de 110 ms, enquanto o tempo do começo ao fim geralmente levou cerca de 500 ms. Por fim, ele deve ser independente da plataforma, como eu testei no Windows e em uma VM do Ubuntu e funcionou (ele grava o arquivo na sua área de trabalho). Tinha que ter a declaração de retorno devido ao lixo de sintaxe Callable. Embora eu esteja trabalhando na solução, duvido que encontre uma implementação melhor por conta própria, devido à economia do uso de le para os loops for. Eu diria que meio segundo para java não é tão ruim.
Mas acredito que ainda seja validado, pois ainda pode ser aberto pelo chrome, apenas é aberto automaticamente no seu visualizador de png padrão (versão não testada em máquinas baseadas em Unix).
Estou ciente dos bytes salvos possíveis, mas principalmente os omiti para se qualificar para bônus. Se solicitado, posso enviar exemplos mais curtos e específicos da plataforma. Obrigado.
Editar
Removido o bloco Try Catch desnecessário e a declaração de retorno mal formatada para reduzir ~ 30 bytes.
Removido
BufferedImage.TYPE_INT_RGB
porque é literalmente apenas 1.fonte