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!

Pavel
fuente
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:

9

Jalea , 1 byte

Pruébalo en línea!

Dennis
fuente
Je, eso era demasiado obvio ...
Erik the Outgolfer
2
APL merecía este, aunque +1 por tu velocidad.
Zacharý
@ Zacharý Estoy seguro de que Jelly lo recogió de J, que a su vez lo heredó de APL.
Adám
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.

James Heslip
fuente
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

Haskell , 43 42 bytes

1-indexado:

import Data.List
map snd.sort.(`zip`[1..])

Pruébalo en línea!

-1 byte gracias a @ ØrjanJohansen!

ბიმო
fuente
2
Versión Pointfree ahorra un byte: map snd.sort.(`zip`[1..]).
Ørjan Johansen
9

Python 2 , 56 bytes

Esta solución está indexada en 0. Esto abusa del hecho de que sorted()crea una copia de la lista original.

l=input()
for k in sorted(l):a=l.index(k);print a;l[a]=0

Pruébalo en línea!

Sr. Xcoder
fuente
¿Por qué deshonestaste esto?
Erik the Outgolfer
@EriktheOutgolfer Fijo, Rollback.
Sr. Xcoder
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]))

Herman L
fuente
[...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!

Erik el Outgolfer
fuente
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」
}
Brad Gilbert b2gills
fuente
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! .

Sr. Xcoder
fuente
4

R , 5 bytes

Hay una función integrada para esto.

order
djhurio
fuente
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.

Sanchises
fuente
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).

Zacharý
fuente
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
Jakob
fuente
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

Lisp común, 82 bytes

(lambda(l)(loop as i in(sort(copy-seq l)'<)do(setf(elt l(print(position i l)))0)))

Pruébalo en línea!

Renzo
fuente
2

Clojure, 39 bytes

#(map key(sort-by val(zipmap(range)%)))
NikoNyrh
fuente
Traducido al Perl 6{map *.key,(sort *.value,(0..* Z=> @_))}
Brad Gilbert b2gills
2

MATLAB / Octave , 29 bytes

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

Pruébalo en línea!

Luis Mendo
fuente
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

Arnauld
fuente
¿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]
ბიმო
fuente
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.

Xanderhall
fuente
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.

12Me21
fuente
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!

Luis Mendo
fuente
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.

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

Tcl , 21 bytes

(0 indexado)

puts [lsort -indi $L]

Pruébalo en línea!

sergiol
fuente
Los casos de prueba solo tienen números de 1 dígito; mi solución solo funciona bien en números de 1 dígito.
sergiol