Entrada
O nome de um arquivo no formato gráfico de varredura de sua escolha. O formato escolhido deve suportar pelo menos 8 bits por canal e 3 canais.
Resultado
Um arquivo no mesmo formato, com as mesmas dimensões e pixels que o primeiro, mas cujos pixels são agrupados em ordem decrescente do número de vezes que ocorrem, classificados da esquerda para a direita, de cima para baixo.
- Se certas cores de pixels aparecerem o mesmo número de vezes, a ordem delas não será especificada.
- Você não deve sobrescrever o arquivo de entrada (use um nome de arquivo diferente para a saída).
- Toda e qualquer biblioteca de processamento de imagens de terceiros é permitida.
Exemplo
Produzirá resultados semelhantes a:
Especialmente nas partes inferiores da imagem, algumas variações podem ocorrer, devido a diferentes rompimentos entre cores de igual frequência.
File
objeto de tipo complexo ...? Isso faria uma grande diferença em alguns idiomas.Respostas:
J,
9481 bytesUma função que pega o nome de um arquivo PNG (sem canal de transparência) e grava o resultado no nome do arquivo de entrada precedido por "o".
Método
fonte
x
.y
personagem. (Se você definir uma função com dois argumentos aqueles são acessadosx
ey
e você não pode definir funções com mais argumentos.)Mathematica,
125123 bytesIsso define uma função sem nome que pega o nome do arquivo em qualquer formato de imagem comum e grava o resultado no arquivo com o mesmo nome, mas anexado
a
. O resultado parece um pouco diferente do OP, já que o MathematicaSortBy
quebra os vínculos por ordem de classificação padrão, portanto, os bits inferiores onde ocorrem gravatas parecem um pouco mais organizados:A implementação em si é realmente direta:
ImageData
para obter uma grade de valores de cores.Join
para achatar a matriz.Tally
para contar a ocorrência de cada cor.SortBy[...,-Last@#&]
para classificar por frequências do mais alto para o mais baixo.ConstantArray
eJoin
expandir os cálculos novamente.ArrayReshape
para recuperar a forma da imagem original (obtida comDimensions
).Image
para converter os dados novamente em um objeto de imagem.FYI, 22 bytes são usados no arquivo E / S. Uma versão equivalente que pega e retorna um objeto de imagem chega em 103 bytes:
fonte
Python2 / PIL,
244226225223222202186182170159Changelog
Mostrar snippet de código
Versão mais curta por stokastic , 123
Bem, vamos pelo menos tentar, mesmo que já esteja vencido.
É extremamente lento, o Panda processado por vários minutos no meu laptop.
Salva com um nome de arquivo com o nome do arquivo original repetido duas vezes.
fonte
i=open(raw_input());d=list(i.getdata());i.putdata(sorted(d,key=lambda D:d.count(D)));i.save('o.png')
, embora seja muito lento para imagens grandes (chamadas list.count em cada pixel).o.png
?)Python, 1197 bytes
O
png
módulo que eu usei .fonte
C # 413
Programa completo. Passe o nome do arquivo na linha de comando, a saída será salva no mesmo formato do arquivo "o".
Não usando alguns recursos interessantes do linq, como SelectMany e Enumerable.Range, pois o programa seria mais limpo, mas mais longo.
Formatação legível, cortesia do VS2010
fonte
{
caracteres}
caracteresPython 2: 191 bytes
Aqui está a minha tentativa. Imaginei que poderia economizar algum espaço usando
Counter
, mas não acabou tão pequeno quanto a resposta de Pietu1998.Saída do Panda
fonte