Un script de Stack Exchange determina qué cinco comentarios sobre preguntas o respuestas se ven inicialmente en la página principal de los sitios a través de la cantidad de votos positivos en ellos; Se muestran los cinco comentarios con el mayor número de votos. Su tarea es recrear este comportamiento.
Escriba un programa completo o una función tomando datos a través de STDIN, argumentos de línea de comandos o argumentos de funciones e imprime o devuelve los cinco puntajes de comentarios principales. La entrada será un conjunto de enteros que representa el número de votos a favor en los comentarios de alguna publicación. Por ejemplo, una entrada de
0, 2, 5, 4, 0, 1, 0
significa que el primer comentario no tiene votos, el segundo tiene dos votos, el tercero tiene cinco, el cuarto tiene cuatro, etc. El orden de las puntuaciones de los comentarios debe permanecer igual en la salida.
Si la entrada contiene cinco o menos puntajes de comentarios, entonces la salida no debe contener más que los dados. Si dos o más puntajes de comentarios son iguales, se deben mostrar los primeros puntajes. Puede suponer que la matriz de entrada contendrá al menos una puntuación de comentario.
Los números en la salida deben distinguirse fácilmente (por lo que 02541 para el caso 1 no es válido). De lo contrario, no hay restricciones en el formato de salida; los números pueden estar separados por un espacio o una nueva línea, o pueden estar en formato de lista, etc.
Casos de prueba:
[0, 2, 5, 4, 0, 1, 0] -> [0, 2, 5, 4, 1]
[2, 1, 1, 5, 3, 6] -> [2, 1, 5, 3, 6]
[0, 4, 5] -> [0, 4, 5]
[1, 1, 5, 1, 1, 5] -> [1, 1, 5, 1, 5]
[0, 2, 0, 0, 0, 0, 0, 0] -> [0, 2, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0] -> [0, 0, 0, 0, 1]
[5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7] -> [5, 8, 7, 6, 7]
[6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2] -> [6, 69, 22, 37, 5]
El último ejemplo fue tomado de esta pregunta de desbordamiento de pila .
Si es posible, proporcione un enlace en su publicación donde su envío se pueda ejecutar en línea.
Este es el código de golf, por lo que gana el código más corto en bytes. ¡Buena suerte!
Respuestas:
Jalea , 6 bytes
Pruébalo en línea! o verificar todos los casos de prueba a la vez .
Cómo funciona
fuente
Python 2, 58 bytes
Pruébalo en Ideone .
Cómo funciona
list.remove
elimina la primera aparición si su argumento de la lista especificada. Al invertir la lista x , esencialmente logramos que elimine la última ocurrencia en su lugar.Por lo tanto, es suficiente seguir eliminando el comentario con la mínima cantidad de votos positivos hasta que se llegue a una lista de no más de cinco comentarios. Luego, revertimos la lista una vez más para restaurar el orden original.
fuente
Pyth, 11 bytes
Calculamos la intersección de múltiples conjuntos de la entrada (
Q
) con los cinco elementos más grandes enQ
(en el orden en que aparecenQ
), luego tomamos los primeros cinco de esos.Probarlo aquí .
fuente
<5SQ
es equivalente a<SQ_5
, que ahorra 1 byte.b[:-a]
... Creo que incluso podría haber sido así en algún momento.MATL , 16 bytes
Utiliza la versión actual (10.2.1) , que es anterior a este desafío.
Pruébalo en línea!
Explicación
fuente
JavaScript,
74 65 6261 bytes3 bytes de descuento gracias @ user81655. 1 byte off gracias @apsillers.
Mostrar fragmento de código
fuente
Pitón 3, 76
Ahorré 9 bytes gracias a Kevin recordándome que puedo abusar si las declaraciones en una lista de comp.
Guardado 5 bytes gracias a DSM.
Solución bastante simple en este momento. Tome los 5 mejores puntajes y luego analice la lista agregándolos al resultado a medida que los encontremos.
Aquí están mis casos de prueba si alguien los quiere:
fuente
05AB1E ,
1211 bytesCódigo:
Explicación:
Utiliza la codificación CP-1252.
fuente
CJam, 16 bytes
Un bloque (función) sin nombre que toma una matriz y devuelve una matriz.
Banco de pruebas.
Explicación
fuente
Bash + utilidades GNU, 36
E / S formateadas como listas separadas por nueva línea a través de STDIN / STDOUT.
Pruébalo en línea.
fuente
Python, 68 bytes
Ejemplo de ejecución.
Un bulto de empotrados. Creo que la mejor manera de explicar es analizar un ejemplo.
enumerate
convierte la lista en pares índice / valor (técnicamente unenumerate
objeto).Los pares se ordenan primero por el mayor valor, manteniendo el orden actual del índice para los lazos. Esto pone al frente los comentarios mejor calificados, quebrados por una publicación anterior. Luego, se toman los 5 mejores comentarios.
Vuelva a colocar los cinco comentarios principales en orden de publicación y luego elimine los índices, manteniendo solo los puntajes.
fuente
PowerShell v4,
12097 bytesExperimentando, encontré un enfoque alternativo que arrojó algunos bytes adicionales. Sin embargo, parece ser específico para PowerShell v4 y cómo esa versión maneja la clasificación de una tabla hash: parece que, por defecto, en v4 si varios valores tienen el mismo valor, toma el que tiene una clave "inferior", pero no está garantizado eso en v3 o anterior, incluso cuando se usa la palabra clave ordenada en v3. No he investigado completamente esto contra PowerShell v5 para decir si el comportamiento continúa.
Esta versión solo para v4 toma la entrada como
$a
, luego crea una nueva tabla hash vacía$b
. Recorremos todos los elementos de la entrada$a|%{...}
y cada iteración agrega un par clave / valor a$b
(hecho mediante el incremento previo de una variable auxiliar$d
como la clave para cada iteración). Luego nossort
$b
basamos enValue
, luego enselect
el-l
ast5
, luegosort
enName
(es decir, la clave), y finalmente sacamos solo los.Value
s del hash resultante.Si se ingresan menos de 5 elementos, solo ordenará el valor, seleccionará los últimos cinco (es decir, todos), volverá a ordenar la clave y generará la salida.
Más viejo, 120 bytes, funciona en versiones anteriores
El mismo algoritmo que la respuesta de Morgan Thrapp , que aparentemente es una indicación de que las grandes mentes piensan igual. :)
Toma entrada, verifica si el número de elementos es menor o igual a 5, y si es así, genera la entrada y sale. De lo contrario, creamos una ArrayList
$b
(con el[System.Collections.ArrayList]
reparto exorbitantemente largo ) de los cinco elementos principales de$a
. Luego iteramos sobre$a
y para cada elemento si está dentro, lo$b
sacamos y luego$b
lo eliminamos (y esta es la razón por la que necesitamos usar ArrayList, ya que eliminar elementos de un Array no es una característica compatible en PowerShell, ya que son técnicamente fijos tamaño).Requiere v3 o superior para el
-in
operador. Para una respuesta que funciona en las versiones anteriores, de intercambio$_-in$b
para$b-contains$_
un total de 126 bytes .fuente
Haskell, 62 bytes
Ejemplo de uso:
map snd.sort.take 5.sortOn((0-).snd).zip[0..] $ [5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]
->[5,8,7,6,7]
.Cómo funciona: aumente cada elemento con su índice, ordene descendente, tome los primeros 5 elementos, ordene por índice y elimine el índice.
fuente
PHP 5,
107102Guardado 5 bytes gracias a @WashingtonGuedes
Sin golf
Intentalo.
fuente
1 1 5 1 1 5
, su presentación produce una salida de en1 5 1 1 5
lugar de la correcta1 1 5 1 5
.Ruby, 82
8789bytes$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)
llamar:
ruby test.rb [1,2,2,3,4,5]
envío original - 56 bytes pero falla en ciertos casos de prueba y no admite $ stdin y $ stdout
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
Explicación
fuente
Java 7, 155 bytes
Sin código y código de prueba:
Pruébalo aquí.
Salida:
fuente
Julia, 48 bytes
Pruébalo en línea!
Cómo funciona
El comentario c 1 tiene mayor prioridad que el comentario c 2 si uno de los siguientes es verdadero:
Esto define un orden total de los comentarios, y la tarea en cuestión es encontrar los cinco comentarios que tienen las mayores precedencia.
En lugar de ordenar los comentarios por precedencia (lo que alteraría su orden, para cada comentario c , contamos los comentarios que tienen una precedencia mayor o igual. Mantenemos c si y solo si este recuento es 5 o menos.
Para ordenar parcialmente los comentarios por número de votos a favor, hacemos lo siguiente. Sea x el vector de columna que contiene los recuentos de votos. Entonces
x'
transpuestas x - creando así un vector fila - yx.<x'
crea una matriz booleana que compara cada elemento de x con cada elemento de x T .Para x = [0, 2, 5, 4, 0, 1, 0] , esto da
Al sumar entre filas (vía
sum(...,2)
), contamos el número de comentarios que tienen estrictamente más votos positivos que el comentario en ese índice.Para el vector de ejemplo, esto da
A continuación, contamos el número de comentarios con una cantidad igual de votos positivos que se han publicado antes de ese comentario. Logramos esto de la siguiente manera.
En primer lugar construimos una tabla de igualdad con los
x.==x'
que compraes los elementos de x con los elementos de x T . Para nuestro vector de ejemplo, esto da:A continuación, usamos
cumsum
para calcular las sumas acumulativas de cada columna de la matriz.La diagonal (
diag
) contiene el recuento de comentarios que tienen la misma cantidad de votos a favor y ocurren a más tardar en el comentario correspondiente.Al agregar los dos vectores de fila que produjimos, obtenemos las prioridades ( 1 es la más alta) de los comentarios.
Deben mostrarse los comentarios con prioridades que van del 1 al 5 , por lo que determinamos sus índices con
find(....<6)
y recuperamos los comentarios correspondientes conx[...]
.fuente
Python 3.5, 68 bytes
No hay coincidencia para mi respuesta de Python 2 , pero solo tres bytes más largos que su puerto para Python 3, y creo que es lo suficientemente diferente como para ser interesante.
I / O está en forma de tuplas. Probarlo en repl.it .
fuente