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!


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:



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.


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

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]))


[...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!


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


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! .


4

R , 5 bytes

Existe uma função interna para isso.

order

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

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.


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


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

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

MATLAB / oitava , 29 bytes

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

Experimente online!


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


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]

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.


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.


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!


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.