Contagem de cores, classificada por ocorrências

14

Este é simples de descrever e eu mal podia acreditar que isso não acontecesse antes:

Para uma determinada imagem (seja qual for o formato suportado pelo seu idioma), localize as cores exclusivas e produza uma lista das cores.

  • Imprima o código de cor em RGB hexadecimal, que é um sinal de hash #seguido de 2 dígitos para R, 2 dígitos para G e 2 dígitos para B. ( #xxxxxxonde x pode ser 0-9, AF e / ou af).
  • O código hexadecimal deve ser seguido por um espaço e a contagem decimal de pixels, depois uma nova linha ( \nou \r\n).
  • A lista deve ser classificada por contagem decrescente (cor mais frequente na parte superior).
  • Se houver um empate (duas cores com a mesma quantidade), o pedido não é importante.
  • A imagem não conterá transparência; portanto, qualquer valor alfa não é importante. O valor alfa pode não fazer parte da saída.
  • Um tamanho de imagem de 4000x3000 deve ser suportado (isso pode importar para digitar definições)

Imagem de amostra "10red 20blue 30black 40white": Imagem de amostra 1

Saída esperada:

#FFFFFF 40
#000000 30
#0000FF 20
#FF0000 10

Imagem de exemplo "gradiente azul": Imagem de amostra 2

Uma das saídas esperadas (já que a ordem das mesmas cores pode variar):

#718DFF 19
#5571FF 15
#3855FF 11
#8DAAFF 11
#1C38FF 7
#AAAAFF 7
#8D8DFF 6
#AAC6FF 6
#C6C6FF 5
#C6E2FF 4
#001CFF 3
#E2E2FF 3
#FFFFFF 3

Imagem de exemplo "testImage", gentilmente fornecida por @Luis Mendo :

Imagem de amostra 3

Saída esperada:

#FFFFFF 18042
#000000 1754
#FF3300 204

Semelhante a esta pergunta , mas a saída é texto, não uma imagem.

Thomas Weller
fonte
count descendingé um pouco incerto. Como nós classificamos isso?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ: descendente: cores mais frequentes no topo #
Thomas Weller
Ok, eu diria que precisa ser um pouco mais claro. Talvez diga algo como the most frequent colors at the top?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ: Eu concordo, apenas atualizei a pergunta para ambos #
Thomas Weller
1
Alguns casos de teste seriam bons.
Martin Ender

Respostas:

4

Mathematica, 91 bytes

StringRiffle@SortBy[Tally["#"<>IntegerString[#,16,2]&/@Join@@#~ImageData~"Byte"],-Last@#&]&

Usa um método completamente diferente da resposta do @ DavidC . Ao contrário desse, isso pode suportar imagens com qualquer tamanho e contagem de cores. Explicação:

#~ImageData~"Byte"                   Take the RGB values of the image...
Join@@(...)                          Flatten to a list of colors...
"#"<>IntegerString[#,16,2]&/@(...)   Convert each color to #012def format...
Tally[(...)]                         Convert to a list of {color, multiplicity}
                                      pairs (this does most of the work)...
SortBy[(...),-Last@#&]               Order by the multiplicity descending...
StringRiffle@(...)                   And create a string with the desired format.
LegionMammal978
fonte
Agradável. Eu gosto de como "Byte" retorna os dados da imagem.
DavidC 5/16
4

Bash + coreutils, 54

  • 7 bytes salvos graças a @manatwork
grep -oE '#\w+'|sort|uniq -c|sort -nr|awk '$0=$2" "$1'

Isso pressupõe a entrada STDIN do formato .txt do Imagemagick .

Ideone.


Se o formato de entrada acima for muito exagerado, podemos adicionar a conversão Imagemagick de qualquer formato:

Bash + coreutils + Imagemagick, 71

convert $1 txt:-|grep -oE '#\w+'|sort|uniq -c|sort -nr|awk '$0=$2" "$1'

Aqui, o nome do arquivo da imagem de entrada é passado como um parâmetro da linha de comandos.

Trauma Digital
fonte
2
O OFS padrão do awk é um espaço, você pode trocar `" "` por,
n0741337
1
Ou ainda menor awkparte: awk '$0=$2" "$1'.
Manatwork 06/06/16
3

JavaScript (ES6), 359 355 bytes

Guardado 4 bytes graças a @Neil

u=>{i=new Image;i.src=u;e=document.createElement`canvas`;c=e.getContext`2d`;i.onload=_=>{w=e.width=i.width;h=e.height=i.height;c.drawImage(i,0,0);d=c.getImageData(0,0,w,h).data;for(o={},i=0;i<d.length;i+=4)++o[s='#'+`00000${(d[i]<<16|d[i+1]<<8|d[i+2]).toString(16)} `.slice(-7)]?0:o[s]=1;Object.keys(o).sort((a,b)=>o[b]-o[a]).map(c=>console.log(c+o[c]))}}

Demo

f=u=>{i=new Image;i.crossOrigin='';i.src=u;e=document.createElement`canvas`;c=e.getContext`2d`;i.onload=_=>{w=e.width=i.width;h=e.height=i.height;c.drawImage(i,0,0);d=c.getImageData(0,0,w,h).data;for(o={},i=0;i<d.length;i+=4)++o[s='#'+`00000${(d[i]<<16|d[i+1]<<8|d[i+2]).toString(16)} `.slice(-7)]?0:o[s]=1;Object.keys(o).sort((a,b)=>o[b]-o[a]).map(c=>console.log(c+o[c]))}}
f('http://i.imgur.com/acPudA9.gif')
<input value="https://i.imgur.com/acPudA9.gif" onchange="console.log('-------');f(this.value)">

Outros casos de teste que enviei ao imgur para dar suporte ao CORS:

Os dados de cores específicos desses dois parecem ter mudado levemente durante o upload por algum motivo, mas ainda imprimem a mesma quantidade de ocorrências para esses dois casos de teste.

Patrick Roberts
fonte
Eu acho que |tem precedência mais baixa do que <<isso, se você usá-lo, em vez de +não precisar de tantos ()s.
Neil
@ user2428118 da próxima vez, gostaria que você deixasse suas preocupações em um comentário e me pedisse para editar minha própria resposta em vez de editá-la. Você realmente quebrou minha demonstração removendo <!-- language: lang-js -->do snippet, desativando efetivamente o JavaScript.
Patrick Roberts
@ Patrick Desculpe, vou ter mais cuidado na próxima vez. Além disso, eu acabei de encontrar uma maneira de salvar alguns bytes:u=>{document.write`<img src=${u} id=i><canvas id=e>`;c=e.getContext`2d`;i.onload=_=>{w=e.width=i.width;h=e.height=i.height;c.drawImage(i,0,0);d=c.getImageData(0,0,w,h).data;for(o={},i=0;i<d.length;i+=4)++o[s='#'+`00000${(d[i]<<16|d[i+1]<<8|d[i+2]).toString(16)} `.slice(-7)]?0:o[s]=1;Object.keys(o).sort((a,b)=>o[b]-o[a]).map(c=>console.log(c+o[c]))}}
user2428118
2

Pitão , 29 bytes

jmj;_d_SrSm+\#.[\06.Hid256'Q8

Experimente online!

(O intérprete on-line não pode ler a imagem, então tirei essa parte e inseri o resultado da leitura dessa imagem, que é uma lista de trigêmeos de cores. A parte responsável pela leitura da imagem é 'um único cólon.)

Prova de funcionalidade de 'um único cólon

Freira Furada
fonte
Você precisa de um santes 'Q, pois uma imagem é representada como lista de listas de trigêmeos.
Jakube 4/16
Aqui está uma solução correta (e mais curto)V_SrS%L+\#*3"%02X"s'z8jd_N
Jakube
2

Mathematica 103 92 bytes

{"#"<>IntegerString[255Round[List@@#],16,2],#2}&@@@DominantColors[#,9999,{"Color","Count"}]&

Exemplo

foto


Explicação

DominantColorsnormalmente retorna uma lista de cores e conta representando os principais grupos em uma imagem. Quando o número de cores solicitadas excede o número de cores na imagem, as cores exatas dos pixels são retornadas. (Suponho que menos de 10.000 cores estarão na imagem de entrada.)

cenário


{"#"<>IntegerString[255Round[List@@#],16,2],#2} converte os valores de cores da base 10 com valores hexadecimais.


Nota: existem apenas 5 cores na imagem do mandril. (Eu costumava ColorQuantize[<image>,5]reduzir o número de cores na imagem padrão do mandril.)

DavidC
fonte
Apenas você jogou fora o golfe;)
LegionMammal978
Um pouco. Mas sua abordagem exige um número ilimitado de cores.
DavidC
1

PowerShell v2 +, 187 bytes

$a=New-Object System.Drawing.Bitmap $args[0]
$b=@{}
0..($a.Height-1)|%{$h=$_;0..($a.Width-1)|%{$b["#"+-join($a.GetPixel($_,$h).Name[2..7])]++}}
$b.GetEnumerator()|Sort value -des|FT -h -a

Reutiliza quase todo o código da minha resposta em Obter a cor mais dominante . Portanto, consulte isso para obter uma explicação completa.

As mudanças aqui são na indexação $bna terceira linha para corresponder às exigências de formato de saída explícitas, e na última linha que sortpor valueem -desordem cending, então pipe para Format-Tablecom -HideTableHeaders e -AutoSize como parâmetros. É muito raro usar FTaqui no PPCG, pois a saída está implícita no final da execução, mas aqui é muito útil garantir que obtemos apenas a saída correta das peças.

Exemplos

A primeira é a imagem de teste "vermelha" do desafio Cor Dominante, a segunda é a "imagem de teste" desse desafio.

PS C:\Tools\Scripts\golfing> .\color-count.ps1 C:\Tools\Scripts\golfing\img\red.png

#ff0000 139876
#dcd9cf 3056  
#f2f1ed 1512  
#ffffff 1508  
#ffe6e6 1488  
#ffe3e3 8     
#eae8e2 4     
#fffbfb 4     


PS C:\Tools\Scripts\golfing> .\color-count.ps1 C:\Tools\Scripts\golfing\img\z07VA.gif

#ffffff 18042
#000000 1754 
#ff3300 204  
AdmBorkBork
fonte
1

Tcl / Tk , 134 bytes

console s
lmap s [concat {*}[[image c photo -fi $argv] d]] {dict inc D $s}
dict fo k\ v [lsort -int -s 2 -inde 1 -de $D] {puts $k\ $v}

dé para data.

Tcl / Tk , 232 bytes

console s
set I [image c photo -fi $argv]
set i 0
time {set j 0
time {dict inc D #[join [lmap s [$I g $i $j] {format %02X $s}] ""]
incr j} [image h $I]
incr i} [image w $I]
dict fo k\ v [lsort -int -s 2 -inde 1 -de $D] {puts $k\ $v}

wish sort_pix.tcl QTE4O.png

insira a descrição da imagem aqui


wish sort_pix.tcl 5s1Ob.png

insira a descrição da imagem aqui


wish sort_pix.tcl z07VA.gif

insira a descrição da imagem aqui

sergiol
fonte
1

Brain-Flak , 1110 bytes

{{}({}[(()()()()()){}])}{}(<>)<>([]){{}({}()<({}()<({}()<>)>)>)<>([])}{}<>{({}<({}<({}<(()()<>)>)>)>)<>{(<>)<>(()()()){({}[()]<<>({}<([([(({})<>[({})]<>)])]<>)<>{({}()<([{}])<>({}<>)<>>)<>}{}<>{}<>>{})({}<({}<({}<>)<>({}<>)<>({}<>)<>>)<>({}<>)<>({}<>)<>({}<>)>)<>({}<({}<>)<>({}<>)<>>)<>({}<>)<>({}<>)>)}{}<>((){[()](<{}>)}{})((){[()](<{}({}())<>{}{}{}>)}{}){{}(<<>(()()()){({}[()]<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}{}>)}{}<>({}<({}<>)<>({}<>)<>({}<>)<>>)<>({}<>)<>({}<>)<>({}<>)<>}({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}(()()()()){((({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}>)<{({}[()]<<>({}<>)>)}{}>)}{}<>}{}<>(()()()())([][()])({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>){({}[()]<(<(()()()())([][()])({}(<>))><>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)<{({}[()]<([([({}<({}<({}<({}<(({})<>)<>>)>)>)>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<({}<({}<({}<({}<({}<({}<>)>)>)>)<>>)>)>)>)<>({}<({}<({}<({}<<>>)>)>)>)>)}{}({}<({}<({}<({}<>)>)>)>)<>>)}{}<>{}{}{}{}>[()]){({}[()]<({}<({}<({}<({}<>)>)>)>)<>>)}{}<>>)}{}{({}[()]<>)<>}<>

Experimente online!

Bem, isso foi uma aventura. Acontece que o Brain-Flak não é muito bom no processamento de imagens. Quem sabia?

Começarei observando que isso tecnicamente não atende ao formato de saída estrito solicitado. Se você deseja que isso seja aplicado, avise-me e tentarei adicionar o código de tradução. Por enquanto, ele gera números decimais: cada 4 números representa uma cor na ordem RED GREEN BLUE COUNT.

Em seguida, entrada. Os formatos de entrada permitidos eram mais flexíveis, então usei o formato mais fácil para o Brain-Flak analisar (que eu consegui encontrar): Netpbm P6. Infelizmente, o Brain-Flak não pôde analisar números decimais no formato P3 porque todas as imagens Netpbm começam com o caractere Pe o Brain-Flak não pode manipular a entrada decimal de arquivos que contêm caracteres não numéricos. Portanto, o P6 foi usado, porque o P6 armazena informações de cores como bytes, que são tratados como números no modo de entrada ASCII. Permaneceu um desafio porque as informações do cabeçalho não foram codificadas de maneira útil, mas, felizmente, eu não precisava de nenhuma dessas informações, portanto elas foram descartadas. Este programa não adere totalmente ao padrão Netpbm porque não permite novas linhas dentro do cabeçalho, mas as novas linhas não sãorequerido pelo padrão para que as entradas sejam arquivos Netpbm válidos.

Na última advertência, a versão no TIO não está configurada corretamente para operação "oficial" porque (que eu saiba) não posso fornecer arquivos como entrada no TIO, nem poderia fornecer bytes correspondentes a ASCII imprimível na entrada direta. Para operação oficial, o -asinalizador é necessário para receber dados como bytes não processados ​​e -fpara obter dados de um arquivo. A entrada de amostra no link TIO foi traduzida manualmente a partir do exemplo na página wiki do Netpbm .

Além disso, gostaria de agradecer ao wiki do Brain-Flak por fornecer trechos úteis de código para trabalhar. Em particular, a implementação do Bubble-Sort aqui foi fundamental para a etapa final, uma vez que eu obtive uma contagem de todas as cores, já que eu realmente não tinha idéia de por onde começar. Foram necessárias modificações pesadas, mas estou feliz por não precisar começar do zero.

Aqui está a versão não codificada e comentada do código. O Brain-Flak é um pouco detalhado demais para incluir uma explicação útil e formatada neste post, mas a versão não-gasta no TIO contém tudo o que eu incluiria em uma com melhor formatação do que eu poderia gerenciar aqui; portanto, se você estiver interessado, faça um Veja.

Talvez ainda não haja golfe, minha resposta anterior ao Brain-Flak passou por muitas revisões, mas, esperançosamente, as lições aprendidas ali deram a isso um melhor ponto de partida.

Kamil Drakari
fonte
0

Python 2, 186 bytes

import Image
I=Image.open(input()).convert('RGB')
w,h=I.size
r=['#'+('%0.2X'*3)%I.getpixel((i%w,i/h))for i in range(w*h)]
for a,b in sorted(set((r.count(v),v)for v in r))[::-1]:print b,a

Experimente online!

Isenção de responsabilidade: As saídas apresentadas são de uma linha para facilitar a leitura. As saídas de código resultam em separação de espaço e linha, conforme solicitado pelo desafio.

Saída para 10red 20blue 30black 40white:

[('#FFFFFF', 40), ('#000000', 30), ('#0000FF', 20), ('#FF0000', 10)]

Ouput para gradiente azul:

[('#718DFF', 19), ('#5571FF', 15), ('#8DAAFF', 11), ('#3855FF', 11), ('#AAAAFF', 7), ('#1C38FF', 7), ('#AAC6FF', 6), ('#8D8DFF', 6), ('#C6C6FF', 5), ('#C6E2FF', 4), ('#FFFFFF', 3), ('#E2E2FF', 3), ('#001CFF', 3)]

Saída para imagem de teste

[('#FFFFFF', 18042), ('#000000', 1754), ('#FF3300', 204)]

Explicação:

w,h=I.size # field size stores tuple of values of width and height of image

I.getpixel((i%w,i/h)) # returns tuple of base10 RGB values

('%0.2X'*3) # format string to convert int into hex

set((r.count(v),v)for v in r) # generate set of unique pairs count-color 

sorted(set(...))[::-1] # apply sorted(), as it sorts set of tuples by firts elements and reverse sort

print b,a  # swap values in tuples and print
Gambá morto
fonte
0

Java (1.4+) , 483 428 bytes

import java.util.*;class I {public static void main(String[] a) throws Exception {java.awt.image.BufferedImage i = javax.imageio.ImageIO.read(new java.io.File(a[0]));Map m=new HashMap();String s;for(Integer x=0,y=0,c;y<i.getHeight();y++)for(x=0;x<i.getWidth();m.put(s=x.toHexString(((c=i.getRGB(x++,y))&0xff0000)>>16)+x.toHexString((c & 0xff00)>>8)+x.toHexString(c&0xff),m.get(s)==null?1:(int)m.get(s)+1));System.out.print(m);}}

Experimente online! (Não funciona online)


Ungolfed:

import java.util.*;

class I {
    public static void main(String[] a) throws Exception {
        java.awt.image.BufferedImage i = javax.imageio.ImageIO
                .read(new java.io.File(a[0]));
        Map m = new HashMap();
        String s;
        for (Integer x = 0, y = 0, c; y < i.getHeight(); y++)
            for (x = 0; x < i.getWidth(); m
                    .put(s = x.toHexString(((c = i.getRGB(x++, y)) & 0xff0000) >> 16)
                            + x.toHexString((c & 0xff00) >> 8)
                            + x.toHexString(c & 0xff), m.get(s) == null ? 1
                            : (int) m.get(s) + 1))
                ;
        System.out.print(m);
    }
}

O toString()mapa de resultados como este:

{7c7c7c=6, 1d57a5=20468, 121212=7, d3d3d3=3, bdbdbd=9, 949494=2, 333=14, 626262=3, cacaca=2, 141414=5, fff=11, c9c9c9=1, e8e8e8=1, 919191=4, 161616=5, c2c2c2=1, 646464=7, 979797=12, fafafa=2, 808080=1, 7b7b7b=1, 484848=4, b9b9b9=2, f1f1f1=2, 6b6b6b=6, 363636=15, 262626=4, d8d8d8=2, 868686=4, 757575=1, 575757=3, a7a7a7=2, cecece=2, dcdcdc=2, c3c3c3=2, 1d1d1d=5, 727272=9, 656565=2, 3a3a3a=3, 7d7d7d=10, 393939=5, 797979=3, 222=31, 8f8f8f=2, 454545=4, 181818=9, 2e2e2e=2, 222222=1, 1c1c1c=19, b8b8b8=2, e1e1e1=5, 232323=5, 8a8a8a=3, 959595=7, 6a6a6a=9, 434343=7, 5c5c5c=3, 111=20, 909090=3, 424242=4, 212121=1, 1a1a1a=6, 202020=7, efefef=1, 565656=5, 6e6e6e=7, 767676=3, 323232=2, eee=5, 444=18, 2c62ab=1, 717171=2, b1b1b1=3, 6c6c6c=3, 545454=7, 515151=17, 2f2f2f=2, 4a4a4a=3, 888888=6, 6d6d6d=3, 898989=3, a3a3a3=5, 7e7e7e=9, ddd=9, b6b6b6=3, 2b2b2b=5, 313131=5, 8d8d8d=1, a2a2a2=2, 696969=3, a5a5a5=3, 4f4f4f=5, 828282=7, 191919=5, 606060=4, 6f6f6f=4, 8b8b8b=3, ebebeb=2, 555=19, 929292=3, 131313=11, 999999=5, d2d2d2=2, 444444=9, 474747=4, dddddd=1, 585858=8, 5a5a5a=3, 000=9887, afafaf=2, dfdfdf=3, 747474=3, 666666=4, a1a1a1=4, 2a2a2a=11, 4d4d4d=6, 818181=2, 878787=5, 215aa6=1, d9d9d9=4, b5b5b5=3, b4b4b4=3, 737373=4, aeaeae=3, bbb=15, 242424=4, 2d2d2d=8, 888=19, c1c1c1=1, 494949=9, dbdbdb=5, ccc=19, 5d5d5d=3, 5f5f5f=1, 414141=6, c8c8c8=3, aaa=16, 1e1e1e=3, 707070=2, 9e9e9e=2, 373737=7, 9d9d9d=2, 1b1b1b=4, 303030=7, 535353=10, 595959=2, 8e8e8e=3, 383838=5, 939393=18, 616161=2, 686868=6, dadada=1, e3e3e3=2, 5b5b5b=3, a4a4a4=5, 8c8c8c=5, a6a6a6=11, 292929=6, 4c4c4c=3, 151515=6, fefefe=2, 787878=2, 505050=2, e2e2e2=1, 1f1f1f=9, adadad=2, ababab=1, 5e5e5e=6, 252525=4, 4e4e4e=3, 282828=7, a8a8a8=4, 9c9c9c=3, aaaaaa=1, 101010=5, b7b7b7=2, 969696=6, 7f7f7f=4, 555555=2, a9a9a9=5, 343434=8, 999=17, 777777=3, ffffff=76669, f0f0f0=4, bbbbbb=1, 1e58a5=1, b3b3b3=4, 777=20, 636363=2, d4d4d4=1, 2c2c2c=5, 848484=1, 3c3c3c=3, bfbfbf=2, 3e3e3e=9, 333333=4, 7a7a7a=3, 858585=4, 4b4b4b=3, 272727=7, 111111=6, 666=13, 9b9b9b=1, bcbcbc=4, cfcfcf=2, 9a9a9a=1, 404040=21, 525252=3, 989898=4, 171717=5, 3b3b3b=2, c4c4c4=1, 3f3f3f=7, 464646=1, cdcdcd=2, b2b2b2=33, c5c5c5=2, bababa=2}

Por favor, não poste 1,8 sugestões específicas de golfe, a menos que funcione em Java mais antigo, não quero.

Exemplo: Lambdas não funcionam em mais versões do Java do que em.

Urna de polvo mágico
fonte
" Por favor, não poste 1,8 sugestões específicas de golfe, a menos que funcione em Java antigo, não quero. " Por curiosidade: por que o Java 4 enquanto o Java 10 já está disponível?
Kevin Cruijssen 22/03
Alguns campos de golfe que devem trabalhar em Java 4 (eu acho): import java.util.*;class M{public static void main(String[]a)throws Exception{java.awt.image.BufferedImage i=javax.imageio.ImageIO.read(new java.io.File(a[0]));Map m=new HashMap();String s;for(Integer x=0,y=0,c;y<i.getHeight();y++)for(x=0;x<i.getWidth();m.put(s=x.toHexString((c&0xff0000)>>16)+x.toHexString((c&0xff00)>>8)+x.toHexString(c&0xff),m.get(s)==null?1:(int)m.get(s)+1))c=i.getRGB(x++,y);System.out.print(m);}}( 419 bytes )
Kevin Cruijssen
@KevinCruijssen Porque o 1.8 foi, sem dúvida, o maior lançamento em termos de código que não será executado nas versões anteriores. A maioria dos outros lançamentos foram correções e adições de classes ao JRE. 1.8 foi o menos compatível com os JRE anteriores.
Magic Octopus Urn
@KevinCruijssen x.toHexIntegerera mais inteligente que uma importação estática.
Magic Octopus Urn
Também não Java 3, porque Java 3 ... realmente ... tem tão poucos atalhos ...
Magia Octopus Urna
0

SmileBASIC, 165 bytes

DEF C A
L=LEN(A)DIM C[L],N[L]FOR J=0TO L-1FOR I=0TO U-1ON A[J]-C[I]GOTO@L
NEXT
U=U+1@L
C[I]=A[J]INC N[I]NEXT
RSORT.,U,N,C
FOR I=0TO U-1?"#";HEX$(C[I],6),N[I]NEXT
END

A imagem é fornecida como uma matriz de valores de cores ARGB de 32 bits (o valor alfa é cortado quando o número é convertido em uma sequência hexadecimal de 6 dígitos)

12Me21
fonte