Dada una lista de enteros estrictamente positivos, revise cada número distinto y reemplace todas las ocurrencias con índices sucesivos (basados en cero o uno) de una nueva serie.
Ejemplos
[]
→ []
/[]
[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]
Respuestas:
JavaScript (ES6), 26 bytes
1 indexado.
Pruébalo en línea!
Comentado
fuente
-~
antes, eso es una joya absoluta.a
para almacenar los valores, pero es necesario para-
/~
el índice para que no se guarde ningún byte.-~
es en realidad una alternativa de uso común+1
(ya que tiene una precedencia diferente) en muchos idiomasR , 27 bytes
Pruébalo en línea!
Explicacion:
ave(x,x,FUN=seq)
divide el vectorx
en sub-vectores usando valores dex
como claves de agrupación. Luegoseq
se llama a la función para cada grupo y cada resultado se reorganiza en la posición original del grupo.Mejor ver un ejemplo:
Nota :
seq(y)
La función devuelve una secuencia1:length(y)
en caso de que lay
tengalength(y) > 1
, pero devuelve una secuencia de1:y[1]
siy
contiene solo un elemento.Afortunadamente, esto no es un problema porque en ese caso R , quejándose con muchas advertencias, selecciona solo el primer valor que, por cierto, es lo que queremos :)
fuente
ave
antes.MATL , 4 bytes
Esta solución está basada en 1
¡Pruébalo en MATL Online !
Explicación
Usos
[1,2,3,2]
como ejemplofuente
APL (Dyalog Unicode) , 7 bytes
Muchas, muchas gracias a H.PWiz, Adám y dzaima por toda su ayuda para depurar y corregir esto.
Pruébalo en línea!
Explicación
La versión no tácita de 10 bytes será más fácil de explicar primero
La versión tácita hace tres cosas.
⍵
used in,\⍵
as,\
a la derecha por sí misma, puede deducir implícitamente que se supone que debe funcionar con el argumento correcto.⍵=
, reemplazamos el⍵
con⊢
, que significa argumento correcto⍵
), podemos eliminar las llaves{}
ya que las funciones tácitas no las usan.fuente
AWK , 14
Pruébalo en línea!
Lo anterior hace indexación basada en uno. Si prefiere la indexación basada en cero, es un byte adicional:
Pruébalo en línea!
fuente
{print++a[$1]}
sin espacio parece estar funcionandoJ , 7 bytes
Pruébalo en línea!
1 indexado.
Explicación:
K (oK) ,
1110 bytes-1 byte gracias a ngn!
Pruébalo en línea!
fuente
='
->=
Python 2 , 48 bytes
Pruébalo en línea!
fuente
05AB1E , 4 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
C # (compilador interactivo de Visual C #) , 44 bytes
Pruébalo en línea!
fuente
[7,7,7]
debería salir[0,1,2]
, y no[0,0,0]
.Python 2 ,
4743 bytesPruébalo en línea!
Una solución recursiva 'basada en uno'.
fuente
Jalea , 4 bytes
Pruébalo en línea!
Para cada prefijo de la lista de entrada, cuenta el número de ocurrencias de su último elemento en sí mismo.
fuente
;\ċ"
también es 4.R , 41 bytes
Pruébalo en línea!
Curiosamente, devolver un índice basado en cero es más corto en R.
fuente
Ruby, 35 bytes
Desafortunadamente, es bastante mundano: cree un hash que almacene el total de cada entrada encontrada hasta ahora.
Algunas otras opciones divertidas que desafortunadamente no fueron lo suficientemente cortas:
fuente
R ,
6243 bytes-19 bytes gracias a Giuseppe, al eliminar cuál, y tabla, y solo pequeños cambios en la implementación
Original
No puedo competir con el conocimiento de Giuseppe, por lo que mi sumisión es algo más larga que la suya, pero usando mi conocimiento básico, sentí que esta solución era bastante ingeniosa.
r<-table(x)
cuenta la cantidad de veces que aparece cada número y lo almacena en r, para referencia futuranames()
obtiene los valores de cada entrada única en la tabla e iteramos sobre estos nombres con un bucle for.La porción restante verifica qué entradas son iguales a las iteraciones y almacena una secuencia de valores (desde 1 hasta el número de entradas de la iteración)
Pruébalo en línea!
fuente
which()
para guardar 7 bytes.1:r[i]
me dio la idea de eliminar portable()
completo: ¡x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
son 43 bytes! Este es un buen enfoque!Haskell , 44 bytes
Pruébalo en línea!
Explicación
Atraviesa la lista de izquierda a derecha manteniendo la lista
x
de elementos visitados, inicialmente[]
:Para cada encuentro de un
y
conteo, todos los elementos iguales en la listax
.fuente
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
Pruébelo en línea!Perl 6 , 15 bytes
Pruébalo en línea!
Puede mover el
++
a antes del%
para un índice basado en uno.Explicación:
fuente
Haskell ,
4746 bytesPruébalo en línea!
Un enfoque diferente a la respuesta de BMO que resultó un poco más largo. (Y amablemente toma prestado su bonito traje de prueba).
La idea es iterar sobre la lista de entrada y realizar un seguimiento de la cantidad de veces que cada elemento ha ocurrido al actualizar una función
g
. Sin golf:Surgieron dos interesantes oportunidades de golf. Primero para el valor inicial de
g
, una función constante que ignora su argumento y devuelve0
:Y en segundo lugar, una expresión sobre variables
x
yy
que produce1
six
es igualy
y de lo0
contrario:Todavía puede haber formas más cortas. Alguien tiene una idea?
fuente
0^(x-y)^2
.Java (JDK) , 76 bytes
Pruébalo en línea!
Créditos
fuente
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
afor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Ruby , 34 bytes
Pruébalo en línea!
fuente
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
y no pensé en construir una nueva matriz, jajaja. Buen trabajo.bash,
3724 bytesTIO
si es válido, también existe esta variación, como lo sugiere DigitalTrauma
TIO
fuente
Perl 5, 11 bytes
TIO
explicaciones después del comentario
$_
La variable especial de Perl que contiene la línea actual cuando se repite la entrada (-p
o-n
conmutadores)$h{$_}++
autovivifica el mapa%h
y crea una entrada con clave$_
e incrementos y da el valor antes del incremento-p
interruptor, el-l
interruptor elimina el final de la línea en la entrada y agrega el final de la línea en la salidafuente
Pari / GP , 32 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 33 bytes
Pruébalo en línea!
fuente
Adjunto , 23 bytes
Pruébalo en línea!
Explicación
fuente
C (gcc) ,
6562 bytesPruébalo en línea!
-2 bytes gracias a solo ASCII
Esto se sintió demasiado sencillo, pero no podía acortarme más con un enfoque diferente.
fuente
K (ngn / k) , 18 bytes
Pruébalo en línea!
ANTIGUO ENFOQUE
K (ngn / k) ,
27 2322 bytesPruébalo en línea!
esto no es bonito ... solución rápida y sucia, voy a refinar esto más adelante cuando tenga la oportunidad de pensar en un mejor enfoque
explicación:
=x
devuelve un dict donde las claves son elementos de xy los valores son sus índices (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
asignar dict ai
#:'
contar valores para cada clave (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
enumerar cada valor (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
extraer valores y aplanar la lista (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
extraer índices de i, aplanar y asignar cada valor de la lista del lado derecho en estos índicesmolestamente, la lista se actualiza pero la asignación devuelve un valor nulo, así que necesito devolver la lista después del punto y coma (
;x
)editar: eliminó dos puntos extraños
edit2: se eliminó la asignación innecesaria
fuente
Retina 0.8.2 , 30 bytes
Pruébalo en línea! El enlace incluye casos de prueba. 1 indexado. Explicación: La primera parte de la expresión regular coincide con cada número entero en la lista. El grupo de lookbehind coincide con cada aparición de ese entero en esa línea hasta e incluyendo el entero actual. El número entero se sustituye con el número de coincidencias.
fuente
Lote, 61 bytes
1 indexado. Debido a que la sustitución de variables ocurre antes del análisis, el
set/a
comando termina incrementando el nombre de la variable dado al concatenar la letrac
con el entero de la lista (las variables numéricas están predeterminadas a cero en Batch). El resultado se copia a otro entero para facilitar la salida (más precisamente, guarda un byte).fuente
Tcl , 48 bytes
Pruébalo en línea!
fuente
Japt, 8 bytes
Pruébalo aquí
fuente