Код:
? v=[2, 1, 1, 2, 3, 1, 2, 4, 4, 2, 2, 2];
? s=vecsort(v, , 8)
%2 = [1, 2, 3, 4] -- только уникальные элементы
? k=vector(#s,n, #select(x->x==s[n],v))
%3 = [3, 6, 1, 2] -- по сколько штук их каждого
? q=vecsort(k, , 5)
%4 = Vecsmall([2, 1, 4, 3]) -- вектор перестановок по уменьшению количества повторов
? s=vecextract(s, q)
%5 = [2, 1, 4, 3] -- переставляем список уникальных элементов
? k=vecextract(k, q)
%6 = [6, 3, 2, 1] -- переставляем количество их повторов
? for(i=1,#s, print(s[i],": ",k[i]," times"); ); \\вывод
2: 6 times
1: 3 times
4: 2 times
3: 1 times
Переставлять векторы s,k не обязательно, можно просто идти по векторам в порядке q:
Код:
? v=[2, 1, 1, 2, 3, 1, 2, 4, 4, 2, 2, 2];
? s=vecsort(v, , 8)
%2 = [1, 2, 3, 4] -- только уникальные элементы
? k=vector(#s,n, #select(x->x==s[n],v))
%3 = [3, 6, 1, 2] -- по сколько штук их каждого
? q=vecsort(k, , 5)
%4 = Vecsmall([2, 1, 4, 3]) -- вектор перестановок по уменьшению количества повторов
? foreach(Vec(q),i, print(s[i],": ",k[i]," times"); ); \\вывод, foreach кажется не гарантирует перебор в порядке увеличения, зато удобно и на практике работает
2: 6 times
1: 3 times
4: 2 times
3: 1 times
При этом никакие вектора не портятся, все остаются в исходном состоянии. Если дальше сортировка по количеству повторов не используется, то вектор q можно не сохранять и переставить его вычисление прямо в foreach.
Вместо for и foreach можно использовать и vector (но вектор q придётся сохранять) (гарантирует ли vector перебор в порядке увеличения индекса я не в курсе):
Код:
? vector(#q,i, print(s[q[i]],": ",k[q[i]]," times")) \\косвенное обращение
2: 6 times
1: 3 times
4: 2 times
3: 1 times
%1 = [0, 0, 0, 0] -- здесь критично отсутствие символа ; после vector, а нули вернул каждый print
Ещё способ перебора без сохранения q (и наверное тоже без гарантии порядка):
Код:
? apply(i->print(s[i],": ",k[i]," times"), Vec(q)) \\i перебирается по содержимому q
2: 6 times
1: 3 times
4: 2 times
3: 1 times
%1 = [0, 0, 0, 0] -- здесь критично отсутствие символа ; после apply, а нули вернул каждый print