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]

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!


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.


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.

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
> 

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

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 .


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.


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

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)},@$_}

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!


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.


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)

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~

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

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.


1

Dyalog APL , 7 bytes

⊢⍳⍨⍒⊃¨⊂

argumentos

⍳⍨ índices em

os índices que classificariam o argumento descendente

⊃¨ cada um escolhido

todo o argumento

TryAPL online!


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}*)

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.


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.


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.


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


0

Ruby, 45 40 bytes

->a{a.map{|x|a.sort.reverse.index(x)+1}}

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.



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.



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