Получив список строго положительных целых чисел, просмотрите каждое отдельное число и замените все его вхождения последовательными индексами (от нуля до единицы) новой серии.
Примеры
[]
→ []
/[]
[42]
→ [0]
/[1]
[7,7,7]
→ [0,1,2]
/[1,2,3]
[10,20,30]
→ [0,0,0]
/[1,1,1]
[5,12,10,12,12,10]
→ [0,0,0,1,2,1]
/[1,1,1,2,3,2]
[2,7,1,8,2,8,1,8,2,8]
→ [0,0,0,0,1,1,1,2,2,3]
/[1,1,1,1,2,2,2,3,3,4]
[3,1,4,1,5,9,2,6,5,3,5,9]
→ [0,0,0,1,0,0,0,0,1,1,2,1]
/[1,1,1,2,1,1,1,1,2,2,3,2]
Ответы:
JavaScript (ES6), 26 байт
1-индексироваться.
Попробуйте онлайн!
комментарии
источник
-~
раньше - это абсолютная жемчужина.a
для хранения значений, но это необходимо для-
/~
индекса, чтобы ни один байт не был сохранен.-~
на самом деле является широко используемой альтернативой+1
(поскольку она имеет разный приоритет) во многих языкахR , 27 байт
Попробуйте онлайн!
Пояснение:
ave(x,x,FUN=seq)
разбивает векторx
на подвекторы, используя значенияx
ключей группировки. Затемseq
вызывается функция для каждой группы, и каждый результат возвращается в исходное положение группы.Лучше посмотрите пример:
Заметка :
seq(y)
Функция возвращает последовательность1:length(y)
в случае , еслиy
имеетlength(y) > 1
, но возвращает последовательность из1:y[1]
еслиy
содержит только один элемент.К счастью, это не проблема, потому что в этом случае R - жалуется с большим количеством предупреждений - выбирает только первое значение, которое, кстати, то, что мы хотим :)
источник
ave
раньше.MATL , 4 байта
Это решение на основе 1
Попробуйте это в MATL Online !
объяснение
Используется
[1,2,3,2]
в качестве примераисточник
APL (Dyalog Unicode) , 7 байтов
Большое, большое спасибо H.PWiz, Adám и dzaima за их помощь в отладке и исправлении этого.
Попробуйте онлайн!
объяснение
10-байтная неявная версия будет проще объяснить
Молчаливая версия делает три вещи
⍵
используется в», так,\⍵
как,\
справа сам по себе может неявно выяснить, что он должен работать с правильным аргументом.⍵=
, заменим⍵
с⊢
, которая выступает за правый аргумент⍵
), мы можем удалить фигурные скобки,{}
поскольку неявные функции их не используютисточник
AWK , 14
Попробуйте онлайн!
Вышесказанное делает индексацию по одному. Если вы предпочитаете индексирование с нуля, это дополнительный байт:
Попробуйте онлайн!
источник
{print++a[$1]}
без пробела, кажется, работаетJ 7 байт
Попробуйте онлайн!
1-индексироваться.
Объяснение:
K (ок) ,
1110 байт-1 байт благодаря ngn!
Попробуйте онлайн!
источник
='
->=
Python 2 , 48 байт
Попробуйте онлайн!
источник
05AB1E , 4 байта
Попробуйте онлайн! или как тестовый набор
объяснение
источник
C # (интерактивный компилятор Visual C #) , 44 байта
Попробуйте онлайн!
источник
[7,7,7]
должен выводить[0,1,2]
, а не[0,0,0]
.Python 2 ,
4743 байтаПопробуйте онлайн!
Рекурсивное решение «на основе одного».
источник
Желе , 4 байта
Попробуйте онлайн!
Для каждого префикса входного списка он считает количество вхождений своего последнего элемента в себе.
источник
;\ċ"
также 4.R , 41 байт
Попробуйте онлайн!
Как ни странно, возвращение нулевого индекса короче в R.
источник
Рубин, 35 байт
К сожалению, это довольно обыденно - создайте хеш, в котором хранится сумма для каждой найденной записи.
Некоторые другие забавные варианты, которые, к сожалению, не были достаточно короткими:
источник
R ,
6243 байта-19 байт благодаря Giuseppe, удалив который и таблицу, и лишь незначительные изменения в реализации
оригинал
Я не могу соревноваться со знаниями Джузеппе, поэтому мое представление несколько длиннее его, но, используя свои базовые знания, я почувствовал, что это решение было довольно гениальным.
r<-table(x)
подсчитывает количество раз, которое появляется каждое число, и сохраняет его в r для дальнейшего использованияnames()
получает значения каждой уникальной записи в таблице, и мы перебираем эти имена с помощью цикла for.Оставшаяся часть проверяет, какие записи равны итерациям, и сохраняет последовательность значений (от 1 до количества записей итерации).
Попробуйте онлайн!
источник
which()
чтобы сохранить 7 байтов.1:r[i]
дало мне идею просто удалитьtable()
полностью:x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
это 43 байта! Это хороший подход!Haskell , 44 байта
Попробуйте онлайн!
объяснение
Обходит список слева направо, сохраняя список
x
посещенных элементов, первоначально[]
:Для каждой встречи
y
подсчитайте все равные элементы в спискеx
.источник
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
попробуйте онлайн!Perl 6 , 15 байт
Попробуйте онлайн!
Вы можете переместить в
++
перед%
для одного индекса.Объяснение:
источник
Haskell ,
4746 байтовПопробуйте онлайн!
Другой подход, чем ответ BMO, который оказался немного длиннее. (И любезно позаимствует их хороший тестовый костюм.)
Идея состоит в том, чтобы перебрать список ввода и отследить, сколько раз каждый элемент встречался, обновляя функцию
g
. Ungolfed:Возникли две интересные возможности для игры в гольф. Сначала для начального значения
g
постоянной функции, которая игнорирует ее аргумент и возвращает0
:И, во-вторых, выражение над переменными
x
иy
которое дает,1
еслиx
равноy
и в0
противном случае:Там все еще могут быть более короткие пути. У кого-нибудь есть идея?
источник
0^(x-y)^2
.Java (JDK) , 76 байт
Попробуйте онлайн!
кредиты
источник
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
наfor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Рубин , 34 байта
Попробуйте онлайн!
источник
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
и не думал просто о создании нового массива, смеется. Хорошо сделано.bash,
3724 байтаTIO
если он действителен, то есть также этот вариант, как предлагает DigitalTrauma
TIO
источник
Perl 5, 11 байт
TIO
объяснения после комментария
$_
специальная переменная perl, содержащая текущую строку при циклическом вводе (-p
или-n
переключателях)$h{$_}++
автоматически оживляет карту%h
и создает запись с ключом$_
и приращениями и дает значение перед приращением-p
переключателя,-l
переключатель удаляет конец строки на входе и добавляет конец строки на выходеисточник
Пари / ГП , 32 байта
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 33 байта
Попробуйте онлайн!
источник
Атташе , 23 байта
Попробуйте онлайн!
объяснение
источник
C (gcc) ,
6562 байтаПопробуйте онлайн!
-2 байта благодаря ASCII-только
Это казалось слишком простым, но я не мог стать короче с другим подходом.
источник
К (нгн / к) , 18 байт
Попробуйте онлайн!
СТАРЫЙ ПОДХОД
K (нгн / к) ,
27 2322 байтаПопробуйте онлайн!
это не красиво ... быстрое и грязное решение, я уточню это позже, когда у меня будет возможность придумать лучший подход
объяснение:
=x
возвращает условие, где ключи - это элементы x, а значения - их индексы (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
назначить диктi
#:'
подсчитать значения для каждого ключа (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
перечислить каждое значение (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
извлечь значения и сгладить список (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
извлекать индексы из i, выравнивать и назначать каждое значение из правого списка по этим индексамдосадно, список обновляется, но присваивание возвращает нулевое значение, поэтому мне нужно вернуть список после точки с запятой (
;x
)редактировать: удалены посторонние двоеточия
edit2: удалено ненужное назначение
источник
Сетчатка 0.8.2 , 30 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. 1-индексироваться. Объяснение: Первая часть регулярного выражения соответствует каждому целому числу в списке по очереди. Группа lookbehind соответствует каждому вхождению этого целого числа в этой строке вплоть до текущего целого числа. Затем целое число заменяется количеством совпадений.
источник
Пакет, 61 байт
1-индексироваться. Поскольку подстановка переменной происходит перед синтаксическим анализом,
set/a
команда в итоге увеличивает имя переменной, заданное путем объединения буквыc
с целым числом из списка (числовые переменные по умолчанию равны нулю в пакетном режиме). Затем результат копируется в другое целое число для простоты вывода (точнее, он сохраняет байт).источник
Tcl , 48 байт
Попробуйте онлайн!
источник
Japt, 8 байт
Попробуй здесь
источник