Un script Stack Exchange détermine quels cinq commentaires sur les questions ou réponses sont initialement vus sur la page principale des sites à travers le nombre de votes positifs sur eux; les cinq commentaires avec le plus grand nombre de votes sont affichés. Votre tâche consiste à recréer ce comportement.
Écrivez un programme ou une fonction complet prenant des entrées via STDIN, des arguments de ligne de commande ou des arguments de fonction et imprime ou renvoie les cinq premiers scores de commentaire. L'entrée sera un tableau d'entiers représentant le nombre de votes positifs sur les commentaires de certains messages. Par exemple, une entrée de
0, 2, 5, 4, 0, 1, 0
signifie que le premier commentaire n'a pas de votes, le second a deux votes, le troisième a cinq, le quatrième en a quatre, etc. L'ordre des scores des commentaires doit rester le même dans la sortie.
Si l'entrée contient cinq scores de commentaire ou moins, la sortie ne doit contenir rien de plus que ceux donnés. Si deux ou plusieurs scores de commentaires sont identiques, le ou les premiers scores doivent être affichés. Vous pouvez supposer que le tableau d'entrée contiendra au moins un score de commentaire.
Les nombres dans la sortie doivent être facilement distingués (donc 02541 pour le cas 1 n'est pas valide). Sinon, il n'y a aucune restriction sur le format de sortie; les numéros peuvent être séparés par un espace ou une nouvelle ligne, ou ils peuvent être sous forme de liste, etc.
Cas de test:
[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]
Le dernier exemple a été tiré de cette question Stack Overflow .
Si possible, veuillez fournir un lien dans votre message où votre soumission peut être exécutée en ligne.
Il s'agit du code golf, donc le code le plus court en octets l'emporte. Bonne chance!
Réponses:
Gelée , 6 octets
Essayez-le en ligne! ou vérifiez tous les cas de test à la fois .
Comment ça marche
la source
Python 2, 58 octets
Testez-le sur Ideone .
Comment ça marche
list.remove
supprime la première occurrence si son argument de la liste spécifiée. En inversant la liste x , nous obtenons essentiellement qu'il supprime la dernière occurrence à la place.Ainsi, il suffit de continuer à supprimer le commentaire avec le minimum de votes positifs jusqu'à ce qu'une liste de cinq commentaires au maximum soit atteinte. Ensuite, nous inversons une fois de plus la liste pour rétablir l'ordre d'origine.
la source
Pyth, 11 octets
Nous calculons l'intersection multiset de l'entrée (
Q
) avec les cinq plus grands éléments dansQ
(dans l'ordre dans lequel ils apparaissentQ
), puis prenons les cinq premiers de ceux-ci.Essayez-le ici .
la source
<5SQ
est équivalent à<SQ_5
, ce qui économise 1 octet.b[:-a]
...MATL , 16 octets
Cela utilise la version actuelle (10.2.1) , qui est antérieure à ce défi.
Essayez-le en ligne!
Explication
la source
JavaScript,
74 65 6261 octets3 octets de réduction merci @ user81655. 1 octet de moins merci @apsillers.
Afficher l'extrait de code
la source
Python 3, 76
Enregistré 9 octets grâce à Kevin me rappelant que je peux abuser des instructions if dans une liste comp.
5 octets enregistrés grâce à DSM.
Solution assez simple en ce moment. Saisissez les 5 meilleurs scores, puis parcourez la liste en les ajoutant au résultat au fur et à mesure que nous les trouvons.
Voici mes cas de test si quelqu'un en veut:
la source
05AB1E ,
1211 octetsCode:
Explication:
Utilise l'encodage CP-1252.
la source
CJam, 16 octets
Un bloc sans nom (fonction) qui prend un tableau et renvoie un tableau.
Suite de tests.
Explication
la source
Utilitaires Bash + GNU, 36
E / S formatées sous forme de listes séparées par des sauts de ligne via STDIN / STDOUT.
Essayez-le en ligne.
la source
Python, 68 octets
Exemple d'exécution.
Un ensemble de modules intégrés. Je pense que la meilleure façon d'expliquer est de parcourir un exemple.
enumerate
transforme la liste en paires index / valeur (techniquement unenumerate
objet).Les paires sont d'abord triées selon leur valeur la plus élevée, en conservant l'ordre d'index actuel des liens. Cela place au premier plan les commentaires les mieux notés, rompus par un message précédent. Ensuite, les 5 meilleurs commentaires sont pris.
Remettez les cinq premiers commentaires dans l'ordre de publication, puis supprimez les indices, en ne conservant que les scores.
la source
PowerShell v4,
12097 octetsExpérimentant autour, j'ai trouvé une approche alternative qui a joué au golf quelques octets supplémentaires. Cependant, il semble être spécifique à PowerShell v4 et à la façon dont cette version gère le tri d'une table de hachage - il semble, par défaut, qu'en v4 si plusieurs valeurs ont la même valeur, il prend celle avec une clé "inférieure", mais vous n'êtes pas assuré que dans la version 3 ou antérieure, même lorsque vous utilisez le mot clé ordonné dans la version 3. Je n'ai pas entièrement vérifié cela contre PowerShell v5 pour dire si le comportement persiste.
Cette version v4 uniquement prend l'entrée en tant que
$a
, puis crée une nouvelle table de hachage vide$b
. Nous parcourons tous les éléments de l'entrée$a|%{...}
et chaque itération ajoute une paire clé / valeur à$b
(effectuée en pré-incrémentant une variable d'assistance$d
comme clé pour chaque itération). Ensuite , nous avonssort
$b
basé surValue
, puisselect
le-l
ast5
, puissort
parName
(c. -à- la clé), et enfin la sortie que les.Value
s du hachage résultant.Si moins de 5 éléments sont entrés, il suffit de trier sur la valeur, de sélectionner les cinq derniers (c'est-à-dire tous), de trier à nouveau sur la clé et de sortir.
Plus ancien, 120 octets, fonctionne dans les versions antérieures
Même algorithme que la réponse de Morgan Thrapp , ce qui est apparemment une indication que les grands esprits pensent de la même façon. :)
Prend l'entrée, vérifie si le nombre d'éléments est inférieur ou égal à 5, et si c'est le cas, génère l'entrée et quitte. Sinon, nous créons une ArrayList
$b
(avec la[System.Collections.ArrayList]
distribution exorbitante et longue ) des cinq premiers éléments de$a
. Nous répétons ensuite$a
et pour chaque élément s'il se trouve,$b
nous le sortons et le supprimons de$b
(et voici pourquoi nous devons utiliser ArrayList, car la suppression d'éléments d'un tableau n'est pas une fonctionnalité prise en charge dans PowerShell, car ils sont techniquement fixes Taille).Nécessite la version 3 ou supérieure pour l'
-in
opérateur. Pour une réponse qui fonctionne dans les versions antérieures, échange$_-in$b
pour$b-contains$_
un total de 126 octets .la source
Haskell, 62 octets
Exemple d'utilisation:
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]
.Comment ça marche: augmentez chaque élément avec son index, triez en ordre décroissant, prenez les 5 premiers éléments, triez par index et supprimez l'index.
la source
PHP 5,
1071025 octets enregistrés grâce à @WashingtonGuedes
Non golfé
Essayez-le.
la source
1 1 5 1 1 5
, votre soumission produit une sortie1 5 1 1 5
au lieu de la bonne1 1 5 1 5
.Rubis, 82
8789octets$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)
appeler:
ruby test.rb [1,2,2,3,4,5]
soumission d'origine - 56 octets mais échoue sur certains cas de test et n'a pas pris en charge $ stdin et $ stdout
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
Explication
la source
Java 7, 155 octets
Code non testé et de test:
Essayez-le ici.
Sortie:
la source
Julia, 48 octets
Essayez-le en ligne!
Comment ça marche
Le commentaire c 1 a une priorité plus élevée que le commentaire c 2 si l'une des conditions suivantes est vraie:
Cela définit un ordre total des commentaires, et la tâche à accomplir consiste à trouver les cinq commentaires qui ont les plus hautes priorités.
Au lieu de trier les commentaires par ordre de priorité (ce qui modifierait leur ordre, pour chaque commentaire c , nous comptons les commentaires qui ont une priorité supérieure ou égale. Nous gardons c si et seulement si ce nombre est 5 ou moins.
Pour trier partiellement les commentaires par nombre de votes positifs, nous procédons comme suit. Soit x le vecteur colonne contenant le nombre de votes.
x'
Transpose ensuite x - créant ainsi un vecteur ligne - etx.<x'
crée une matrice booléenne qui compare chaque élément de x à chaque élément de x T .Pour x = [0, 2, 5, 4, 0, 1, 0] , cela donne
En additionnant sur plusieurs lignes (via
sum(...,2)
), nous comptons le nombre de commentaires qui ont strictement plus votes positifs que le commentaire de cet index.Pour l'exemple de vecteur, cela donne
Ensuite, nous comptons le nombre de commentaires avec un nombre égal de votes positifs qui ont été publiés plus tôt que ce commentaire. Nous y parvenons comme suit.
D' abord , nous construisons une table d'égalité avec
x.==x'
qui compraes les éléments de x avec les éléments de x T . Pour notre vecteur d'exemple, cela donne:Ensuite, nous utilisons
cumsum
pour calculer les sommes cumulées de chaque colonne de la matrice.La diagonale (
diag
) contient le nombre de commentaires qui ont un nombre égal de votes positifs et se produisent au plus tard le commentaire correspondant.En ajoutant les deux vecteurs de lignes que nous avons produits, nous obtenons les priorités ( 1 est la plus élevée) des commentaires.
Les commentaires avec des priorités allant de 1 à 5 doivent être affichés, nous déterminons donc leurs indices avec
find(....<6)
et récupérons les commentaires correspondants avecx[...]
.la source
Python 3.5, 68 octets
Pas de correspondance pour ma réponse Python 2 , mais seulement trois octets de plus que son port vers Python 3, et je pense que c'est suffisamment différent pour être intéressant.
Les E / S sont sous forme de tuples. Testez - le sur repl.it .
la source