Dada uma lista de números inteiros estritamente positivos, passe por cada número distinto e substitua todas as ocorrências por índices sucessivos (zero ou um com base) de uma nova série.
Exemplos
[]
→ []
/[]
[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]
Respostas:
JavaScript (ES6), 26 bytes
1 indexado.
Experimente online!
Comentado
fonte
-~
antes - isso é uma jóia absoluta.a
para armazenar os valores, mas é necessário-
/~
o índice para que nenhum byte seja salvo.-~
é na verdade uma alternativa comumente usada+1
(já que tem precedência diferente) em vários idiomasR , 27 bytes
Experimente online!
Explicação:
ave(x,x,FUN=seq)
divide o vetorx
em subvectores usando valores dex
como chaves de agrupamento. Em seguida, aseq
função é chamada para cada grupo e cada resultado é reorganizado na posição original do grupo.Melhor ver um exemplo:
Nota :
seq(y)
A função retorna uma sequência1:length(y)
casoy
tenhalength(y) > 1
, mas retorna uma sequência de1:y[1]
sey
contiver apenas um elemento.Felizmente, isso não é um problema porque, nesse caso, R - reclamando com muitos avisos - seleciona apenas o primeiro valor que é aliás o que queremos :)
fonte
ave
antes.MATL , 4 bytes
Esta solução é baseada em 1
Experimente no MATL Online !
Explicação
Usa
[1,2,3,2]
como exemplofonte
APL (Dyalog Unicode) , 7 bytes
Muito, muito obrigado a H.PWiz, Adám e dzaima por toda sua ajuda na depuração e correção disso.
Experimente online!
Explicação
A versão não-tácita de 10 bytes será mais fácil de explicar primeiro
A versão tácita faz três coisas
⍵
usado em,\⍵
como,\
à direita, por si só pode figurar implicitamente que é suposto para operar no argumento de direito.⍵=
, substituímos por⍵
com⊢
, que significa argumento correto⍵
), podemos remover os chavetas{}
porque as funções tácitas não os usamfonte
AWK , 14
Experimente online!
O acima faz indexação baseada em um. Se você preferir indexação baseada em zero, é um byte extra:
Experimente online!
fonte
{print++a[$1]}
sem espaço parece estar funcionandoJ , 7 bytes
Experimente online!
1 indexado.
Explicação:
K (oK) ,
1110 bytes-1 byte graças a ngn!
Experimente online!
fonte
='
->=
Python 2 , 48 bytes
Experimente online!
fonte
05AB1E , 4 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
C # (compilador interativo do Visual C #) , 44 bytes
Experimente online!
fonte
[7,7,7]
deve sair[0,1,2]
, e não[0,0,0]
.Python 2 ,
4743 bytesExperimente online!
Uma solução recursiva 'one-based'.
fonte
Gelatina , 4 bytes
Experimente online!
Para cada prefixo da lista de entrada, ele conta o número de ocorrências do último elemento em si.
fonte
;\ċ"
também é 4.R , 41 bytes
Experimente online!
Estranhamente, retornar um índice baseado em zero é mais curto em R.
fonte
Ruby, 35 bytes
Infelizmente, é bastante mundano - crie um hash que armazene o total de cada entrada encontrada até agora.
Algumas outras opções divertidas que infelizmente não eram curtas o suficiente:
fonte
R ,
6243 bytes-19 bytes graças a Giuseppe, removendo what, e table, e apenas pequenas alterações na implementação
Original
Como não posso competir com o conhecimento de Giuseppe, minha submissão é um pouco mais longa que a dele, mas, usando meu conhecimento básico, senti que essa solução era bastante engenhosa.
r<-table(x)
conta o número de vezes que cada número aparece e o armazena em r, para referência futuranames()
obtém os valores de cada entrada exclusiva na tabela e iteramos sobre esses nomes com um loop for.A parte restante verifica quais entradas são iguais às iterações e armazena uma sequência de valores (de 1 ao número de entradas da iteração)
Experimente online!
fonte
which()
para salvar 7 bytes.1:r[i]
me deu a idéia de removertable()
completamente:x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
são 43 bytes! Esta é uma boa abordagem!Haskell , 44 bytes
Experimente online!
Explicação
Percorre a lista da esquerda para a direita, mantendo a lista
x
dos elementos visitados, inicialmente[]
:Para cada encontro de uma
y
contagem, todos os elementos iguais na listax
.fonte
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
experimente online!Perl 6 , 15 bytes
Experimente online!
Você pode mover o
++
para antes do%
para um índice baseado em um.Explicação:
fonte
Haskell ,
4746 bytesExperimente online!
Uma abordagem diferente da resposta da BMO, que ficou um pouco mais longa. (E gentilmente pede emprestado seu belo traje de teste.)
A idéia é percorrer a lista de entrada e acompanhar o número de vezes que cada elemento ocorreu, atualizando uma função
g
. Ungolfed:Surgiram duas oportunidades interessantes de golfe. Primeiro para o valor inicial de
g
, uma função constante que desconsidera seu argumento e retorna0
:E, em segundo lugar, uma expressão sobre variáveis
x
ey
que produz1
sex
iguaisy
ou0
não:Ainda pode haver maneiras mais curtas. Alguém teve uma ideia?
fonte
0^(x-y)^2
.Java (JDK) , 76 bytes
Experimente online!
Créditos
fonte
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
parafor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Ruby , 34 bytes
Experimente online!
fonte
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
e não pensei em apenas construir uma nova matriz, lol. Bom trabalho.bash,
3724 bytesTIO
se válida, também há essa variação, conforme sugerido pelo DigitalTrauma
TIO
fonte
Perl 5, 11 bytes
TIO
explicações após o comentário
$_
variável especial do perl que contém a linha atual ao passar pela entrada (-p
ou-n
comutadores)$h{$_}++
autivivifica o mapa%h
e cria uma entrada com chave$_
e incrementos e fornece o valor antes do incremento-p
chave, a-l
chave remove o fim da linha na entrada e adiciona o fim da linha na saídafonte
Pari / GP , 32 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) , 33 bytes
Experimente online!
fonte
Anexo , 23 bytes
Experimente online!
Explicação
fonte
C (gcc) ,
6562 bytesExperimente online!
-2 bytes graças ao ASCII-only
Isso parecia muito simples, mas eu não conseguia ficar mais curto com uma abordagem diferente.
fonte
K (ngn / k) , 18 bytes
Experimente online!
ABORDAGEM ANTIGA
K (ngn / k) ,
27 2322 bytesExperimente online!
isso não é bonito ... solução rápida e suja, refino isso mais tarde quando tiver a chance de pensar em uma abordagem melhor
explicação:
=x
retorna um ditado em que chaves são itens de x e valores são seus índices (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
atribuir ditado ai
#:'
contar valores para cada chave (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
enumere cada valor (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
extrair valores e achatar list (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
extrair índices de i, achatar e atribuir cada valor da lista do lado direito a esses índicesirritantemente, a lista é atualizada, mas um valor nulo é retornado pela atribuição, então eu preciso retornar a lista após o ponto-e-vírgula (
;x
)editar: dois pontos estranhos removidos
edit2: removida atribuição desnecessária
fonte
Retina 0.8.2 , 30 bytes
Experimente online! O link inclui casos de teste. 1 indexado. Explicação: A primeira parte do regex corresponde a cada número inteiro na lista por vez. O grupo lookbehind corresponde a cada ocorrência desse número inteiro nessa linha até e incluindo o número inteiro atual. O número inteiro é então substituído pelo número de correspondências.
fonte
Lote, 61 bytes
1 indexado. Como a substituição de variável ocorre antes da análise, o
set/a
comando acaba incrementando o nome da variável fornecido concatenando a letrac
com o número inteiro da lista (as variáveis numéricas são padronizadas como zero no lote). O resultado é copiado para outro número inteiro para facilitar a saída (mais precisamente, ele salva um byte).fonte
Tcl , 48 bytes
Experimente online!
fonte
Japonês, 8 bytes
Experimente aqui
fonte