Resumen
Dada una lista de enteros, devuelve el índice en el que terminaría cada entero cuando se ordenara.
Por ejemplo, si la lista era [0,8,-1,5,8]
, debería regresar [1,3,0,2,4]
. Tenga en cuenta que los dos 8
s mantienen su orden entre sí (el orden es estable).
Dicho de otra manera: para cada elemento de la lista, devuelva el número de elementos en la lista que son: Menor que el elemento elegido O (igual al elemento Y aparece antes del elemento elegido)
Los índices deben comenzar con 0 (no 1) EDITAR: dado el gran retroceso, permitiré indicios basados en 1.
Casos de prueba:
0 -> 0
23 -> 0
2,3 -> 0,1
3,2 -> 1,0
2,2 -> 0,1
8,10,4,-1,-1,8 -> 3,5,2,0,1,4
0,1,2,3,4,5,6,7 -> 0,1,2,3,4,5,6,7
7,6,5,4,3,2,1,0 -> 7,6,5,4,3,2,1,0
4,4,0,1,1,2,0,1 -> 6,7,0,2,3,5,1,4
1,1,1,1,1,1,1,1 -> 0,1,2,3,4,5,6,7
1,1,1,1,1,1,1,0 -> 1,2,3,4,5,6,7,0
code-golf
array-manipulation
sorting
Nathan Merrill
fuente
fuente
[0 1 ... n-1]
.8,10,4,-1,-1
caso de prueba es muy engañoso. Prueba el4,4,0,1,1,2,0,1
primero.Respuestas:
APL, 2 bytes
El "subir de grado" incorporado, aplicado dos veces. Funciona si la indexación comienza en 0, que no es el valor predeterminado para todos los tipos de APL. Pruébalo aquí!
¿Por qué funciona esto?
⍋x
devuelve una lista de índices que lo haría de manera estable especiex
. Por ejemplo:porque si tomas elemento
2
,6
entonces3
... entonces obtienes una lista ordenada establemente:Pero la lista de índice que responde a esta pregunta es sutilmente diferente: primero queremos el índice del elemento más pequeño, luego el segundo más pequeño, etc., nuevamente, manteniendo el orden original.
Sin
⍋x
embargo, si miramos, vemos que puede darnos esta lista fácilmente: la posición de un0
in⍋x
nos dice dónde terminaría el elemento más pequeño después de la clasificación, y la posición de un1
in⍋x
nos dice dónde terminaría el segundo elemento más pequeño etc.Pero sabemos que
⍋x
contiene exactamente los números [0, 1 ... n − 1] . Si lo calificamos nuevamente , solo obtendremos el índice de0
in⍋x
, luego el índice de1
in⍋x
, etc., que es precisamente lo que nos interesa.Entonces la respuesta es
⍋⍋x
.fuente
Jalea, 2 bytes
Sube de grado dos veces. 1 indexado. Pruébalo en línea!
fuente
JavaScript ES6,
8782797470 bytesNo me gusta usar un objeto, pero parece ser la forma más corta de hacer un seguimiento de los engañados
Explicación
fuente
K ,
52 bytesSube de nivel (
<
) dos veces. ¡JohnE ahorró tres bytes al señalar que existen expresiones tácitas en K! Super guay. Pruébalo.fuente
<<
. Probar aquí .Haskell,
5048 bytesEjemplo de uso:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Se
map snd.sort.zip x [0..]
aplica dos veces en la entrada, es decir, empareja cada elemento e con su índice i ((e,i)
), ordena y elimina los primeros elementos. Repite una vez.A @Lynn se le ocurrió
m=map snd.sort.(`zip`[0..])
que tiene el mismo número de bytes.fuente
Python 2,
6760 bytes¡Gracias a @xnor por jugar golf en 7 bytes!
Pruébalo en Ideone .
fuente
enumerate
se puede hacer más corto con unzip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 bytes
Toma entrada
$n
, canaliza eso a través de un bucle sobre cada elemento|%{...}
. Cada iteración, nosotrossort
$n
y obtener elIndexOf
nuestro elemento actual$_
. Esto cuenta cuántos elementos son más pequeños que el elemento actual. Agregamos a eso una porción de$n
, que expande cada iteración de bucle, de los elementos que son iguales al elemento actual$_
y toman el.Count
de eso. Luego restamos-1
para no contar nuestro elemento actual, y ese número queda en la tubería. La salida al final es implícita.Ejemplos
fuente
CJam, 15 bytes
Pruébalo en línea!
Explicación
fuente
J, 5 bytes
Sube de categoría (
/:
) dos veces (^:2
). 0 indexado.Para probarlo, escribir
f =: /:^:2
y luegof 4 4 0 1 1 2 0 1
en tryj.tk .fuente
/:@/:
con un recuento de bytes igual.MATL,
1094 bytes4 bytes guardados gracias a @Luis
Esta solución utiliza indexación basada en 1
Pruébalo en línea
fuente
05AB1E, 12 bytes
Explicado
Pruébalo en línea
fuente
Python 2, 67 bytes
xnor guardó dos bytes.
fuente
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 bytes
Anote cada elemento con su índice, luego asigne cada elemento al recuento de elementos más pequeños, rompiendo el empate en el índice. Sin clasificación
fuente
Julia, 17 bytes
1 indexado. Sube de nivel (
sortperm
) dos veces.Pruébalo aquíEDITAR: ¡Dennis ahorró cuatro bytes dando nombres de operadores! Julia es rara.
fuente
JavaScript (ES6), 52 bytes
Se define
g
como la función de calificación, que devuelve una matriz de índices de la cual todos los elementos de la matriz ordenada habrían venido de la matriz original. Lamentablemente, lo que queremos son los índices a los que irán todos los elementos. Afortunadamente, esto resulta ser el mapeo de la calificación a la lista original de índices, que en sí misma puede considerarse el resultado de la clasificación de la calificación, lo que nos permite tomar la calificación de la calificación para lograr el resultado deseado.fuente
Pyth,
109 bytes1 byte gracias a Jakube.
Banco de pruebas.
No debe ser un camino más corto ...
fuente
xL
en lugar desxR
. ¿O estoy pasando por alto algo?Raqueta, 117 bytes
Estoy eternamente decepcionado por la falta de un proyecto incorporado para esto.
fuente
Ruby,
5453 bytesPruébalo en línea
-1 byte de la actualización al enfoque de @ Downgoat de usar un hash para almacenar valores en lugar de contar los duplicados cada vez.
fuente
Clojure, 83 bytes
Creo una función anónima que califica la matriz de entrada y la repite dos veces en la entrada. La primera llamada devolverá la calificación. La segunda llamada opera en la calificación y devuelve el rango.
fuente
Brachylog , 27 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Explicación
Esta es una implementación sencilla de la siguiente relación: cada entero de la salida correspondiente a un elemento de la entrada es el índice de ese elemento en la entrada ordenada.
fuente
Mathematica, 15 bytes
fuente
Mathematica, 135 bytes
fuente
Lisp común, 117 bytes
Aplicar una transformación de Schwartz dos veces.
Prueba
fuente
JavaScript (usando una biblioteca externa) (105 bytes)
Enlace a lib: https://github.com/mvegh1/Enumerable Explicación del código: Cree un método anónimo que acepte una lista de enteros. _.Desde crea una instancia de la biblioteca que envuelve una matriz con métodos especiales. Seleccione asigna cada elemento a un nuevo elemento, tomando el alor "v", analizándolo en una cadena y luego concatenando el índice "i" de ese elemento (esto resuelve el caso de valores duplicados). Eso se almacena en la variable 'a'. Luego devolvemos el resultado de lo siguiente: Asigna cada elemento en 'a' al índice de ese elemento en la versión ordenada de a (como enteros), y vuelve a convertirlo en una matriz JS nativa
Tenga en cuenta que los números duplicados negativos parecen imprimirse en el orden inverso. No estoy seguro si eso invalida esta solución? Técnicamente 8,10,4, -1, -1,8 deberían ser 3,5,2,0,1,4 según OP, pero mi código está imprimiendo 3,5,2,1,0,4, que creo que es ¿sigue siendo técnicamente válido?
fuente
GNU Core Utils,
3933 bytesProduce una salida basada en 1. Agregar
-v0
después del segundonl
para obtener una salida basada en 0. (+4 bytes)Comandos que estamos usando:
nl
agrega números de línea a cada línea de la entrada.sort -n -k 2
ordena por columna 2 numéricamente.cut -f 1
toma la primera columna delimitada por tabulaciones, descartando el resto.Además, el
-s
se puede pasar opción asort
para solicitar una ordenación estable, pero no la necesitamos aquí. Si dos elementos son idénticos,sort
determinará su orden volviendo a las otras columnas, que en este caso es la salida monotónicamente creciente denl
. Por lo tanto, la ordenación será estable sin necesidad de especificarlo, en virtud de la entrada.fuente
Java
149140 bytesGolfed
Gracias a @Kevin Cruissjen por el afeitado de 9 bytes.
fuente
int[] a
yint[] b
. Puedes sacarint
los bucles. Y como lo usab.length
dos veces al principio, puede colocarlo en un campo separado. Entonces, en total, algo como esto:int[]a(int[]b){int l=b.length,o[]=new int[l],i,j;for(i=-1;++i<l;)for(j=-1;++i<b.length;)if(b[i]==Arrays.sort(b.clone())[j])o[i]=j;return o;}
( 140 bytes ) Hmm, además, no parece funcionar ...Arrays.sort(...)
no devuelve nada (es unvoid
método), entonces, ¿cómo puedes compararlo conb[i]
...?PHP, 88 bytes
opera en argumentos de línea de comando; imprime una lista separada por guiones bajos y con índice 0. Corre con
-nr
.Descompostura
fuente
MATLAB, 29 bytes
La mayoría de las funciones integradas de ordenación de MATLAB devolverán una segunda matriz opcional que contiene los índices ordenados. los
j=
podrían eliminarse si la impresión de los índices es aceptable, en lugar de devolverlos.fuente
CJam , 19 bytes
Pruébalo en línea!
Explicación:
fuente