Classificar uma lista de números inteiros

21

Você recebe uma lista não vazia de números inteiros positivos, por exemplo

[6 2 9 7 2 6 5 3 3 4]

Você deve classificar esses números pelo seu valor, mas, como é habitual nas tabelas de classificação, se houver um empate, todos os números empatados obterão a mesma classificação e um número apropriado de classificações será ignorado. O resultado esperado para a lista acima seria, portanto,

[3 9 1 2 9 3 5 7 7 6]

Por exemplo, o valor mais alto na entrada foi 9, então isso se torna um 1(primeiro rank). O terceiro valor mais alto é 6, então ambos 6se tornam 3e a classificação 4é ignorada completamente.

Regras

Você pode usar qualquer formato de lista simples, conveniente e inequívoco para entrada e saída. A primeira / menor classificação na saída deve sempre ser 1 .

Você pode escrever um programa ou uma função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída.

Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.

Isso é , então a resposta mais curta e válida - medida em bytes - vence.

Casos de teste

[8] -> [1]
[1 15] -> [2 1]
[18 14 11] -> [1 2 3]
[11 16 14 8] -> [3 1 2 4]
[15 15 15 15 15] -> [1 1 1 1 1]
[10 2 5 4 15 5] -> [2 6 3 5 1 3]
[5 5 10 10 5 11 18] -> [5 5 3 3 5 2 1]
[2 4 9 4 17 9 17 16] -> [8 6 4 6 1 4 1 3]
[11 17 19 17 10 10 15 3 18] -> [6 3 1 3 7 7 5 9 2]
[2 11 4 8 3 3 12 20 4 18] -> [10 4 6 5 8 8 3 1 6 2]
[12 6 10 2 19 19 6 19 8 6 18] -> [5 8 6 11 1 1 8 1 7 8 4]
[5 6 14 19 13 5 19 9 19 9 9 19] -> [11 10 5 1 6 11 1 7 1 7 7 1]
[9 2 12 3 7 11 15 11 6 8 11 17 11] -> [8 13 3 12 10 4 2 4 11 9 4 1 4]
[3 5 15 7 18 5 3 9 11 2 18 1 10 19] -> [11 9 4 8 2 9 11 7 5 13 2 14 6 1]
[6 11 4 19 14 7 13 16 10 12 7 9 7 10 10] -> [14 6 15 1 3 11 4 2 7 5 11 10 11 7 7]
[11 20 11 1 20 16 11 11 4 8 9 7 11 14 10 14] -> [6 1 6 16 1 3 6 6 15 13 12 14 6 4 11 4]
[4 7 15 2 3 2 3 1 14 2 10 4 7 6 11 2 18] -> [9 6 2 13 11 13 11 17 3 13 5 9 6 8 4 13 1]
[5 1 17 7 1 9 3 6 9 7 6 3 2 18 14 4 18 16] -> [12 17 3 8 17 6 14 10 6 8 10 14 16 1 5 13 1 4]
[5 6 8 10 18 13 20 10 7 1 8 19 20 10 10 18 7 2 1] -> [16 15 11 7 4 6 1 7 13 18 11 3 1 7 7 4 13 17 18]
[12 17 8 2 9 7 15 6 19 5 13 16 14 20 10 11 18 4 3 1] -> [9 4 13 19 12 14 6 15 2 16 8 5 7 1 11 10 3 17 18 20]
Martin Ender
fonte
11
Intimamente relacionado. A diferença é que esse desafio garante que a entrada seja classificada, o que significa que a maioria das respostas depende de uma forma de indexOffunção. Acredito que, para entradas não classificadas, existem alternativas mais curtas em muitos idiomas.
Martin Ender
Sinto muito, mas acredito que isso esteja muito próximo do link de Lynn. As diferenças são mínimas: os valores estão truncados, você não pode assumir uma entrada já classificada e metade da saída tem sua ordem trocada. A resposta aceita na pergunta vinculada quase funciona. Com o mínimo esforço, alguém poderia fazê-lo funcionar. Como tal, sustento que esta é uma duplicata.
Ismael Miguel
Eu discordo, isso claramente não é uma duplicata.
Timtech
Concordo com a timtech, esse desafio é mais simples, mas não duplicado.
Tuskiomi

Respostas:

13

Solução alternativa no Excel para regras tolas em relação às entradas do mouse no Exchange Code Stack Exchange: (WESRRMICGSE) 28 bytes

rank(RC[1],r1c1:r1024:c1024)

Lista de entrada como csv ( 10,23,34,2,) no compilador depois de inserir a fonte. sem aspas, sem colchetes, vírgula à direita.

O WESRRMICGSE é exatamente como a programação no Excel, exceto que você pode omitir o sinal inicial '=' para salvar um byte. A diferença na funcionalidade vem do fato de o WESRRMICGSE arrastar a fórmula para baixo para copiar o código automaticamente e fornecer diferentes saídas fornecidas com uma única entrada inteira. fornecida uma lista como entrada, essa lista entra na coluna B (coluna de entrada) e a fórmula é desativada automaticamente para corresponder ao número de entradas. (por exemplo: a entrada 34,21,45, 'arrastaria' a fórmula para baixo em 2 células, para um total de 3 células com a fórmula).

Edit: Eu nunca esperei que esta resposta fosse popular. Uau!

tuskiomi
fonte
21
O nome do idioma é um pouco desagradável ...
Conor O'Brien
Quais regras você se refere e como exatamente elas são tolas?
Luis Mendo
3
@LuisMendo as regras declaradas aqui: meta.codegolf.stackexchange.com/questions/10199/… Acho que a regra é boba porque levei 5 minutos para escrever um 'intérprete' que contorna exatamente o que eles estão falando. Quanto mais essa linguagem pode ser usada em desafios, mais tola a regra se torna. Certifico-me de incluir isso no link.
tuskiomi
9

Python 2, 41 bytes

lambda l:map(sorted(l+[l])[::-1].index,l)

Para cada valor, encontre seu índice na lista classificada por ordem decrescente. Para fazer com que o maior valor dê 1 em vez de 0, usamos um elemento "infinito" extra da própria lista, pois o Python 2 trata as listas como maiores que os números.

Uma solução mais direta é de 42 bytes e também funciona no Python 3.

lambda l:[1+sum(y<x for x in l)for y in l]

Para cada elemento, conta o número de elementos menores, adicionando 1 para mudar para 1-indexado.

xnor
fonte
8

Geléia , 5 bytes

ṢṚiЀ

Experimente online!

Como funciona

ṢṚiЀ  Main link. Argument: A (array)

ṢṚ     Sort and reverse A.
  iЀ  Find the index of each n in A in the previous result.
Dennis
fonte
7

R, 24 25 20 bytes

Usa a função de classificação padrão com o método de empates "min" sobre o vetor negado. catadicionado para enviá-lo para STDOUT. Guardado 1 graças a @Guiseppe

cat(rank(-scan(),,"mi"))

Exemplo

> cat(rank(-scan(),,"mi"))
1: 9 2 12 3 7 11 15 11 6 8 11 17 11
14: 
Read 13 items
8 13 3 12 10 4 2 4 11 9 4 1 4
> 
MickyT
fonte
Eu acho que você precisa envolvê-lo catpara que seja um programa completo.
Alex A.
@AlexA. Eu estava me perguntando sobre isso. Seria justo dizer que esta é uma função por si só e, nesse caso, seria rank(-a,,'min')aceitável onde a é a entrada da lista em forma de vetor?
MickyT
Nesse caso, consideraríamos um trecho, porque supõe que uma variável já exista no espaço para nome. Para torná-lo um envio de função adequado, você precisaria function(a)rank(-a,,'min').
Alex A.
pode ser reduzido para apenas em "mi"vez de "min".
21717 Giuseppe
@AlexA. por que ele precisa ser embrulhado cat? Se a apresentação tinha sido function(a)rank(-a,,'mi')que possa ser considerada suficiente e a saída do programa é idêntico aorank(-scan(),,'mi')
Mark
4

PowerShell v2 +, 43 41 bytes

($a=$args)|%{@($a|sort -d).indexof($_)+1}

Desenvolvido de forma independente, mas vejo que esse é o mesmo algoritmo da solução Python do @ xnor , então / shrug.

Recebe entrada como argumentos individuais da linha de comando (ou seja, uma lista separada por espaços). Saída (formatação padrão) é uma nova linha entre elementos.

Para cada elemento na lista de entrada, sorté a lista de entrada em -dordem de tendência, pega o .indexOf()elemento atual e adiciona 1. Observe a matriz explícita convertida @(...)para contabilizar uma entrada de um dígito. Os números resultantes são deixados no pipeline e a saída está implícita.

Economizou 2 bytes graças a @Matt!

Exemplo

PS C:\Tools\Scripts\golfing> .\rank-the-integers.ps1 6 2 9 7 2 6 5 3 3 4
3
9
1
2
9
3
5
7
7
6
AdmBorkBork
fonte
Existe algum motivo para sort -dnão funcionar para você? Isso é inequívoco para mim.
Matt
@Matt Odd. No meu Win8.1 ISE, afirma que -Descendinge -Debugsão ambíguos. Mas no shell direto no Win8.1 e no shell e ISE no Win10 funciona bem. Esta não seria a primeira vez que minha instalação específica do Win8.1 é pateta ...: - / Obrigado pelo golfe!
AdmBorkBork
Isso também não funcionou para todos os casos de teste? $args|%{@($args|sort -d).indexof($_)+1}ele é mais curto, mas eu não tive uma boa olhada para saber se ele funciona
Matt
@ Matt Isso não funciona porque o segundo $argsfunciona como entrada para o bloco de scripts do loop {...}, como se você estivesse usando um filterou function.
AdmBorkBork
3

Oitava, 15 bytes

@(x)sum(x<x')+1

Porta da minha resposta MATL para Octave. Também funciona no Matlab R2016b.

O código define uma função anônima. Para chamá-lo, atribua-o a uma variável. Experimente em Ideone .

Luis Mendo
fonte
3

JavaScript (ES6), 38 36 bytes

a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)

Editar: salvou 2 bytes graças a @ETHproductions.

Neil
fonte
.mapFTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
ETHproductions
3
@ETHproductions Por que você sempre tem que estragar a minha diversão?
Neil
2

Geléia , 5 bytes

<S‘ð€

TryItOnline!

Quão?

<S‘ð€ - Main link: listOfValues
   ð  - dyadic chain separation
    € - for each
<     - less than (vectorises) - yields a list of 1s and 0s
 S    - sum - yields number of values the current value is less than (those that beat it)
  ‘   - increment - the place of a value is the number that beat it plus 1.
Jonathan Allan
fonte
Quão semelhante é o código J que eu estava prestes a enviar? 1+(+/@:<)"0 1~
Dane
Parece semelhante (usa uma redução para somar?), Mas isso não deve impedir você de postar seu código!
Jonathan Allan
Acho que fiquei imaginando o que "separação de cadeias diádicas" e "para cada" fazem em uma linguagem inspirada em J.
Dane
Ah, bem, pela sua explicação, acho que seu código é mais >€µS‘ou menos <@€µS‘( @inverte argumentos para o <operador). O J ~está implícito na cadeia à esquerda do µ, que é a separação monádica (e não diádica) e <vetoriza se o (s) argumento (s) é (são) lista (s).
Jonathan Allan
2

Perl 6 ,  42  26 bytes

Encontre o primeiro índice :kem uma [R,]lista classificada invertida

{map {[R,](.sort).first(*==$^a,:k)+1},@$_}

Conte os valores maiores e adicione um

{map {1+.grep(*>$^a)},@$_}
Brad Gilbert b2gills
fonte
2

JavaScript, 87 49 bytes

f=a=>a.slice().map(function(v){return a.sort(function(a,b){return b-a}).indexOf(v)+1 })

a=>[...a].map(v=>a.sort((a,b)=>b-a).indexOf(v)+1)

Obrigado Conor O'Brien e ETHproductions!

Oliver
fonte
11
Você pode usar uma função anônima no mapa, ou seja v=>a.sort((a,b)=>b-a).indexOf(v)+1.
Conor O'Brien
Você não precisa .slice(), porque .mapopera em uma cópia da matriz.
ETHproductions
E a política do site é que a função não precise ser nomeada, para que você possa remover a liderança f=também.
Conor O'Brien
@ETHproductions If fatia I remover, passando em [18,13,18]retornos [1,1,2]em vez de[1, 3, 1]
Oliver
Ah, isso é estranho ... Acho que é porque a.sort()armazena a matriz classificada a. Mas você pode mudar a.slice()para [...a]economizar alguns bytes.
ETHproductions
2

Mathematica, 44 bytes 42 bytes 40 bytes

xPosition[SortBy[x,-#&],#][[1,1]]&/@x

é o caractere de uso privado de 3 bytes U+F4A1( página de documentos da Wolfram )

Edit: Obrigado ao JHM pela economia de bytes.

ngenisis
fonte
11
Falha no caso de teste {10,2,5,4,15,5}(a saída {2,6,3,5,1,3}não deve ser {2,5,3,4,1,3}. Observe que 4deve ser ignorado porque existem dois 5s na entrada).
JungHwan Min
Devidamente corrigido.
Ngenisis
11
-2 bytes por comutação xe #(efetivamente se livrar dos parênteses): xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
JungHwan Min
2

Pyke, 6 bytes

FQS_@h

Experimente aqui!

F      - for i in input():
 QS    -     sorted(input())
   _   -    reversed(^)
    @  -   i.find(^)
     h -  ^+1 (not required if allowed to start from 0)
Azul
fonte
2

J , 14 8 bytes

1+1#.</~

Quão?

1+1#.</~ - Consumes and returns a list of integers
       ~ - Use the same list for both inputs
     </  - Create a table of less-than comparisons
  1#.    - Treat each row like digits of a base-one number, returning a list of integers
1+       - Increment the results

Solução anterior

1+(+/@:<)"0 1~
dinamarquês
fonte
Olá, Encontrei uma versão mais curta para 8 bytes 1+1#.</~. O somatório em linha é realizado usando a conversão de base 1. Outra alternativa é 1+\:~i.]que também tem 8 bytes.
miles
Agradável! Deseja postar sua própria resposta? Caso contrário, incluirei a melhoria da base um.
Dane
2
Não, eu estou bem apenas sugerindo economia de bytes. Sinta-se à vontade para usá-los
miles
1

Haskell, 28 bytes

f l=[1+sum[1|y<-l,y>x]|x<-l]

Apenas algumas compreensões de lista.

xnor
fonte
20 segundos tarde demais. Eu estava prestes a postar a mesma resposta.
nimi
1

Maravilha , 28 bytes

@(->@+1:0iO#0rev sort#I#1)#0

Uso:

(@(->@+1:0iO#0rev sort#I#1)#0)[6 2 9 7 2 6 5 3 3 4]

Mapeie sobre a matriz de entrada com uma função que adiciona 1 ao primeiro índice do item em uma versão ordenada descendente da entrada.

Mama Fun Roll
fonte
1

Dyalog APL , 7 bytes

⊢⍳⍨⍒⊃¨⊂

argumentos

⍳⍨ índices em

os índices que classificariam o argumento descendente

⊃¨ cada um escolhido

todo o argumento

TryAPL online!

Adão
fonte
1

Mathematica, 37 bytes

Min@Position[-Sort@-#,i]~Table~{i,#}&

Uma função pura que classificará sua entrada, conforme as regras do problema. Ex:

Min@Position[-Sort@-#, i]~Table~{i, #} &[{6, 2, 9, 7, 2, 6, 5, 3, 3, 4}]
(*{3, 9, 1, 2, 9, 3, 5, 7, 7, 6}*)
J. Antonio Perez
fonte
1

Água-viva , 15 bytes

p`&& ~i
  >/+`<

Experimente online!

Explicação

Ainda não parece ser uma boa maneira de encontrar o índice de um valor em uma lista no Jellyfish, então isso usa a abordagem de contar quantos valores são maiores que o atual e incrementar o resultado. Isso é amplamente feito através da construção de uma função unária que calcula esse valor para um determinado elemento.

     `<

Isso cria uma versão encadeada do operador de comparação; portanto, se você fornecer um número inteiro e uma lista, ele retornará uma lista de resultados de comparação entre esse número inteiro e cada elemento da lista.

     ~i
     `<

Isso atualiza o argumento do lado direito da função anterior com a lista de entradas. Portanto, o resultado é uma função unária que pega um número inteiro e fornece a lista de resultados de comparação com a entrada do programa.

   & ~i
   /+`<

Aqui /+está a redução por adição, o que significa que é simplesmente uma função "somar esta lista". &compõe isso na função anterior, então agora temos uma função unária que conta quantos valores na entrada são maiores que esse número inteiro.

  && ~i
  >/+`<

Também compomos a função de incremento para isso.

 `&& ~i
  >/+`<

Finalmente, também encadeamos essa função, para que ela seja aplicada automaticamente a cada número inteiro de uma lista passada para ela. Devido ao layout do código, também ié considerado a entrada dessa função, para que isso calcule a saída desejada.

p`&& ~i
  >/+`<

Finalmente, isso imprime o resultado.

Martin Ender
fonte
1

brainfuck, 124 bytes

->,[>>>+>,]<[-<+]+[-->[<[<<<<]>>>+>[>[>>]<[[<<+<<]>+>[->>>>]]<+>>>]+[-<<+]->]<[<
<<<]>+.,>>[>[>->+>>]<<[-<<<<]>-]+[->+]+>>>>]

Formatado:

->
,[>>>+>,]
<[-<+]
+
[
  -->
  [
    <[<<<<]
    >>>+>
    [
      >[>>]
      <
      [
        [<<+<<]
        >+>[->>>>]
      ]
      <+> >>
    ]
    +[-<<+]
    ->
  ]
  <[<<<<]
  >+.,>>
  [
    >[>->+>>]
    <<[-<<<<]
    >-
  ]
  +[->+]
  +>>>>
]

Isso foi projetado para implementações de 8-brainfuck. Entrada e saída são via valores de bytes .

Experimente online.

Para cada elemento, isso conta o número de elementos maior que ele e imprime o resultado mais um. Isso é feito incrementando todos os elementos até que o elemento atual seja igual a zero, atualizando o resultado sempre que outro elemento se torna zero antes do elemento atual.

A fita é dividida em nós de 4 células,

b c 0 0

onde cestá o elemento eb é um sinalizador de navegação negativo para o elemento atual, caso contrário, um.

O resultado e uma cópia do elemento atual são mantidos à esquerda da matriz.

Mitch Schwartz
fonte
1

Java, 215 bytes

public class G{public static void L(int[]A){int[]r=new int[A.length];for(int i=0;i<A.length;i++){int c=1;for(int j=0;j<A.length;j++){if(A[j]>A[i])c++;}r[i]=c;}for(int i=0;i<r.length;i++)System.out.print(r[i]+",");}}

Explicação:

Muito auto-explicativo.

Basicamente, para cada número inteiro na matriz, ele verifica quantos são maiores que ele e depois imprime a nova matriz com as classificações.

Sinto muito, isso não é muito conciso, mas é a minha primeira tentativa em um desses e não vi uma entrada para java. Tenho certeza de que pode ser jogado mais.

Ele pode ser executado apenas fazendo referência ao método estático e passando uma matriz. Não achei que fosse necessário escrever a função principal, mas se for, farei isso no futuro.

Henry
fonte
Você pode remover parte desse espaço em branco? Como é este não é realmente jogado golfe. (ou seja, os espaços em r = new) #
28416
@EasterlyIrk Sim, desculpe, eu não estou acostumado a fazer isso. Eu acho que me livrei de todo o espaço em branco desnecessário.
Henry
Você pode nomear o "rankNumbersGolf" como algo mais curto como "G" ou algo assim?
Rɪᴋᴇʀ
@EasterlyIrk Sim, obrigado.
Henry
Eu não java bem, mas você pode remover alguns espaços nos três for (?
Rɪᴋᴇʀ
0

PHP, 101 bytes

Deve haver uma maneira mais curta.

function f(&$a){for($r=1;$v++<max($a);$r+=$n,$n=0)foreach($a as$k=>$w)if($w===$v){$a[$k]="$r";$n++;}}

A função recebe a entrada como matriz de números inteiros, substitui a variável de entrada com as classificações como seqüências numéricas.

Uso: $a=[1,2,4,2,2,3];f($a);print_r($a);

Titus
fonte
0

Ruby, 45 40 bytes

->a{a.map{|x|a.sort.reverse.index(x)+1}}
Lee W
fonte
Como isso é chamado? Não consigo corresponder aos casos de teste, parece haver um bug com classificações iguais. Por exemplo, [10, 2, 5, 4, 15, 5]me dá saída [2, 5, 3, 4, 1, 3]quando deveria [2, 6, 3, 5, 1, 3]- acho que para corrigir que você acabou de remover .uniq- salvando 5 bytes!
Neil Slater
Eu pareço ter interpretado mal a pergunta. Obrigado por descobrir isso!
Lee W
0

Clojure, 48 44 bytes

Atualização: usando em forvez demap

#(for[i %](+(count(filter(partial < i)%))1))

Simplesmente filtra cada valor menor que o atual, conta o comprimento da lista e aumenta em um.

NikoNyrh
fonte
0

PHP, 84 bytes

function r($l){$s=$l;rsort($s);foreach($l as$n)$r[]=array_search($n,$s)+1;return$r;}

Uso: Passe a função r sua matriz de números inteiros e ela retornará a matriz correspondente de números inteiros classificados.

Passando nos testes aqui.

Progrock
fonte
0

K (oK) , 11 bytes

Solução:

1+(x@>x)?x:

Experimente online!

Exemplos:

1+(x@>x)?x:6 2 9 7 2 6 5 3 3 4
3 9 1 2 9 3 5 7 7 6
1+(x@>x)?x:5 6 14 19 13 5 19 9 19 9 9 19
11 10 5 1 6 11 1 7 1 7 7 1

Explicação:

Procure a posição da lista original na lista classificada e adicione uma.

1+(x@>x)?x: / the solution
         x: / save input as x
  (  >x)    / return indices of x sorted in descending order
   x@       / apply these indices to x (thus sort x)
        ?   / lookup right in left
1+          / add one
rua
fonte