Подсчет цветов, отсортированный по происшествиям

14

Это просто описать, и я с трудом мог поверить, что раньше это не играли в гольф:

Для данного изображения (независимо от формата, поддерживаемого вашим языком) найдите уникальные цвета и выведите список цветов.

  • Выведите цветной код в шестнадцатеричном RGB, то есть знак хеша, #за которым следуют 2 цифры для R, 2 цифры для G и 2 цифры для B. ( #xxxxxxгде x может быть 0-9, AF и / или af).
  • Шестнадцатеричный код должен сопровождаться пробелом и количеством десятичных пикселей, затем новой строкой ( \nили \r\n).
  • Список должен быть отсортирован по убыванию (наиболее часто встречающийся цвет вверху).
  • Если есть галстук (два цвета с одинаковым количеством), порядок не важен.
  • Изображение не будет содержать прозрачность, поэтому любое значение альфа не имеет значения. Значение альфа не может быть частью вывода.
  • Размер изображения 4000x3000 должен поддерживаться (это может иметь значение для определения типа)

Пример изображения "10red 20blue 30black 40white": Образец изображения 1

Ожидаемый результат:

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

Пример изображения "синий градиент": Образец изображения 2

Один из ожидаемых выходных данных (поскольку порядок одинаковых цветов может отличаться):

#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

Пример изображения «testImage», любезно предоставлено @Luis Mendo :

Образец изображения 3

Ожидаемый результат:

#FFFFFF 18042
#000000 1754
#FF3300 204

Похоже на этот вопрос , но вывод текста, а не изображения.

Томас Веллер
источник
count descendingнемного неясно. Как мы сортируем это?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ: по убыванию: самый частый цвет сверху
Томас Уэллер
Хорошо, я бы сказал, что это должно быть немного яснее. Может сказать что-то подобное the most frequent colors at the top?
Rɪᴋᴇʀ
@ EᴀsᴛᴇʀʟʏIʀᴋ: Я согласен, только что обновил вопрос для обоих
Томас Уэллер
1
Пара тестов была бы хороша.
Мартин Эндер

Ответы:

4

Mathematica, 91 байт

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

Использует совершенно другой метод из ответа @ DavidC . В отличие от этого, он может поддерживать изображения с любым размером и количеством цветов. Объяснение:

#~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
источник
Ницца. Мне нравится, как «Байт» возвращает данные изображения.
DavidC
4

Баш + coreutils, 54

  • 7 байтов сохранено благодаря @manatwork
grep -oE '#\w+'|sort|uniq -c|sort -nr|awk '$0=$2" "$1'

Это предполагает ввод STDIN формата .txt Imagemagick .

Ideone.


Если указанный выше формат ввода слишком растянут, мы можем добавить преобразование Imagemagick из любого формата:

Bash + coreutils + Imagemagick, 71

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

Здесь имя файла входного изображения передается как параметр командной строки.

Цифровая травма
источник
2
OFS по умолчанию в awk - это пробел, вы можете обменять "" "на,
n0741337
1
Или даже более короткая awkчасть awk '$0=$2" "$1'.
manatwork
3

JavaScript (ES6), 359 355 байт

Сохранено 4 байта благодаря @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]))}}

демонстрация

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)">

Другие тестовые примеры, которые я загрузил в imgur для поддержки CORS:

Кажется, что конкретные данные о цвете на этих двух объектах несколько изменились при загрузке, но все равно выводит одинаковое количество вхождений для этих двух тестовых случаев.

Патрик Робертс
источник
Я думаю, |имеет более низкий приоритет, чем<< если бы вы использовали его вместо того, чтобы +вам не понадобилось так много ()s.
Нил
@ user2428118 в следующий раз я буду признателен, если вы оставите проблемы в комментарии и попросите меня отредактировать свой собственный ответ, а не редактировать его самостоятельно. Вы фактически сломали мое демо, удалив<!-- language: lang-js --> из фрагмента, фактически отключив JavaScript.
Патрик Робертс
@ Патрик Извините, в следующий раз я буду более осторожен. Также я только что нашел способ сохранить несколько байтов: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

Pyth , 29 байт

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

Попробуйте онлайн!

(Онлайн-переводчик не может прочитать изображение, поэтому я удалил эту часть и ввел результат чтения этого изображения, представляющий собой список цветовых триплетов. Часть, ответственная за чтение изображения, - 'это одна двоеточие.)

Подтверждение функциональности 'одного двоеточия

Дрянная Монахиня
источник
Вам нужно sдо 'Q, так как изображение представляется в виде списка списков триплетов.
Якуб
Вот правильное (и более короткое) решениеV_SrS%L+\#*3"%02X"s'z8jd_N
Jakube
2

Mathematica 103 92 байта

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

пример

фильм


объяснение

DominantColorsобычно возвращает список цветов и счетчиков, представляющих основные кластеры в изображении. Когда количество запрошенных цветов превышает количество цветов в изображении, возвращаются точные цвета пикселей. (Я предполагаю, что во входном изображении будет менее 10 000 цветов.)

картина


{"#"<>IntegerString[255Round[List@@#],16,2],#2} преобразует базовые 10 значений цвета в шестнадцатеричные значения.


Примечание: в изображении мандрил есть только 5 цветов. (Я использовал, ColorQuantize[<image>,5]чтобы уменьшить количество цветов в стандартном изображении мандрил.)

DavidC
источник
Просто переиграл тебя;)
LegionMammal978
По чуть-чуть. Но ваш подход принимает неограниченное количество цветов.
DavidC
1

PowerShell v2 +, 187 байт

$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

Повторно использует почти весь код из моего ответа на Получить наиболее доминирующий цвет . Поэтому, пожалуйста, обратитесь к этому для полного объяснения.

Изменения здесь в индексации $bв третьей строке , чтобы соответствовать требованиям в явном виде выходного формата, а в последней строке мы sortна valueв -descending порядка, а затем трубы Format-Tableс -HideTableHeaders и-A utoSize в качестве параметров. Здесь очень редко используется FTна PPCG, поскольку вывод неявен в конце выполнения, но здесь очень полезно убедиться, что мы получаем только правильный вывод частей.

Примеры

Первое - это «красное» тестовое изображение из испытания «Доминантный цвет», второе - «свидетельство» из этого испытания.

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
источник
1

Tcl / Tk , 134 байта

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для data.

Tcl / Tk , 232 байта

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

введите описание изображения здесь


wish sort_pix.tcl 5s1Ob.png

введите описание изображения здесь


wish sort_pix.tcl z07VA.gif

введите описание изображения здесь

sergiol
источник
1

Brain-Flak , 1110 байт

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

Попробуйте онлайн!

Ну это было приключение. Оказывается, Brain-Flak не очень хорош в обработке изображений. Кто знал?

Начну с того, что технически это не соответствует строгому формату вывода. Если вы хотите, чтобы это осуществлялось, дайте мне знать, и я постараюсь добавить код перевода. Сейчас он выводит десятичные числа: каждые 4 числа представляют цвет в порядке КРАСНЫЙ ЗЕЛЕНЫЙ СИНИЙ СЧЕТ.

Далее, вход. Разрешенные форматы ввода были более гибкими, поэтому я использовал самый простой для анализа Brain-Flak формат (который я смог найти): Netpbm P6. К сожалению, Brain-Flak не смог разобрать десятичные числа из формата P3, потому что все образы Netpbm начинаются с символа, требуемого стандартом, поэтому входные данные являются действительными файлами Netpbm.P а Brain-Flak не может обрабатывать десятичный ввод из файлов, содержащих нечисловые символы. Поэтому вместо него использовался P6, потому что P6 хранит информацию о цвете в виде байтов, которые обрабатываются как числа в режиме ввода ASCII. Осталась проблема, потому что информация заголовка не была зашифрована с пользой, но, к счастью, эта информация мне не понадобилась, поэтому ее просто отбрасывают. Эта программа не полностью соответствует стандарту Netpbm, потому что она не позволяет переводить строки в заголовок, но переводы строк не являются

Последнее предостережение: версия на TIO на самом деле неправильно настроена для «официальной» работы, потому что (насколько мне известно) я не могу предоставить файлы в качестве входных данных на TIO, а также не могу предоставить байты, соответствующие непечатаемой ASCII, в прямом вводе. Для официальной работы -aфлаг необходим для ввода данных в виде необработанных байтов и -fдля ввода данных из файла. Пример ввода по ссылке TIO вместо этого был вручную переведен из примера на вики-странице Netpbm .

Кроме того, я хотел бы поблагодарить вики Brain-Flak за предоставление полезных фрагментов кода для работы. В частности, реализация Bubble-Sort здесь сыграла важную роль на последнем этапе, когда я получил счетчик для каждого цвета, так как на самом деле не имел ни малейшего представления, с чего начать иначе. Потребовалась тяжелая модификация, но я рад, что мне не пришлось начинать с нуля.

Вот версия кода без комментариев и комментариев. Brain-Flak слишком многословен, чтобы включать в этот пост полезное отформатированное объяснение, но в нем нет версии для TIO, в которой есть все, что я включил бы в одну, с лучшим форматированием, чем я мог бы здесь управлять, поэтому, если вы заинтересованы, пожалуйста, возьмите смотреть.

Возможно, еще предстоит заняться игрой в гольф, мой предыдущий ответ на «Brain-Flak» прошел через множество пересмотров, но, надеюсь, извлеченные уроки дали этому лучшую отправную точку.

Камил Дракари
источник
0

Python 2, 186 байт

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

Попробуйте онлайн!

Отказ от ответственности: Представленные результаты являются однострочными для удобочитаемости. Выводы кода приводят к пробелу и разделению строк в соответствии с запросом.

Выход для 10red 20blue 30black 40white:

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

Выход для синего градиента:

[('#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)]

Выход для тестового изображения

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

Объяснение:

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
Мертвый Опоссум
источник
0

Java (1.4+) , 483 428 байт

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);}}

Попробуйте онлайн!(Не работает онлайн)


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);
    }
}

toString()Карты выдает так:

{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}

Пожалуйста, не публикуйте 1.8 конкретных предложений по игре в гольф, если только это не работает в более старой Java, я не хочу.

Пример: лямбды не работают в большем количестве версий Java, чем в.

Урна волшебного осьминога
источник
« Пожалуйста, не публикуйте 1.8 конкретных предложений по игре в гольф, если только это не работает в более старой Java, я не хочу». Из любопытства: почему Java 4, а Java 10 уже доступна?
Кевин Круйссен,
Некоторые игры в гольф, которые должны работать в Java 4 (я думаю): 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 байт )
Кевин Круйссен
@KevinCruijssen Поскольку 1.8, возможно, был самым большим выпуском с точки зрения кода, который не будет работать с предыдущими версиями. Большинство других выпусков были исправлениями и добавлениями классов в JRE. 1.8 был наименее совместим с предыдущими JRE.
Волшебный Осьминог Урна
@KevinCruijssen x.toHexIntegerбыл умнее статического импорта.
Волшебный Осьминог Урна
Также не Java 3, потому что Java 3 ... действительно ... имеет так мало ярлыков ...
Волшебный осьминог Urn
0

SmileBASIC, 165 байт

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

Изображение задается в виде массива 32-битных значений цвета ARGB (альфа-значение обрезается, когда число преобразуется в шестизначную шестнадцатеричную строку)

12Me21
источник