Sumário
Dada uma lista de números inteiros, retorne o índice em que cada número inteiro terminaria ao ser classificado.
Por exemplo, se a lista estivesse [0,8,-1,5,8]
, você deveria retornar [1,3,0,2,4]
. Observe que os dois 8
s mantêm sua ordem em relação um ao outro (a classificação é estável).
Em outras palavras: para cada elemento da lista, retorne o número de elementos na lista que são: Menor que o elemento escolhido OR (igual ao elemento AND aparece antes do elemento escolhido)
Os índices devem começar com 0 (não 1) EDIT: dada a grande recuo, permitirei indicações baseadas em 1.
Casos de teste:
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
fonte
fonte
[0 1 ... n-1]
.8,10,4,-1,-1
caso de teste é muito enganador. Experimente o4,4,0,1,1,2,0,1
primeiro.Respostas:
APL, 2 bytes
O "nivelamento" interno, aplicado duas vezes. Funciona se a indexação começar em 0, o que não é o padrão para todos os tipos de APL. Experimente aqui!
Por que isso funciona?
⍋x
retorna uma lista de índices que seriam classificados de forma estávelx
. Por exemplo:porque se você pegar o elemento
2
,6
então3
... você recebe uma lista classificada de forma estável:Mas a lista de índices que responde a essa pergunta é sutilmente diferente: primeiro queremos o índice do menor elemento, depois o segundo menor etc. - novamente, mantendo a ordem original.
Se observarmos
⍋x
, porém, veremos que ela pode nos fornecer essa lista facilmente: a posição de um0
in⍋x
nos diz onde o menor elemento terminaria após a classificação e a posição de1
in⍋x
nos diz onde o segundo menor elemento acabaria etc.Mas sabemos que
⍋x
contém exatamente os números [0, 1 ... n-1] . Se a classificarmos novamente , obteremos apenas o índice de0
in⍋x
, o índice de1
in⍋x
, etc., e é exatamente nisso que estamos interessados.Então a resposta é
⍋⍋x
.fonte
Geléia, 2 bytes
Classifique duas vezes. 1 indexado. Experimente online!
fonte
JavaScript ES6,
8782797470 bytesNão gosto de usar um objeto, mas parece ser a maneira mais curta de rastrear os enganos
Explicação
fonte
K ,
52 bytesClassifique (
<
) duas vezes. JohnE salvou três bytes apontando expressões tácitas existentes no K! Muito legal. Experimente.fonte
<<
. Experimente aqui .Haskell,
5048 bytesExemplo de uso:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Está
map snd.sort.zip x [0..]
aplicado duas vezes na entrada, ou seja, emparelhe cada elemento e com seu índice i ((e,i)
), classifique-o e remova os primeiros elementos. Repita uma vez.O @Lynn surgiu com
m=map snd.sort.(`zip`[0..])
a mesma contagem de bytes.fonte
Python 2,
6760 bytesGraças a @xnor por jogar fora 7 bytes!
Teste em Ideone .
fonte
enumerate
pode ser feito mais curto com umzip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 bytes
Recebe entrada
$n
, canaliza através de um loop sobre todos os elementos|%{...}
. A cada iteração,sort
$n
obtemos oIndexOf
elemento atual$_
. Isso conta quantos itens são menores que o elemento atual. Adicionamos a isso uma fatia de$n
, que expande toda iteração de loop, dos elementos que são iguais ao elemento atual$_
e retira o valor.Count
disso. Em seguida, subtraímos-1
para não contar nosso elemento atual e esse número é deixado no pipeline. A saída no final está implícita.Exemplos
fonte
CJam, 15 bytes
Experimente online!
Explicação
fonte
J, 5 bytes
Classifique (
/:
) duas vezes (^:2
). Indexado a 0.Para testá-lo, digite
f =: /:^:2
e, em seguida,f 4 4 0 1 1 2 0 1
em tryj.tk .fonte
/:@/:
com uma contagem de bytes igual.MATL,
1094 bytes4 bytes salvos graças a @Luis
Esta solução usa indexação baseada em 1
Experimente Online
fonte
05AB1E, 12 bytes
Explicado
Experimente online
fonte
Python 2, 67 bytes
O xnor salvou dois bytes.
fonte
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 bytes
Anote cada elemento com seu índice e, em seguida, mapeie cada elemento para a contagem de elementos menores, com desempate no índice. Sem classificação.
fonte
Julia, 17 bytes
1 indexado. Classifique (
sortperm
) duas vezes. Experimente aqui.Edição: Dennis salvou quatro bytes, dando nomes de operador-y coisas! Julia é estranha.
fonte
JavaScript (ES6), 52 bytes
Define
g
como a função de classificação, que retorna uma matriz de índices da qual todos os elementos na matriz classificada teriam vindo na matriz original. Infelizmente, o que queremos são os índices para os quais todos os elementos irão. Felizmente, isso acaba sendo o mapeamento da nota para a lista original de índices, que por si só pode ser considerado o resultado da classificação da nota, o que nos permite tirar a nota da nota para alcançar o resultado desejado.fonte
Pitão,
109 bytes1 byte graças a Jakube.
Suíte de teste.
Não deve ser um caminho mais curto ...
fonte
xL
em vez desxR
. Ou estou negligenciando alguma coisa?Raquete, 117 bytes
Estou eternamente decepcionado com a falta de uma base para isso.
fonte
Ruby,
5453 bytesExperimente online
-1 byte da atualização para a abordagem do @ Downgoat de usar um hash para armazenar valores em vez de contar as duplicatas a cada vez.
fonte
Clojure, 83 bytes
I create an anonymous function that grades the input array up and iterate it twice on the input. The first call will return the grade. The second call operates on the grade and returns the rank.
fonte
Brachylog, 27 bytes
Try it online! or verify all test cases.
Explanation
This is a straightforward implementation of the following relationship: each integer of the output corresponding to an element of the input is the index of that element in the sorted input.
fonte
Mathematica, 15 bytes
fonte
Mathematica, 135 bytes
fonte
Common Lisp, 117 bytes
Apply a Schwartzian transform twice.
Test
fonte
JavaScript (using external library) (105 bytes)
Link to lib: https://github.com/mvegh1/Enumerable Explanation of code: Create anonymous method that accepts a list of integers. _.From creates an instance of the library that wraps an array with special methods. Select maps each item to a new item, by taking the "v"alue, parsing it to a string, then concatenating the "i"ndex of that item (this solves duplicate value case). Thats stored in variable 'a'. Then we return the result of the following: Map each item in 'a' to the index of that item in the sorted version of a (as integers), and cast back to a native JS array
Note that negative duplicate numbers seem to print in the reverse order. I'm not sure if that invalidates this solution? Technically 8,10,4,-1,-1,8 should be 3,5,2,0,1,4 according to OP but my code is printing 3,5,2,1,0,4 which I believe is still technically valid?
fonte
GNU Core Utils,
3933 bytesProduces 1-based output. Add
-v0
after the secondnl
to get 0-based output. (+4 bytes)Commands we are using:
nl
adds line numbers to each line of the input.sort -n -k 2
sorts by column 2 numerically.cut -f 1
takes the first Tab-delimited column, discarding the rest.Além disso, a
-s
opção pode ser passada parasort
solicitar uma classificação estável, mas não precisamos dela aqui. Se dois itens forem idênticos,sort
determinará sua ordem voltando para as outras colunas, que neste caso é a saída monotonicamente crescente denl
. Portanto, a classificação será estável sem precisar especificá-la, em virtude da entrada.fonte
Java
149140 bytesGolfe
Obrigado a @ Kevin Cruissjen pelo corte de 9 bytes.
fonte
int[] a
andint[] b
. You can take theint
out of the loops. And since you useb.length
twice at the start you can put it in a separate field. So in total something like this: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, also, it doesn't seem to work..Arrays.sort(...)
doesn't return anything (it's avoid
method), so how can you compare it withb[i]
?..PHP, 88 bytes
operates on command line arguments; prints 0-indexed, underscore-separated list. Run with
-nr
.breakdown
fonte
MATLAB, 29 bytes
Most of MATLAB's sorting built-ins will return an optional second array containing the sorted indices. The
j=
could be removed if printing the indices is acceptable, rather than returning them.fonte
CJam, 19 bytes
Try it online!
Explanation:
fonte