Obter os índices de uma matriz após a classificação

14

Seu desafio hoje é escrever um programa ou função que faça uma lista le dê as posições nas lquais cada elemento sucessivo da lclassificação aparece.

Em outras palavras, imprima o índice do menor valor, seguido pelo índice do segundo menor valor, etc.

Você pode assumir que a matriz de entrada conterá apenas números inteiros positivos e conterá pelo menos um elemento.

Casos de teste:

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]

Quando dois ou mais elementos com o mesmo valor aparecerem, seus índices deverão aparecer próximos um do outro, do menor para o maior.

Isso é , o menor número de bytes vence!

Pavel
fonte
16
-1 para um desafio trivial que pode ser resolvido com recursos internos em idiomas comuns de golfe e para aceitar uma resposta em menos de 24 horas. Este não foi um desafio justo, nem interessante.
Cody Gray
3
Bem, entendo por que ele aceitou uma resposta dentro de 24 horas, é impossível vencer.
Zacharý
3
@CodyGray Eu pensei em voto negativo quando vi a resposta de 1-2 bytes, mas, na verdade, não acho que seja um grande desafio para linguagens de programação mais padrão. Claro, não é um desafio difícil , mas ainda há definitivamente algumas possibilidades de golfe. É claro que é desagradável ver os embutidos de 1 byte, mas não acho justo culpar o desafio por isso.
Dada
1
Usar um caractere de 1 caractere dificilmente é prática. Fácil não significa necessariamente solucionável usando apenas componentes internos.
JAD
2
A melhor solução nesses casos é esquecer o recurso de aceitação, que não é realmente relevante aqui.
Mr. Xcoder

Respostas:

9

Geléia , 1 byte

Experimente online!

Dennis
fonte
Heh que era muito óbvio ...
Erik o Outgolfer
2
A APL mereceu essa, +1 pela velocidade.
Zacharý
@ Zacharý Eu tenho certeza que Jelly pegou essa aqui de J, que por sua vez a herdou da APL.
Adám 17/08/19
11

Dyalog APL, 1 byte

O Dyalog APL possui uma função de operador integrada (obrigado Zacharý por esclarecer isso) para fazer isso.

Exemplo

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

Aqui, estou indexando na lista pelos índices classificados para retornar a lista em ordem crescente.

James Heslip
fonte
Ah, apenas para alertá-lo sobre alguma terminologia confusa, no APL, os built-in como são considerados funções, enquanto coisas como ¨⍨⍣.∘/\⌿⍀⌸⍤são operadores.
Zacharý
9

Haskell , 43 42 bytes

1-indexed:

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

Experimente online!

-1 byte graças a @ ØrjanJohansen!

ბიმო
fonte
2
Versão pointfree salva um byte: map snd.sort.(`zip`[1..]).
Ørjan Johansen
9

Python 2 , 56 bytes

Esta solução é indexada em 0. Isso abusa do fato de sorted()criar uma cópia da lista original.

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

Experimente online!

Mr. Xcoder
fonte
Por que você destruiu isso?
Erik the Outgolfer
@EriktheOutgolfer Fixed, Rollback.
Sr. Xcoder 30/07/2017
9

Javascript (ES6), 39 bytes

-2 bytes graças a @powelles

Isso funciona apenas em navegadores onde Array.prototype.sorté estável.

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

Versão indexada em 1 (47 bytes):

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

Exemplo de trecho de código:

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
fonte
[...a.keys()]em vez de a.map((_,i)=>i), você economizará alguns bytes.
Powelles
7

Python 2 , 48 bytes

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

Experimente online!

Erik, o Outgolfer
fonte
Legal, eu fui derrotado> _ <. Troquei a minha resposta para Python 3 de tal forma que eu não me sinto tão ruim
Mr. Xcoder
4
@ Mr.Xcoder Bem, isso é seu trabalho ...
Neil
@ Mr.Xcoder Vamos lá, você não deve se sentir mal por isso! Você criou um programa completo, eu criei uma função e minha abordagem é um pouco diferente.
Erik the Outgolfer
Não me sinto mal, sabia que isso iria aparecer (eu pessoalmente odeio a __<blahblah>__sintaxe). Vou fazer alguma Jelly, eu não quero perder a minha formação :)
Mr. Xcoder
1
@ Mr.Xcoder Codegolf não significa muito sintaxe e formatação. ;)
Erik the Outgolfer
5

Perl 6 ,  27  21 bytes

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

Teste-o

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

Teste-o

Inspirado por uma resposta 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
fonte
5

Bash + coreutils, 20

nl|sort -nk2|cut -f1

Experimente online .

Trauma Digital
fonte
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}}

Suíte de teste.

Explicação

No Swift, l.sorted()cria uma cópia classificada da matriz original. Fazemos um loop pelos elementos classificados na lista e após imprimir o índice de cada item na matriz original com let a=l.index(of:k)!;print(a)e, a fim de manter os índices corretos na matriz, atribuímos l[a]a ela 0, porque isso não afeta nossa saída normal.


Observe que esse índice é 0, pois é uma porta da minha solução Python. Se você deseja que ele seja indexado 1, substitua print(a)por print(a+1)ou Experimente on-line! .

Mr. Xcoder
fonte
4

R , 5 bytes

Existe uma função interna para isso.

order
djhurio
fonte
3
Regras padrão é fornecer um programa de função. orderjá é uma função, para que você não precise manipular as entradas usando scan(). Isso seria 5 bytes.
JAD 31/07
rank()salvaria um byte
gstats
1
Tenho certeza de que houve uma rankresposta de @JarkoDubbeldam, mas não a vejo mais.
djhurio
1
Correto, ele não segue as especificações, então eu as apaguei.
JAD
3

MATL , 2 bytes

&S

Experimente online!

Entrada e saída estão implícitas.

Sanchises
fonte
3

Oitava , 17 bytes

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

Experimente online!

O Octave é como o MATLAB, mas com atribuição em linha, possibilitando coisas que causam dores de cabeça ao pessoal do Mathworks HQ. Não importa como você chama y, mas você não pode prescindir dessa variável fictícia, até onde eu sei.

Sanchises
fonte
3

MEU , 3 bytes

MY também tem um builtin para isso!

⎕⍋↵

Experimente online!

Quão?

Entrada avaliada, classificação superior e saída com uma nova linha.

Indexado, no entanto, você define o índice com / 0x48. (Pode até ser um número inteiro estranho como -1ou 2, o padrão é 1).

Zacharý
fonte
3

Java 8, 128 + 19 = 147 bytes

Baseado na solução do Sr. Xcoder . Baseado em 0. O Lambda recebe a entrada como Integer[]e retorna Integer[]. A contagem de bytes inclui expressão lambda e importação necessária.

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;}

Experimente Online

Lambda ungolfed

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

Eu uso em Integer[]vez de int[]permitir o uso de Arrays.asList, que não tem versões primitivas. Integeré preferido paraLong porque os valores são usados ​​como índices de matriz e exigiriam conversão.

Isso acabou sendo mais curto do que o meu melhor estilo processual List solução no , devido ao custo dos nomes de classe e método.

Isso também superou uma solução que tentei que transmitia as entradas, mapeadas para (valor, índice) pares , classificadas em valores e mapeadas para índices, principalmente por causa da bagagem necessária para coletar o fluxo.

Agradecimentos

  • -5 bytes graças a Nevay
Jakob
fonte
1
Você não precisa de 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 comum, 82 bytes

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

Experimente online!

Renzo
fonte
2

Clojure, 39 bytes

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

MATLAB / oitava , 29 bytes

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

Experimente online!

Luis Mendo
fonte
Embora sua resposta seja o MATLAB perfeito, você pode realmente atribuir inline em funções anônimas no Octave .
Sanchises
Um bom! Eu sabia sobre atribuição em linha, mas não sabia que você poderia produzir diretamente dessa maneira.
Luis Mendo
1
Para ser sincero, eu também não. Comecei com algo assim @(X)([~,y]=sort(X))e, enquanto procurava uma maneira de obter yisso, percebi que yera realmente o valor de retorno da tarefa, e uma inspeção mais detalhada revelou que nem eram necessários colchetes. O MATLAB gosta de tudo explícito; Oitava é feliz quando é inequívoco.
Sanchises
2

JavaScript (ES6), 69 bytes

Indexado a 0. Funciona para listas que contêm até 65.536 elementos.

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

Casos de teste

Arnauld
fonte
Você pode mudar n=>a.indexOf(n)para apenas a.indexOf?
Zacharý
@ Zacharý Infelizmente não. Um método de um objeto instanciado não pode ser usado como retorno de chamada.
Arnauld
@ Zacharý Pior ainda é que Array#mappassa 3 argumentos para a função de retorno de chamada e Array#indexOfespera 2, para dar resultados indesejáveis.
kamoroso94
2

Casca , 10 7 bytes

Esta é uma porta direta da minha resposta Haskell , também 1indexada:

m→O`z,N

Experimente online!

Ungolfed / Explained

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]
ბიმო
fonte
2

Java (OpenJDK 8) , 72 bytes

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

Experimente online!

Leva um List<Integer> , retorna umaStream<Integer> contendo os resultados.

Obtemos um fluxo com base na lista inicial, classificamos e mapeamos cada número para seu índice na lista. Para acomodar elementos duplicados, definimos o elemento original na lista como 0.

Xanderhall
fonte
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

Muito simples, basta gerar uma lista de números de 1 a (comprimento da matriz) e classificá-la pela mesma ordem que a entrada.

12Me21
fonte
2

Python 3 com Numpy , 38 26 bytes

12 bytes salvos graças a Jo King (não é necessário dar um nome à função)

import numpy
numpy.argsort

A saída é baseada em 0.

Experimente online!

Luis Mendo
fonte
A função poderia ser apenas numpy.argsortsem a parte lambda
Jo rei
@JoKing Obrigado pela sugestão. Eu escrevi dessa maneira porque com apenas numpy.argsort;import numpyeu recebo um erro ( numpyainda não foi importado) e com import numpy;numpy.argsorteu preciso passar f=para a parte do código. Você sabia que o procedimento padrão é nesses casos? Mover o f=e não contar?
Luis Mendo
Sim, eu acho. Talvez apenas redefinir f=numpy.argsortno rodapé
Jo rei
@JoKing Boa ideia. Feito. Obrigado!
Luis Mendo
1

PHP , 54 bytes

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

Experimente online!

Isso é zero-indexado. Simplesmente classifica a matriz e retorna as chaves.

WebSmithery
fonte
1
A <?phptag é desnecessária para uma função. 48 bytes.
Titus
1

Tcl , 21 bytes

(Indexado a 0)

puts [lsort -indi $L]

Experimente online!

sergiol
fonte
Os casos de teste têm apenas números de 1 dígito; minha solução só funciona bem em números de 1 dígito.
Sergiol # 21/17