Obtenga los índices de una matriz después de ordenar


14

Su desafío hoy es escribir un programa o función que tome una lista ly dé las posiciones en las lque laparece cada elemento sucesivo de ordenado.

En otras palabras, muestre el índice del valor más pequeño, seguido del índice del segundo valor más pequeño, etc.

Puede suponer que la matriz de entrada contendrá solo enteros positivos y contendrá al menos un elemento.

Casos de prueba:

Input                  | Output (1-indexed)
[7, 4, 5]              | [2, 3, 1]
[1, 2, 3]              | [1, 2, 3]
[2, 6, 1, 9, 1, 2, 3]  | [3, 5, 1, 6, 7, 2, 4]
[4]                    | [1]

Cuando aparecen dos o más elementos con el mismo valor, sus índices deben aparecer uno al lado del otro, de menor a mayor.

Este es el , ¡gana la menor cantidad de bytes!


16
-1 para un desafío trivial que se puede resolver con funciones integradas en idiomas comunes de golf y para aceptar una respuesta en menos de 24 horas. Este no fue un desafío justo ni interesante.
Cody Gray

3
Bueno, entiendo por qué aceptó una respuesta en 24 horas, es imposible de superar.
Zacharý

3
@CodyGray Pensé en votar cuando vi la respuesta de 1-2 bytes, pero en realidad, no creo que sea un mal desafío para más lenguajes de programación estándar. Por supuesto, no es un desafío difícil , pero aún así, definitivamente hay algunas posibilidades de golf. Por supuesto, es desagradable ver incorporaciones de 1 byte, pero no creo que sea justo culpar al desafío por eso.
Dada

1
Usar un personaje de 1 carácter no es práctica. Fácil no significa necesariamente que se pueda resolver usando solo componentes incorporados.
JAD

2
La mejor solución en tales casos es olvidarse de la función de aceptación, que de todos modos no es realmente relevante aquí.
Sr. Xcoder

Respuestas:



11

Dyalog APL, 1 byte

Dyalog APL tiene una función de operador incorporada (gracias Zacharý por aclarar esto) para hacer esto.

Ejemplo

⍋11 2 4 15
    2 3 1 4  
{⍵[⍋⍵]}11 4 2 15
    2 4 11 15

Aquí estoy indexando en la lista por los índices ordenados para devolver la lista en orden ascendente.


Ah, solo para alertarlo sobre alguna terminología confusa, en APL, las funciones integradas se consideran funciones, mientras que cosas como ¨⍨⍣.∘/\⌿⍀⌸⍤los operadores.
Zacharý



9

Javascript (ES6), 39 bytes

-2 bytes gracias a @powelles

Esto solo funciona en navegadores donde Array.prototype.sortes estable.

a=>[...a.keys()].sort((b,c)=>a[b]-a[c])

Versión indexada 1 (47 bytes):

a=>a.map((_,i)=>i+1).sort((b,c)=>a[b-1]-a[c-1])

Fragmento de código de ejemplo:

f=
a=>[...a.keys()].sort((b,c)=>a[b]-a[c])
console.log("7,4,5 => "+f([7,4,5]))
console.log("1,2,3 => "+f([1,2,3]))
console.log("2,6,1,9,1,2,3 => "+f([2,6,1,9,1,2,3]))
console.log("4 -> "+f([4]))


[...a.keys()]en lugar de a.map((_,i)=>i)le ahorrará un par de bytes.
powelles

7

Python 2 , 48 bytes

lambda x:sorted(range(len(x)),key=x.__getitem__)

Pruébalo en línea!


Bien, me sobrepasé> _ <. Cambié mi respuesta a Python 3 de tal manera que no me siento tan mal
Sr. Xcoder

44
@ Mr.Xcoder Bueno, ese es su trabajo ...
Neil

@ Mr.Xcoder ¡Vamos, no deberías sentirte mal por eso! Hiciste un programa completo, hice una función, y mi enfoque es un poco diferente.
Erik the Outgolfer

No me siento mal, sabía que esto aparecerá (personalmente odio la __<blahblah>__sintaxis). Haré un poco de gelatina, no quiero perder mi entrenamiento :)
Sr. Xcoder

1
@ Mr.Xcoder Codegolf no significa bonita sintaxis y formato. ;)
Erik the Outgolfer

5

Perl 6 ,  27  21 bytes

*.pairs.sort(*.value)».key

Pruébalo

->\x{sort {x[$_]},^x}

Pruébalo

Inspirado en una respuesta de Python

Expandido:

->    # pointy block lambda
  \x  # declare sigilless parameter
{
  sort
    { x[$_] },  # sort by the value in 「x」 at the given position
    ^x          # Range up-to the number of elements in 「x」
}


4

Swift 4 , 82 bytes

func f(l:[Int]){var l=l;for k in l.sorted(){let a=l.index(of:k)!;print(a);l[a]=0}}

Banco de pruebas.

Explicación

En Swift, l.sorted()crea una copia ordenada de la matriz original. Recorremos los elementos ordenados en la lista y después de imprimir el índice de cada elemento en la matriz original con let a=l.index(of:k)!;print(a), y luego, para mantener los índices correctos en la matriz, asignamos l[a]a 0, porque no afecta nuestra salida normal.


Tenga en cuenta que esto está indexado en 0, ya que es un puerto de mi solución Python. Si usted quiere que sea indexada 1, sustituir print(a)con print(a+1)o Pruébelo en línea! .


4

R , 5 bytes

Hay una función integrada para esto.

order

3
Las reglas estándar son proporcionar un programa de función. orderya es una función, por lo que no tiene que manejar la entrada usando scan(). Esto sería de 5 bytes.
JAD

rank()ahorraría un byte
gstats

1
Estoy seguro de que hubo una rankrespuesta de @JarkoDubbeldam, pero ya no la veo.
djhurio

1
Correcto, no sigue las especificaciones, así que lo eliminé.
JAD




3

Octava , 17 bytes

@(i)[~,y]=sort(i)

Pruébalo en línea!

Octave es como MATLAB pero con asignación en línea, lo que hace posible las cosas que le dan dolor de cabeza a la gente de Mathworks HQ. No importa cómo llame y, pero no puedo prescindir de esa variable ficticia, que yo sepa.


3

MI , 3 bytes

¡MY también tiene un incorporado para esto!

⎕⍋↵

Pruébalo en línea!

¿Cómo?

Entrada evaluada, subir de nivel, luego salida con una nueva línea.

Indexado sin embargo establece el índice, con / 0x48. (Incluso puede ser un número entero extraño como -1o 2, el valor predeterminado es 1).


3

Java 8, 128 + 19 = 147 bytes

Basado en la solución del Sr. Xcoder . Basado en 0. Lambda toma la entrada como an Integer[]y regresa Integer[]. El recuento de bytes incluye la expresión lambda y la importación requerida.

import java.util.*;

l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;)l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0;return o;}

Pruébalo en línea

Lambda sin golf

l -> {
    Integer
        o[] = l.clone(),
        s[] = l.clone(),
        i = 0
    ;
    for (Arrays.sort(s); i < l.length; )
        l[o[i] = Arrays.asList(l).indexOf(s[i++])] = 0;
    return o;
}

Notas

Utilizo en Integer[]lugar de int[]permitir el uso de Arrays.asList, que no tiene versiones primitivas. Integerse prefiere Longporque los valores se usan como índices de matriz y requerirían conversión.

Esto terminó siendo más corto que mi mejor estilo de procedimiento List solución de debido al costo de los nombres de clase y método.

Esto también superó una solución que probé que transmitía las entradas, asignadas a (valor, índice) pares , ordenaba por valores y asignaba a índices, principalmente debido al equipaje necesario para recopilar la transmisión.

Expresiones de gratitud

  • -5 bytes gracias a Nevay

1
No necesita j: l->{Integer o[]=l.clone(),s[]=l.clone(),i=0;for(Arrays.sort(s);i<l.length;l[o[i]=Arrays.asList(l).indexOf(s[i++])]=0);return o;}(19 + 128 bytes).
Nevay




2

MATLAB / Octave , 29 bytes

[~,y]=sort(input(''));disp(y)

Pruébalo en línea!


Si bien su respuesta es MATLAB perfecta, en realidad puede hacer una asignación en línea en funciones anónimas en Octave .
Sanchises

Bueno uno! Sabía sobre la asignación en línea, pero no sabía que se podía enviar directamente así
Luis Mendo

1
Para ser sincero, yo tampoco. Comencé con algo así @(X)([~,y]=sort(X)), y mientras buscaba una forma de obtener yesto, me di cuenta de que en yrealidad era el valor de retorno de la asignación, y una inspección más cercana reveló que ni siquiera se necesitaban corchetes. A MATLAB le gusta todo lo explícito; Octave es feliz cuando no es ambiguo.
Sanchises

2

JavaScript (ES6), 69 bytes

0 indexado. Funciona para listas que contienen hasta 65.536 elementos.

a=>[...a=a.map((n,i)=>n<<16|i)].sort((a,b)=>a-b).map(n=>a.indexOf(n))

Casos de prueba


¿Se puede cambiar n=>a.indexOf(n)a justo a.indexOf?
Zacharý

@ Zacharý Lamentablemente no. Un método de un objeto instanciado no se puede utilizar como devolución de llamada.
Arnauld

@ Zacharý Aún peor es que Array#mappasa 3 argumentos a la función de devolución de llamada y Array#indexOfespera 2, por lo que dará resultados no deseados.
kamoroso94


2

cascarilla , 10 7 bytes

Este es un puerto directo de mi respuesta de Haskell , también 1-indexado:

m→O`z,N

Pruébalo en línea!

Sin golf / Explicado

Code        Description               Example
         -- implicit input            [2,6,1]
      N  -- natural numbers           [1,2,3,..]
   `z,   -- zip, but keep input left  [(2,1),(6,2),(1,3)]
  O      -- sort                      [(1,3),(2,1),(6,2)]
m→       -- keep only indices         [3,1,2]

2

Java (OpenJDK 8) , 72 bytes

l->l.stream().sorted().map(i->{int j=l.indexOf(i);l.set(j,0);return j;})

Pruébalo en línea!

Toma un List<Integer>, devuelve unStream<Integer> contiene los resultados.

Obtenemos un flujo basado en la lista inicial, lo clasificamos, luego asignamos cada número a su índice en la lista. Para acomodar elementos duplicados, establecemos el elemento original en la lista en 0.


2

SmileBASIC, 67 bytes

DEF I(A)DIM B[0]FOR I=1TO LEN(A)PUSH B,I
NEXT
SORT A,B
RETURN B
END

Muy simple, todo lo que hace es generar una lista de números del 1 al (longitud de la matriz) y ordenar esto en el mismo orden que la entrada.


2

Python 3 con Numpy , 38 26 bytes

12 bytes guardados gracias a Jo King (no es necesario darle un nombre a la función)

import numpy
numpy.argsort

La salida está basada en 0.

Pruébalo en línea!


La función podría estar numpy.argsortsin la parte lambda
Jo King

@JoKing Gracias por la sugerencia. Lo escribí de esa manera porque con solo numpy.argsort;import numpyrecibo un error ( numpyaún no se ha importado), y con import numpy;numpy.argsortnecesito pasar f=a la parte del código. ¿Sabes que el procedimiento estándar es en estos casos? ¿Mover f=y no contarlo?
Luis Mendo

Yeah Yo supongo. Tal vez solo redefinir f=numpy.argsorten el pie de página
Jo King

@JoKing Buena idea. Hecho. ¡Gracias!
Luis Mendo



1

PHP , 54 bytes

<?php function i($a){asort($a);return array_keys($a);}

Pruébalo en línea!

Esto está indexado a cero. Simplemente ordena la matriz y devuelve las claves.


1
La <?phpetiqueta es innecesaria para una función. 48 bytes.
Titus

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.