Sendo um grande fã do cubo de Rubik e da arte legal, tenho trabalhado na combinação dos dois para fazer coisas realmente legais. Resolvendo basicamente os cubos de Rubik em miniatura para formar pixels rudimentares na formação da arte do cubo de Rubik. Exemplos dessa arte podem ser vistos neste link: http://google.com/search?q=rubik%27s+cube+art
Agora, o objetivo deste Code Golf é criar um código que aceite uma imagem como entrada e depois a converta da seguinte maneira:
A imagem é inicialmente reduzida para cores em escala de cinza seguras para a Web. A razão por trás disso é porque precisamos isolar a paleta de escala de cinza segura na Web (por exemplo, 000000, 333333, 666666, 999999, CCCCCC e FFFFFF). Um algoritmo sobre o método colorimétrico de conversão em escala de cinza está disponível em: http://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale , caso você queira usá-lo como inspiração.
Um seria renderizar a escala de cinza para as cores apropriadas. Para dividir rapidamente: 000000 se refere ao azul de Rubik, 333333 se refere ao vermelho de Rubik, 666666 se refere ao verde de Rubik, 999999 se refere ao laranja de Rubik, </font> se refere ao laranja de Rubik, </font> se refere ao amarelo de Rubik e FFFFFF se refere ao branco de Rubik.
Prefiro que o código resultante possa renderizar da paleta da foto diretamente para as cores de Rubik. O método de dois estágios, da conversão para escala de cinza segura na Web e, em seguida, para a paleta correspondente do Rubik é apenas para lhe dar uma idéia da lógica por trás do processo, mas se for mais fácil fazer isso, faça isso de qualquer maneira.
Os valores RGB reais da paleta do Rubik devem corresponder ao seguinte:
- Vermelho: # C41E3A
- Verde: # 009E60
- Azul: # 0051BA
- Laranja: # FF5800
- Amarelo: # FFD500
- Branco: #FFFFFF
Para dar um exemplo, recortei a cabeça de Abraham Lincoln da seguinte figura: e renderizei o algoritmo para produzir o seguinte:
A grade está lá para que você possa ver como cada cubo de Rubik em miniatura individual precisaria ser configurado para compor a imagem. O tamanho real da imagem resultante é de 45 por 45 pixels, significando (45/3) * (45/3) = 15 * 15 = 225 os cubos de Rubik em miniatura seriam usados para fazer essa imagem. Não estou esperando que você apresente a imagem resultante com uma grade como eu.
Portanto, é isso que é necessário:
A imagem a ser processada por esse algoritmo deve ter x pixels de largura por y pixels de altura, de modo que x e y sejam múltiplos de 3. Isso ajuda a facilitar a renderização como parte do mosaico de cubos de Rubik. Se sua imagem for muito grande, é aconselhável reduzi-la para algo em torno de 45 x 45 a 75 x 75 ou em dimensões anteriores ao processamento. Lembre-se de que esse componente de redimensionamento é OPCIONAL.
A imagem precisa ser convertida na paleta de cubos do Rubik, com cores sextadas, para criar o mosaico.
A imagem resultante precisa ser um arquivo gráfico válido após o processamento. Para provar que seu código funciona, execute-o contra a imagem de um dos presidentes dos Estados Unidos da América ou de uma celebridade conhecida de Hollywood. Eu já usei Abraham Lincoln no meu exemplo, então esse presidente não pode mais ser usado. Certifique-se de fornecer o idioma que você usou, a contagem de bytes e o presidente / celebridade usado para testar seu código, incluindo fotos antes e depois ...
Cada entrada deve ter um presidente / celebridade exclusivo como seu caso de teste. Não aceitarei duplicatas. Isso garantirá que resultados duplicados não sejam usados para testar entradas de código diferentes. É muito bom dizer que seu código funciona, é outra coisa para provar isso.
5. O código mais curto vence.
Estou mudando isso para um concurso de popularidade ... Prefiro ver quem pode fazer isso sem ter que competir com a contagem de bytes ... Portanto, atribuirei isso juntamente com uma recompensa após o dia 28 de fevereiro de 2014.
fonte
#000000 => #0051BA
, etc.Respostas:
Imagemagick (108)
Versão: ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27
A seguinte chamada:
onde
input
eoutput
precisa ser modificado para o nome do arquivo de entrada e saída.Eu contei apenas os caracteres entre
-resize
e#FFF"
, se você acha que isso é inválido, sinta-se à vontade para comentar.Eu usei Lenna como imagem (ela apareceu em uma Playboy, e qualquer pessoa que faça isso deve ser considerada uma celebridade de Hollywood, certo?)
Entrada:
Saída:
Saída ampliada:
Observações: de acordo com os documentos imagemagick, você não pode ter mais de um operador condicional em uma instrução, mas a chamada ainda parece funcionar bem; portanto, provavelmente isso foi corrigido e os documentos não foram atualizados.
A execução de identificação na imagem resultante (para mostrar as cores são realmente boas):
Se você acha que Lenna não conta como uma celebridade adequada, aqui está Bruce Willis:
fonte
fx
peça podem ser compactadas ainda mais em uma linguagem com melhor expressividade. E essas línguas também têm suporte de imagem nativa (por isso não caracteres são perdidos por terem de importação imagemagick / gd / etc.)Mathematica
Trabalharemos com uma região quadrada de um selo americano com Greta Garbo. Será referido como
j
.A função f usa 3 parâmetros:
i
que se refere à imagemrs
, o tamanho da varreduram
, uma variável booleana que indica se as linhas Mesh devem ser usadas. (A configuração padrão é True).Usando tamanhos de varredura de 15, 30, 45 e 75:
Não consigo imaginar alguém fazendo um cubo de Rubrik com tantas peças! Exercício interessante, no entanto.
Brincando com cores
Isto é de uma entrada anterior. O código é um pouco diferente.
Graphics
é usado em vez deArrayPlot
. Além disso, usamos o carimbo completo, mesmo que não seja quadrado.Existem 6! = 720 permutações das cores do cubo Rubrik.
A seguir, é exibida a imagem central da linha superior (defina 6 imagens abaixo). Quando os valores da escala de cinza são organizados do mais escuro para o mais claro, as cores são {r, gr, b, o, y, w}. Outras variações, no entanto, funcionam.
i
é a imagem original em escala de cinza.i
é a imagem original em escala de cinza do carimbo completo do Greta Garbo.Rasterize[garbo,RasterSize->75
rasteriza a imagem em uma matriz de 75 por 75.ColorQuantize[<>, 6]
reduz os valores da escala de cinza para um conjunto de 6.ImageData
recupera a matriz de dados da imagem; vem de cabeça para baixo.Reverse
vira a matriz de dados, daí a imagem, com o lado direito para cima.garboColors
são os 6 valores da escala de cinza na imagem quantizada.Graphics[Raster
exibe a imagem final.rubrikColors
são valores RGB das 6 cores do cubo Rubrik.São fornecidas várias permutações de cores de vermelho, verde, azul, laranja, amarelo e branco.
E o código:
Garbos Galore
Aqui estão 72 (das 720) imagens de Greta Garbo que usam as 6 cores do cubo Rubrik. Algumas imagens funcionam melhor que outras, você não acha?
fonte
Reverse
poderia ser eliminado, deixando a foto de cabeça para baixo, mas não vejo outras oportunidades. O Mathematica é expressivo, mas usa grandes palavras. Alguém especialista em imagens provavelmente poderia reduzir um pouco o tamanho do código, mas duvido que eles pudessem superar o código da imagemagick.i
segure a imagem original.gr
significa verde de Rubrik.g
refere-se aos dados de imagem rasterizada e quantizada para a imagem em escala de cinza.Smalltalk (Smalltalk / X),
289139*entrada: i; saída: r
entrada:
saída:
ampliado:
(para todos os jovens: NÃO é Madonna ;-)
[*] Não contei a ampliação para 75x75 (a primeira linha) - poderia ter usado um já redimensionado como entrada. Espero que esteja tudo bem com você.
fonte
Cores Postscript e TRUE Rubik! ;-)
Bem, esta solução é um pouco fora de tópico aqui, pois está restrita a uma esfera altamente especializada. Mas depois de muita frustração com, por exemplo, "pergunta sobre números estranhos" (não conseguindo produzir algo que praticamente funcionasse), decidi publicar algo e, então, puxei isso para fora da minha pilha de rabiscos meio acabados e o tornei apresentável.
A solução explora o fato de que a 1ª revisão desta pergunta define as cores necessárias por link para um site, que afirma claramente que as cores Pantone (R) devem ser usadas e as cores RGB são apenas aproximações. Então pensei: por que eu faria aproximações quando posso fazer cores genuínas? - :)
Este código deve ser salvo como, por exemplo,
rubik.ps
e depois alimentado no Ghostscript com encantamento usual:Em seguida, ele espera na próxima linha, a entrada do nome do arquivo JPG, por exemplo
e, se tudo correr bem, salva a saída em
out.psd
arquivo.A entrada deve ser quadrada RGB JPEG (qualquer tamanho), a saída é PSD com canais de cores exatas. Você precisará do Photoshop para visualizar o arquivo. Mudar o dispositivo GS de
psdcmyk
para qualquer outra coisa não produzirá nada utilizável. JPEG como entrada - porque o intérprete postscript pode decodificar diretamente o fluxo de dados. Forma quadrada - porque o programa dependesqrt
do comprimento da string para encontrar a largura (e a altura) da imagem.As primeiras linhas definem o tamanho da imagem de saída (pode ser alterada a partir do padrão 75) e a paleta de cores (as cores e seus números também podem ser alterados). Qualquer outra coisa não é codificada, eu acho.
O que está acontecendo? O fluxo de trigêmeos RGB é convertido em tempo real para a sequência de valores em escala de cinza (com fórmula simples); o dicionário de imagens contone de 8 bits é criado e usado para pintar 5 imagens idênticas umas sobre as outras em 5
Separation
espaços de cores. O truque é aplicar funções de transferência antes de cada chamada doimage
operador. Por exemplo, para tinta amarela, essa função retorna 0 para valores de entrada em 0,167 .. 0,333 apenas na faixa e 1 em caso contrário.Entrada:
Captura de tela da saída 75x75 aberta no Photoshop, ampliada em 800%:
E paleta de canais do Photoshop:
fonte
C #
Você precisa executá-lo com 3 parâmetros:
foo.exe 75 d:\test.jpg d:\out.png
Onde
75
está max. width / height,d:\test.jpg
é um arquivo de entrada ed:\out.png
é o arquivo de saída.Saída para várias imagens deste concurso:
Minha própria celebridade:
Saída:
No entanto, outros tamanhos (maiores que 75 x 75) resultam em melhores imagens:
E, se ficarmos com os presidentes:
Como esse não é um codegolf (mais?), Não me preocupei em "minimizar" o código demais. Além disso, como as instruções não mencionavam especificamente a imagem tinha que ter a mesma largura que a altura (quadrado) que não me incomodei com o corte; I fazer , no entanto, certifique-se a imagem é um múltiplo de 3 pixels de largura / altura. Se você deseja imagens quadradas, use as entradas quadradas Finalmente; o algoritmo está longe de ser o ideal.
Um pouco mais (já que as pessoas votaram mais nas gostosas / heróis da internet )
fonte
Brainfuck
Isso requer um interpretador / compilador BF que tenha -1 como EOF e que tenha células maiores que 8 bits SE um dos pixels vermelhos for 255. Caso contrário, ele será interrompido prematuramente, pois não poderá diferir entre EOF e o valor 0xFF . Com o jitbf, você tem o tamanho da máquina com tamanho inteiro e pode fazer isso para forçar -1 como EOF:
O formato do arquivo de imagem renderizado é o arquivo RGB PNM (P6) completo, como opção no Gimp.
Ele usa apenas o canal verde (que é uma das muitas maneiras de converter uma imagem colorida em escala de cinza). Reduz o valor em 43 sem reduzir o valor abaixo de zero para descobrir qual cor de rubiks usar e ter uma opção que imprime a cor RBG correta que corresponde.
Imagem de Angelina Jolie de Hackers (1995) reduzida para 75x75 e processada com o aplicativo:
Mesmo, apenas usei o tamanho original :
E, como sou psíquica, aqui também é presidente:
fonte
Objetivo-C
Eu vi esse desafio ontem à noite e tive um tempo um pouco confuso
-[NSArray indexOfObject:inSortedRange:options:usingComparator:]
, daí o atraso.Eu o executei no meu iPad assim:
Antes Depois
Antes Depois
fonte
Python
Formato
python rubik.py <input> <max_cubes> <output>
.Abrange pixel em escala de cinza usando o algoritmo sugerido.
Entrada:
(fonte: ilmamilio.it )
Saída com
max_cubes = 25
:Saída com
max_cubes = 75
:Saída com
max_cubes = 225
:fonte