Ein Stack Exchange-Skript bestimmt, welche fünf Kommentare zu Fragen oder Antworten anfangs auf der Hauptseite von Websites angezeigt werden, und zwar anhand der Anzahl der Upvotes. Die fünf Kommentare mit der höchsten Stimmenzahl werden angezeigt. Ihre Aufgabe ist es, dieses Verhalten wiederherzustellen.
Schreiben Sie ein vollständiges Programm oder eine Funktion, die Eingaben über STDIN, Befehlszeilenargumente oder Funktionsargumente vornimmt, und geben Sie die ersten fünf Kommentarpunkte aus oder geben Sie sie zurück. Die Eingabe besteht aus einer Reihe von Ganzzahlen, die die Anzahl der Aufwärtsbewertungen für die Kommentare einiger Posts darstellen. Zum Beispiel eine Eingabe von
0, 2, 5, 4, 0, 1, 0
bedeutet, dass der erste Kommentar keine Stimmen hat, der zweite zwei Stimmen hat, der dritte fünf, der vierte vier, usw. Die Reihenfolge der Kommentarbewertungen sollte in der Ausgabe gleich bleiben.
Wenn die Eingabe fünf oder weniger Kommentarbewertungen enthält, sollte die Ausgabe nur die angegebenen Werte enthalten. Wenn zwei oder mehr Kommentarbewertungen gleich sind, sollten die ersten Bewertungen angezeigt werden. Sie können davon ausgehen, dass das Eingabearray mindestens eine Kommentarpunktzahl enthält.
Die Zahlen in der Ausgabe sollten leicht zu unterscheiden sein (daher ist 02541 für Fall 1 ungültig). Ansonsten gibt es keine Einschränkungen für das Ausgabeformat. Die Nummern können durch ein Leerzeichen oder einen Zeilenumbruch getrennt sein, oder sie können im Listenformat usw. sein.
Testfälle:
[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]
Das letzte Beispiel stammt aus dieser Stapelüberlauf-Frage .
Wenn möglich, geben Sie in Ihrem Beitrag einen Link an, über den Ihre Einreichung online geschaltet werden kann.
Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes. Viel Glück!
Antworten:
Gelee , 6 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle auf einmal .
Wie es funktioniert
quelle
Python 2, 58 Bytes
Teste es auf Ideone .
Wie es funktioniert
list.remove
Entfernt das erste Vorkommen, wenn sein Argument aus der angegebenen Liste. Durch Umkehren der Liste x wird im Wesentlichen erreicht, dass stattdessen das letzte Vorkommen entfernt wird.Daher reicht es aus, den Kommentar mit der minimalen Anzahl von positiven Stimmen zu entfernen, bis eine Liste von nicht mehr als fünf Kommentaren erreicht ist. Danach kehren wir die Liste noch einmal um, um die ursprüngliche Reihenfolge wiederherzustellen.
quelle
Pyth, 11 Bytes
Wir berechnen den Multiset-Schnittpunkt der Eingabe (
Q
) mit den fünf größten Elementen inQ
(in der Reihenfolge, in der sie erscheinenQ
) und nehmen dann die ersten fünf davon.Probieren Sie es hier aus .
quelle
<5SQ
entspricht<SQ_5
, was 1 Byte spart.b[:-a]
... Ich denke, es könnte sogar irgendwann so gewesen sein.MATL , 16 Bytes
Hierbei wird die aktuelle Version (10.2.1) verwendet , die älter als diese Herausforderung ist.
Probieren Sie es online!
Erläuterung
quelle
JavaScript,
74 65 6261 Bytes3 Bytes weg danke @ user81655. 1 Byte weg danke @apsillers.
Code-Snippet anzeigen
quelle
Python 3, 76
9 Bytes gespart dank Kevin, der mich daran erinnert, dass ich missbrauchen kann, wenn Anweisungen in einer Liste comp.
5 Bytes gespart dank DSM.
Ziemlich einfache Lösung jetzt. Holen Sie sich die 5 besten Ergebnisse und analysieren Sie die Liste. Fügen Sie sie dem Ergebnis hinzu, sobald wir sie finden.
Hier sind meine Testfälle, wenn jemand sie haben möchte:
quelle
05AB1E ,
1211 BytesCode:
Erläuterung:
Verwendet CP-1252-Codierung.
quelle
CJam, 16 Bytes
Ein unbenannter Block (Funktion), der ein Array aufnimmt und ein Array zurückgibt.
Testsuite.
Erläuterung
quelle
Bash + GNU-Dienstprogramme, 36
E / A-Formatierung als durch Zeilenumbrüche getrennte Listen über STDIN / STDOUT.
Probieren Sie es online aus.
quelle
Python, 68 Bytes
Beispiellauf.
Ein Klumpen von Einbauten. Ich denke, der beste Weg, dies zu erklären, besteht darin, ein Beispiel durchzuarbeiten.
enumerate
verwandelt die Liste in Index / Wert-Paare (technisch gesehen einenumerate
Objekt).Die Paare werden zuerst nach dem größten Wert sortiert, wobei die aktuelle Indexreihenfolge für Verbindungen beibehalten wird. Dies bringt die am höchsten bewerteten Kommentare an die Spitze, die von früheren Beiträgen gebrochen wurden. Dann werden die 5 besten solcher Kommentare genommen.
Ordnen Sie die ersten fünf Kommentare wieder in der Reihenfolge der Veröffentlichung an, und entfernen Sie dann die Indizes, wobei nur die Ergebnisse beibehalten werden.
quelle
PowerShell v4,
120 -97 ByteBeim herumexperimentieren habe ich einen alternativen Ansatz gefunden, der einige zusätzliche Bytes abbaut. Es scheint jedoch spezifisch für PowerShell v4 zu sein und wie diese Version die Sortierung einer Hashtabelle handhabt. Wenn in v4 mehrere Werte denselben Wert haben, wird standardmäßig der mit einem "niedrigeren" Schlüssel verwendet, jedoch nicht Sie können nicht garantieren, dass dies in Version 3 oder früher der Fall ist, auch wenn Sie die bestellte Version verwenden Schlüsselwort in Version 3 verwendet wird. Ich habe dies nicht vollständig gegen PowerShell v5 überprüft, um zu sagen, ob das Verhalten weiterhin besteht.
Diese Nur-v4-Version nimmt Eingaben als an
$a
und erstellt dann eine neue leere Hashtabelle$b
. Wir durchlaufen alle Elemente der Eingabe$a|%{...}
und fügen jeder Iteration ein Schlüssel / Wert-Paar hinzu$b
(dies erfolgt durch Vorinkrementieren einer Hilfsvariablen$d
als Schlüssel für jede Iteration). Dann haben wirsort
$b
basierend aufValue
, dannselect
der-l
ast5
, dannsort
durchName
(dh die Schlüssel) und schließlich Ausgabe nur die.Value
s des resultierenden Hash.Wenn weniger als 5 Elemente eingegeben werden, wird nur nach Wert sortiert, die letzten fünf (dh alle) ausgewählt, nach Schlüssel neu sortiert und ausgegeben.
Ältere, 120 Byte, funktioniert in früheren Versionen
Gleicher Algorithmus wie die Antwort von Morgan Thrapp , was anscheinend ein Hinweis darauf ist, dass große Köpfe gleich denken. :)
Übernimmt die Eingabe, prüft, ob die Anzahl der Elemente kleiner oder gleich 5 ist, und gibt in diesem Fall die Ein- und Ausgänge aus. Andernfalls erstellen wir eine ArrayList
$b
(mit der übermäßig langen[System.Collections.ArrayList]
Besetzung) der fünf obersten Elemente von$a
. Wir durchlaufen dann$a
jedes Element und geben es für jedes Element aus, sofern es$b
darin enthalten ist, und entfernen es dann aus$b
in der PowerShell befindet, geben (und aus diesem Grund müssen wir ArrayList verwenden, da das Entfernen von Elementen aus einer Array-Struktur in PowerShell technisch nicht unterstützt wird Größe).Benötigt v3 oder höher für den
-in
Bediener. Wechseln Sie$_-in$b
für eine Antwort, die in früheren Versionen funktioniert,$b-contains$_
für insgesamt 126 Byte .quelle
Haskell, 62 Bytes
Anwendungsbeispiel:
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]
.So funktioniert es: Jedes Element mit seinem Index erweitern, absteigend sortieren, die ersten 5 Elemente nehmen, nach Index sortieren und den Index entfernen.
quelle
PHP 5,
1071025 Bytes gespart dank @WashingtonGuedes
Ungolfed
Versuch es.
quelle
1 1 5 1 1 5
Ihre Eingabe erzeugt eine Ausgabe von1 5 1 1 5
anstelle der richtigen1 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)
anrufen:
ruby test.rb [1,2,2,3,4,5]
ursprüngliche Einreichung - 56 Bytes, schlägt jedoch in bestimmten Testfällen fehl und unterstützte $ stdin und $ stdout nicht
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
Erläuterung
quelle
Java 7, 155 Bytes
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Julia, 48 Bytes
Probieren Sie es online!
Wie es funktioniert
Der Kommentar c 1 hat höhere Priorität als der Kommentar c 2, wenn eine der folgenden Aussagen zutrifft:
Dies definiert eine Gesamtreihenfolge der Kommentare, und die Aufgabe besteht darin, die fünf Kommentare mit den höchsten Prioritäten zu finden.
Anstatt die Kommentare nach Priorität zu sortieren (was ihre Reihenfolge ändern würde , zählen wir für jeden Kommentar c die Kommentare, die eine höhere oder gleiche Priorität haben. Wir behalten c genau dann bei, wenn diese Anzahl 5 oder weniger beträgt .
Um die Kommentare teilweise nach Anzahl der Upvotes zu sortieren, gehen wir wie folgt vor. Sei x der Spaltenvektor, der die Stimmenanzahl enthält. Dann
x'
transponiert x - wodurch ein Zeilenvektor erzeugt wird - undx.<x'
erzeugt eine Boolesche Matrix, die jedes Element von x mit jedem Element von x T vergleicht .Für x = [0, 2, 5, 4, 0, 1, 0] ergibt sich
Durch Summieren über Zeilen (Via
sum(...,2)
) wird die Anzahl der Kommentare gezählt, die strikt höher bewertet sind als der Kommentar an diesem Index.Für den Beispielvektor ergibt dies
Als nächstes zählen wir die Anzahl der Kommentare, bei denen die gleiche Anzahl von Upvotes früher als dieser Kommentar gepostet wurde. Dies erreichen wir wie folgt.
Zuerst erstellen wir eine Gleichheitstabelle mit
x.==x'
, die die Elemente von x mit den Elementen von x T zusammensetzt . Für unseren Beispielvektor ergibt dies:Als nächstes
cumsum
berechnen wir die kumulativen Summen der einzelnen Spalten der Matrix.Die Diagonale (
diag
) enthält die Anzahl der Kommentare, die die gleiche Anzahl von positiven Stimmen haben und nicht später als der entsprechende Kommentar erscheinen.Durch Addition der beiden erzeugten Zeilenvektoren erhalten wir die Prioritäten ( 1 ist die höchste) der Kommentare.
Kommentare mit Prioritäten von 1 bis 5 sollten angezeigt werden, daher ermitteln wir ihre Indizes mit
find(....<6)
und rufen die entsprechenden Kommentare mit abx[...]
.quelle
Python 3.5, 68 Bytes
Keine Übereinstimmung für meine Python 2-Antwort , aber nur drei Bytes länger als der Port zu Python 3, und ich denke, es ist anders genug, um interessant zu sein.
I / O ist in Form von Tupeln. Testen Sie es auf repl.it .
quelle