Clasifica una lista de enteros

21

Se le da una lista no vacía de enteros positivos, por ejemplo

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

Debe clasificar estos números por su valor, pero como es habitual en las tablas de clasificación, si hay un empate, todos los números empatados obtienen el mismo rango, y se omite un número apropiado de rangos. Por lo tanto, el resultado esperado para la lista anterior sería

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

Por ejemplo, el valor más alto en la entrada fue 9, por lo que se convierte en un 1(primer rango). El tercer valor más alto es 6, por lo que ambos se 6convierten 3, y el rango 4se omite por completo.

Reglas

Puede usar cualquier formato de lista plana conveniente, inequívoco para entrada y salida. El primer / menor rango en la salida siempre debe ser 1 .

Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas.

Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.

Este es el , por lo que gana la respuesta válida más corta, medida en bytes .

Casos de prueba

[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
fuente
1
Estrechamente relacionada. La diferencia es que ese desafío garantiza que la entrada esté ordenada, lo que significa que la mayoría de las respuestas dependen de una forma de indexOffunción. Creo que para entradas no clasificadas hay alternativas más cortas en muchos idiomas.
Martin Ender
Lo siento, pero creo que esto está demasiado cerca del enlace de Lynn. Las diferencias son mínimas: los valores están truncados, no puede asumir una entrada ya ordenada y la mitad de la salida tiene su orden intercambiado. La respuesta aceptada en la pregunta vinculada casi funciona. Con un mínimo esfuerzo, alguien podría hacerlo funcionar. Como tal, creo que esto es un duplicado.
Ismael Miguel
No estoy de acuerdo, esto claramente no es un duplicado.
Timtech
Estoy de acuerdo con Timtech, este desafío es más simple, pero no es un duplicado.
tuskiomi

Respuestas:

13

Solución alternativa en Excel para reglas tontas con respecto a las entradas del mouse en Code Golf Stack Exchange: (WESRRMICGSE) 28 bytes

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

Ingrese la lista como csv ( 10,23,34,2,) en el compilador después de ingresar la fuente. sin comillas, sin corchetes, coma final.

WESRRMICGSE es exactamente como programar en Excel, excepto que puede omitir el signo inicial '=' para guardar un byte. La diferencia en la funcionalidad proviene del hecho de que WESRRMICGSE arrastrará la fórmula hacia abajo para copiar el código automáticamente y proporcionará diferentes salidas provistas con una sola entrada entera. proporcionó una lista como entrada, esa lista va a la columna B (columna de entrada), y la fórmula se desactiva automáticamente para que coincida con el número de entradas. (por ejemplo: la entrada 34, 21, 45 'arrastraría' la fórmula hacia abajo 2 celdas, para un total de 3 celdas con la fórmula).

Editar: nunca esperé que esta respuesta fuera popular. ¡Guauu!

tuskiomi
fuente
21
El nombre del idioma es un poco desagradable ...
Conor O'Brien
¿Qué reglas refieres y cómo son exactamente tontas?
Luis Mendo
3
@LuisMendo las reglas declaradas aquí: meta.codegolf.stackexchange.com/questions/10199/ ... Creo que la regla es tonta porque me tomé 5 minutos para escribir un 'intérprete' que evada exactamente de lo que están hablando. Cuanto más se pueda usar este lenguaje en los desafíos, más tonta se vuelve la regla. Me aseguraré de incluir esto en el enlace.
tuskiomi
9

Python 2, 41 bytes

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

Para cada valor, encuentre su índice en la lista ordenada por orden decreciente. Para hacer que el valor más grande dé 1 en lugar de 0, utilizamos un elemento "infinito" adicional de la lista en sí, ya que Python 2 trata las listas como más grandes que los números.

Una solución más directa es de 42 bytes y también funciona en Python 3.

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

Para cada elemento, cuenta el número de elementos más pequeños, agregando 1 para cambiar a 1 indexado.

xnor
fuente
8

Jalea , 5 bytes

ṢṚiЀ

Pruébalo en línea!

Cómo 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
fuente
7

R, 24 25 20 bytes

Utiliza la función de rango estándar con el método de vínculos "min" sobre el vector negado. catagregado a la salida a STDOUT. Salvé uno gracias a @Guiseppe

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

Ejemplo

> 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
fuente
Creo que necesitas envolverlo catpara que sea un programa completo.
Alex A.
@AlexA. Me preguntaba sobre eso. ¿Sería justo decir que esta es una función en sí misma y en ese caso estaría rank(-a,,'min')bien donde a es la entrada de la lista en forma de vector?
MickyT
En ese caso, lo consideraríamos un fragmento, ya que supone que ya existe una variable en el espacio de nombres. Para que sea una presentación de función adecuada que necesitarías function(a)rank(-a,,'min').
Alex A.
se puede acortar a solo en "mi"lugar de "min".
Giuseppe
@AlexA. ¿Por qué necesita ser envuelto encat ? Si la presentación hubiera sido function(a)rank(-a,,'mi')suficiente, se consideraría que el resultado del programa es idéntico arank(-scan(),,'mi')
Mark
4

PowerShell v2 +, 43 41 bytes

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

Desarrollado de forma independiente, pero veo que este es el mismo algoritmo que la solución Python de @ xnor , así que / encogimiento de hombros.

Toma datos como argumentos de línea de comandos individuales (es decir, una lista separada por espacios). La salida (formato predeterminado) es una nueva línea entre elementos.

Para cada elemento en la lista de entrada, sortes la lista de entrada en -dorden ascendente, toma el .indexOf()elemento actual y agrega 1. Tenga en cuenta el reparto explícito de la matriz @(...)para tener en cuenta una entrada de un solo dígito. Los números resultantes se dejan en la tubería y la salida es implícita.

¡Ahorró 2 bytes gracias a @Matt!

Ejemplo

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
fuente
¿Hay alguna razón sort -dque no funcionó para ti? Eso no es ambiguo para mí.
Matt
@Matt Odd. En mi Win8.1 ISE, dice eso -Descendingy -Debugson ambiguos. Pero en el shell directo en Win8.1 y el shell e ISE en Win10 funciona bien. Esta no sería la primera vez que mi instalación particular de Win8.1 es tonta ...: - / ¡Gracias por el golf!
AdmBorkBork
¿También esto no funcionó para todos los casos de prueba? $args|%{@($args|sort -d).indexof($_)+1}es más corto pero no he visto bien para saber si funciona
Matt
@Matt Eso no funciona porque el segundo $argsfunciona como entrada para el bloque de secuencia de comandos del bucle {...}, al igual que si estuviera usando un filtero function.
AdmBorkBork
3

Octava, 15 bytes

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

Puerto de mi respuesta MATL a Octave. También funciona en Matlab R2016b.

El código define una función anónima. Para llamarlo, asígnelo a una variable. Pruébalo en Ideone .

Luis Mendo
fuente
3

JavaScript (ES6), 38 36 bytes

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

Editar: Guardado 2 bytes gracias a @ETHproductions.

Neil
fuente
.mapFTW ;-)a=>a.map(e=>a.map(d=>r+=e<d,r=1)&&r)
ETHproductions
3
@ETHproductions ¿Por qué siempre tienes que estropear mi diversión?
Neil
2

Jalea , 5 bytes

<S‘ð€

TryItOnline!

¿Cómo?

<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
fuente
¿Qué tan similar es esto al código J que estaba a punto de enviar? 1+(+/@:<)"0 1~
Dane
Parece similar (¿usa una reducción a la suma?), ¡Pero eso no debería impedir que publique su código!
Jonathan Allan
Supongo que me preguntaba más qué hacen "separación de cadena diádica" y "para cada uno" en un lenguaje inspirado en J.
Dane
Ah, bueno, según su explicación, creo que su código es más >€µS‘o realmente similar <@€µS‘( @invierte los argumentos al <operador). La J ~está implícita en la cadena a la izquierda de la µ, que es una separación monádica (en lugar de diádica) y <vectoriza si el (los) argumento (s) es (son) lista (s).
Jonathan Allan
2

Perl 6 ,  42  26 bytes

Encuentra el primer índice :ken una [R,]lista ordenada inversa

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

Cuente los valores que son más grandes y agregue uno

{map {1+.grep(*>$^a)},@$_}
Brad Gilbert b2gills
fuente
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)

¡Gracias Conor O'Brien y ETHproductions!

Oliver
fuente
1
Puede usar una función anónima en el mapa, es decir v=>a.sort((a,b)=>b-a).indexOf(v)+1.
Conor O'Brien
No necesita .slice()nada, porque .mapopera en una copia de la matriz.
ETHproductions
Y nuestra política del sitio es que la función no necesita ser nombrada, por lo que también puede eliminar el inicio f=.
Conor O'Brien
@ETHproductions Si elimino el corte, pasando [18,13,18]devoluciones en [1,1,2]lugar de[1, 3, 1]
Oliver
Oh, eso es raro ... Supongo que es porque a.sort()almacena la matriz ordenada a. Pero puede cambiar a.slice()a [...a]para guardar algunos bytes.
ETHproductions
2

Mathematica, 44 bytes 42 bytes 40 bytes

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

es el carácter de uso privado de 3 bytes U+F4A1( página de documentos de Wolfram )

Editar: Gracias a JHM por el ahorro de bytes.

ngenisis
fuente
1
Falla por caso de prueba {10,2,5,4,15,5}(la salida debe ser {2,6,3,5,1,3}no {2,5,3,4,1,3}. Tenga en cuenta que 4tiene que ser omitidos porque hay dos 5s en la entrada).
JungHwan Min
Debidamente corregido.
ngenisis
1
-2 bytes cambiando xy #(obtener efectivamente deshacerse de los paréntesis): xPosition[SortBy[x,-#&],#][[1,1]]&/@x.
JungHwan Min
2

Pyke, 6 bytes

FQS_@h

Pruébalo aquí!

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

J , 14 8 bytes

1+1#.</~

¿Cómo?

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

Solución previa

1+(+/@:<)"0 1~
danés
fuente
Hola, he encontrado una versión más corta para 8 bytes 1+1#.</~. La suma por filas se realiza utilizando la conversión de base 1. Otra alternativa es 1+\:~i.]que también tiene 8 bytes.
millas
¡Agradable! ¿Quieres publicar tu propia respuesta? De lo contrario, incluiré la mejora de base uno.
Dane
2
No, estoy bien con solo sugerir ahorros en bytes. Siéntase libre de usarlos
millas del
1

Haskell, 28 bytes

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

Solo algunas comprensiones de listas.

xnor
fuente
20 segundos demasiado tarde. Estaba a punto de publicar la misma respuesta.
nimi
1

Maravilla , 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]

Asigne una matriz de entrada con una función que agrega 1 al primer índice del elemento en una versión ordenada descendente de la entrada.

Mama Fun Roll
fuente
1

Dyalog APL , 7 bytes

⊢⍳⍨⍒⊃¨⊂

argumentos

⍳⍨ índices en

los índices que ordenarían el argumento descendente

⊃¨ cada uno escogido de

todo el argumento

TryAPL en línea!

Adán
fuente
1

Mathematica, 37 bytes

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

Una función pura que clasificará su entrada, según las reglas del 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
fuente
1

Medusa , 15 bytes

p`&& ~i
  >/+`<

Pruébalo en línea!

Explicación

Todavía no parece haber una buena manera de encontrar el índice de un valor en una lista en Jellyfish, por lo que utiliza el enfoque de contar cuántos valores son mayores que el actual e incrementar el resultado. Esto se realiza principalmente mediante la construcción de una función unaria que calcula este valor para un elemento dado.

     `<

Esto crea una versión enhebrada del operador de comparación, por lo que si le da a este un número entero y una lista, devolverá una lista de resultados de comparación entre ese número entero y cada elemento de la lista.

     ~i
     `<

Esto cursa el argumento de la mano derecha de la función anterior con la lista de entrada. Por lo tanto, el resultado es una función unaria que toma un número entero y le brinda la lista de resultados de comparación con la entrada del programa.

   & ~i
   /+`<

Aquí, la /+reducción por adición, lo que significa que es simplemente una función de "suma esta lista". &compone esto en la función anterior, por lo que ahora tenemos una función unaria que cuenta cuántos valores en la entrada son más grandes que ese entero.

  && ~i
  >/+`<

También componemos la función de incremento sobre esto.

 `&& ~i
  >/+`<

Finalmente, también enhebramos esta función, para que se aplique automáticamente a cada entero de una lista que se le pase. Debido a la disposición del código, también ise toma como entrada de esta función, de modo que calcula la salida deseada.

p`&& ~i
  >/+`<

Finalmente, esto imprime el resultado.

Martin Ender
fuente
1

brainfuck, 124 bytes

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

Formateado:

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

Esto está diseñado para implementaciones de brainfuck de 8 bits. La entrada y la salida son a través de valores de bytes .

Pruébalo en línea.

Para cada elemento, esto cuenta el número de elementos mayor que él, luego imprime el resultado más uno. Esto se logra incrementando todos los elementos hasta que el elemento actual sea igual a cero, actualizando el resultado cada vez que otro elemento se convierta en cero antes del elemento actual.

La cinta se divide en nodos de 4 celdas,

b c 0 0

donde cestá el elemento y bes un indicador de navegación que es negativo para el elemento actual, de lo contrario, uno.

El resultado y una copia del elemento actual se mantienen a la izquierda de la matriz.

Mitch Schwartz
fuente
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]+",");}}

Explicación:

Muy autoexplicativo.

Básicamente, para cada número entero en la matriz, comprueba cuántos son más grandes que él, luego imprime la nueva matriz con las clasificaciones.

Lo siento, esto no es muy conciso, pero es mi primer intento en uno de estos y no vi una entrada para Java. Estoy seguro de que se puede jugar más golf.

Se puede ejecutar simplemente haciendo referencia al método estático y pasando una matriz. No pensé que fuera necesario escribir la función principal, pero si es así, lo haré en el futuro.

Enrique
fuente
¿Puedes eliminar algo de este espacio en blanco? Como es esto no se juega golf realmente en absoluto. (es decir, los espacios en r = new)
Rɪᴋᴇʀ
@EasterlyIrk Sí, lo siento, no estoy acostumbrado a hacer esto. Creo que me libré de todos los espacios en blanco innecesarios.
Henry
¿Puedes nombrar el "rankNumbersGolf" algo más corto como "G" o algo así?
Rɪᴋᴇʀ
@EasterlyIrk Sí, gracias.
Henry
No entiendo bien Java, pero ¿puedes eliminar algunos espacios en los tres for (?
Rɪᴋᴇʀ
0

PHP, 101 bytes

Debe haber algún camino más corto.

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

La función toma la entrada como una matriz de enteros, sobrescribe la variable de entrada con rangos como cadenas numéricas.

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

Tito
fuente
0

Ruby, 45 40 bytes

->a{a.map{|x|a.sort.reverse.index(x)+1}}
Lee W
fuente
¿Cómo se llama esto? No puedo hacer que coincida con los casos de prueba, parece que hay un error con rangos iguales. Por ejemplo, [10, 2, 5, 4, 15, 5]me da salida [2, 5, 3, 4, 1, 3]cuando debería ser [2, 6, 3, 5, 1, 3], creo que para solucionarlo, simplemente elimine el .uniq- ¡ahorrando 5 bytes!
Neil Slater
Parece que he leído mal la pregunta. ¡Gracias por ver eso!
Lee W
0

Clojure, 48 44 bytes

Actualización: usando for lugar demap

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

Simplemente filtra cada valor más pequeño que el actual, cuenta la longitud de la lista e incrementa en uno.

NikoNyrh
fuente
0

PHP, 84 bytes

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

Uso: Pase la función r su matriz de enteros y devolverá la matriz correspondiente de enteros clasificados.

Pasando las pruebas aquí.

Progrock
fuente
0

K (oK) , 11 bytes

Solución:

1+(x@>x)?x:

Pruébalo en línea!

Ejemplos:

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

Explicación:

Busque la posición de la lista original en la lista ordenada, luego agregue una.

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
callejero
fuente