Sua tarefa é criar um programa que, com uma imagem de entrada, crie uma imagem de saída do mesmo tamanho, em que todos os pixels sejam ordenados pelo valor hexadecimal.
Seu programa pode:
- Classifique os pixels da esquerda para a direita e depois para baixo ou primeiro para baixo em colunas e depois para a direita. De qualquer forma, o pixel superior esquerdo é o menor e o inferior direito é o maior.
- Use transparência, mas isso não é necessário.
- Classifique por RGB, mas você pode usar CMY ou qualquer outro formato com pelo menos 3 valores. Você pode escolher em quais valores classificar. (HSV pode dar algumas imagens legais)
- Use qualquer formato de imagem conhecido que a maioria dos computadores possa abrir.
Regras:
- A saída deve ser gravada no disco ou canalizável para um arquivo.
- A entrada é fornecida como um argumento da linha de comando, na forma de um caminho relativo para a imagem ou canalizada a partir da linha de comando.
- Este é o código golf, pelo que o código mais curto em bytes vence!
Respostas:
Pitão - 10 bytes
Lê a imagem, recolhe o bitmap, classifica e depois divide o bitmap novamente e depois grava.
Não funciona online por razões óbvias. Leva a entrada como caminho relativo para o arquivo de imagem e gera para
o.png
.Saída do gótico americano:
fonte
JavaScript (ES6),
383377354 bytesDemonstração executável:
Mostrar snippet de código
Como esse código funciona é usar
getImageData
para obter uma matriz do formulárioE
map
para uma matriz do formulárioPara que os valores R sejam mapeados para matrizes do conjunto RGBA, e os valores B, G e A se transformem em matrizes zero de valor mínimo. Quando classificamos essa matriz, todas as
[0,0,0,0]
matrizes são classificadas na parte inferior e as matrizes de valor real são classificadas normalmente na parte superior:Deslizamos o quarto superior da matriz (para perder os valores vazios que criamos), achatamos-a
[].concat.apply
e terminamos com uma matriz da primeira forma novamente, mas desta vez está classificada.Pouco golfe com espaço em branco e comentários:
Observe que a maioria dos navegadores pode falhar ao executar esse código para imagens grandes, porque ele passa um grande número de argumentos para
[].concat
. Quando o ambiente do navegador não permite memória suficiente para todos os argumentos, uma abordagem alternativa é mapear novamente os valores RGBA dos quatro primeiros arrays de volta para o array, para uma pontuação total de 361 bytes :Simplesmente substituímos
[].concat(...{stuff}).slice(12*w*h)
por{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4])
.)fonte
concat.apply
ligação está fornecendo muitos argumentosconcat
e o mecanismo JS está rejeitando-o.D:
Obrigado! Vou consertar isso e anotar as duas pontuações. (E eu estou feliz que eu poderia ajudar!)Mathematica
86 8372 bytesCom 14 bytes salvos, graças a @Martin Buttner.
Exemplo
A imagem em si é inserida. Alternativamente, uma variável contendo a imagem pode ser usada.
fonte
ImageData
eArrayReshape
poderia usar notação infix.Flatten
é longo o suficiente para salvar alguns bytes atribuindo-o af
. E você realmente precisa"Byte"
? O padrão não escalaria apenas os valores do canal para[0,1]
que a classificação e a reconstrução da imagem ainda funcionassem perfeitamente?Javascript ES6, 334 bytes
Ungolfed:
fonte
appendChild
retorna seu argumento. Muito útil! Você me inspirou a diminuir minha entrada de 377 para 354, mas não consigo vencer a sua :). (Quando uso a técnicaappendChild
e o encadeamentowith
, posso reduzi -la para 347, mas ainda a 13 de distância!) Excelente trabalho!C (usando SDL1.2),
333322315 bytesC provavelmente não é a 'faca mais afiada da prateleira' para esse tipo de trabalho, eu queria tentar de qualquer maneira. Dicas para melhorar minha resposta são bem-vindas. O programa obtém o nome do arquivo de imagem de entrada como um argumento cli.
compile e execute:
gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out
Normalmente não jogo golfe em C, mas acabei de responder a esse desafio ontem e só queria continuar brincando com esse novo brinquedo :)
obrigado a @ pseudonym117 por me ajudar a economizar 5 bytes
fonte
while
no final parafor(;;SDL_Flip(s));
, e acredito que você pode omitirint
o métodoC
e economizar mais 4.JavaScript (ES6), 452
480484487511bytesUau, isso ficou mais do que o esperado:
A função pega uma URL como entrada
f('test.jpg');
e desenha o resultado em umcanvas
elemento que é anexado aobody
.Observe que a fonte deve estar no mesmo domínio ou o script será interrompido com um problema de segurança.
Limitações
Eu testei no Firefox 42 no OS X (10.10) em uma máquina com 2,5 GHz i7 e 16 GB de RAM. O tamanho máximo da imagem que eu poderia processar sem o Firefox pedir para continuar a execução do script era 1600 x 1932 px .
Ungolfed
Saída
Para uma comparação melhor, peguei também o " American Gothic " como fonte de exemplo:
Edições
for (a in b)
vez defor(;;)
. Graças a ar34zdocument
em uma variável.()
.()
criação do objeto e removendo outro par de redundantes()
. Graças a apsillers .for
loop que obtém as cores de cada pixel.fonte
for(k in t)
o que permitirá poupar mais alguns bytes :)()
innew Image()
; use seqüências de caracteres de modelo marcadas para seus argumentos de sequência de caracteres (createElement`canvas`
,getContext`2d`
), não use parênteses para parâmetros de funções de seta única (basta fazerf=u=>{...}
; parens são apenas para funções de seta de parâmetro múltiplo ou de parâmetro zero). Além disso, você pode ter um ou doisfor
loops de instrução única com colchetes, que não são necessários.i.onload=$=>...
vez dei.onload=()=>...
)for(l in u)f.push(u[l]);
pode se tornarfor(z of u)f.push(z);
:)
. -for(u of t)for(z of u)f.push(z)
é bastante curto, mas pode ser reduzido ainda mais parat.map(u=>u.map(z=>f.push(z)))
. Em muitos casos, usar.map
ou.some
com uma função de seta será mais curto do que usar umfor
loop. Se você quiser ir realmente louco, você pode economizar ainda mais aqui comt.map(u=>f.push.apply(f,u));
o que diz "Para cada variedadeu
emt
, a ofertau
como uma lista de argumentos paraf.push
viaapply
(uma vez quepush
pode aceitar um número ilimitado de argumentos e empurra todos eles em ordem).Utilitários Bash + GNU, 80
Isso pressupõe que o formato de entrada / saída esteja no formato .txt da enumeração de pixels do ImageMagick. A entrada é passada como um nome de arquivo e a saída vai para STDOUT.
Se o exposto acima não for considerado um formato de imagem conhecido, podemos adicionar as conversões necessárias:
Bash + utilitários GNU + ImageMagick, 108
Entrada e saída são especificadas como nomes de arquivos. O ImageMagick determina quais formatos de arquivo usar pelas extensões de arquivo passadas, para que possamos usar os mais comuns:
O o.png resultante se parece com:
fonte
Python 2, 128 bytes
Desde que a imagem seja um arquivo nomeado
a
sem extensão, a saída será um arquivo nomeadob
sem extensão.fonte
a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))
(acabei de acordar, talvez tenha misturado as variáveis).Java, 316 bytes
Coloca os valores hexadecimais das cores de pixel em uma matriz. A matriz é classificada e as cores são remapeadas para os pixels na imagem. O nome da imagem resultante é
a.png
.fonte
SmileBASIC,
3935 bytesSupondo que a imagem seja carregada na página de gráficos 512 * 512:
Explicado:
É simples assim!
Infelizmente, temos que usar números inteiros, o que adiciona 4 bytes ao tamanho do programa devido aos sufixos de tipo.fonte
SYS/DEFSP.GRP
coloca umFF000000
no canto superior esquerdo e um00101010
no canto inferior direito, que é o oposto aparente da pergunta. O uso de flutuadores coloca00000000
no canto superior esquerdo eFFF8F8F8
no canto inferior direito, o que está correto. (Obviamente, isso trata as cores hexadecimais como canais não assinados / mais altos, o que provavelmente está correto.)0xFF000000
é menor que0x00101010
), mas, de qualquer forma, não sei ao certo por que usei números inteiros aqui ... o tempo em que não entendi como o GLOAD usava valores não assinados quando você usava uma matriz flutuante e presumi que não funcionava.Java,
424417404 bytesBem, este não é o idioma em que você quer jogar golfe ...
fonte
C #, 497 bytes
Primeira vez, primeiro golfe. Claramente não é o melhor para jogar golfe
Não respeitando realmente a tubulação. Pega um caminho de imagem como entrada e o gera com a letra "o" anexada ao nome.
Funciona melhor com bitmaps, resultados de probabilidades com outras pessoas
fonte
Haskell, 195 bytes
Isso usa a
GD
biblioteca. Usof <filename>
. O arquivo de entrada deve estar nopng
formato. O arquivo de saída é nomeadoo
.Como funciona: simples, ou seja, leia a imagem, passe por todas as coordenadas e obtenha os pixels, classifique os pixels, caminhe pelas coordenadas novamente, mas desta vez defina os pixels na ordem em que aparecem na lista classificada, escreva o arquivo como disco.
fonte