Skrypt Stack Exchange określa, które pięć komentarzy na pytania lub odpowiedzi są początkowo widoczne na stronie głównej witryn poprzez liczbę pozytywnych opinii; wyświetlanych jest pięć komentarzy z największą liczbą głosów. Twoim zadaniem jest odtworzenie tego zachowania.
Napisz pełny program lub funkcję, przyjmując dane wejściowe przez STDIN, argumenty wiersza poleceń lub argumenty funkcji i wypisuje lub zwraca pięć pierwszych ocen komentarzy. Dane wejściowe to tablica liczb całkowitych reprezentujących liczbę głosów pozytywnych w komentarzach do niektórych postów. Na przykład wejście
0, 2, 5, 4, 0, 1, 0
oznacza, że pierwszy komentarz nie ma głosów, drugi ma dwa głosy, trzeci ma pięć, czwarty ma cztery itd. Kolejność wyników komentarzy powinna pozostać taka sama w wyniku.
Jeśli dane wejściowe zawierają pięć lub mniej ocen komentarzy, wynik nie powinien zawierać nic więcej niż podane. Jeśli dwie lub więcej ocen jest takich samych, powinny zostać wyświetlone pierwsze oceny. Możesz założyć, że tablica wejściowa będzie zawierać co najmniej jeden wynik komentarza.
Liczby na wyjściu powinny być łatwo rozróżnialne (więc 02541 dla przypadku 1 jest niepoprawne). W przeciwnym razie nie ma ograniczeń dotyczących formatu wyjściowego; liczby mogą być oddzielone spacją lub znakiem nowej linii lub mogą być w formacie listy itp.
Przypadki testowe:
[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]
Ostatni przykład wzięto z pytania dotyczącego przepełnienia stosu .
Jeśli to możliwe, podaj link w swoim poście, gdzie można przesłać zgłoszenie online.
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach. Powodzenia!
Odpowiedzi:
Galaretka , 6 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe jednocześnie .
Jak to działa
źródło
Python 2, 58 bajtów
Przetestuj na Ideone .
Jak to działa
list.remove
usuwa pierwsze wystąpienie, jeśli jego argument z określonej listy. Odwracając listę x , zasadniczo osiągamy to, że zamiast tego usuwa ona ostatnie wystąpienie.Wystarczy więc usuwać komentarz z minimalną liczbą głosów upvotes, dopóki nie zostanie osiągnięta lista nie więcej niż pięciu komentarzy. Następnie ponownie odwracamy listę, aby przywrócić pierwotną kolejność.
źródło
Pyth, 11 bajtów
Obliczamy przecięcie wielosetowe input (
Q
) z pięcioma największymi elementami wQ
(w kolejności, w jakiej się pojawiająQ
), a następnie przyjmujemy pierwsze pięć z nich.Wypróbuj tutaj .
źródło
<5SQ
jest równoważne z<SQ_5
, co oszczędza 1 bajt.b[:-a]
... Myślę, że w pewnym momencie mogło tak być.MATL , 16 bajtów
Używa bieżącej wersji (10.2.1) , która jest wcześniejsza niż to wyzwanie.
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript,
74 65 6261 bajtów3 bajty wyłączone dzięki @ user81655. 1 bajt off dzięki @apsillers.
Pokaż fragment kodu
źródło
Python 3, 76
Zaoszczędziłem 9 bajtów dzięki Kevinowi przypominającemu, że mogę nadużywać, jeśli stwierdzenia w liście komp.
Zaoszczędź 5 bajtów dzięki DSM.
W tej chwili dość proste rozwiązanie. Zdobądź 5 najlepszych wyników, a następnie przeanalizuj listę, dodając je do wyniku, gdy je znajdziemy.
Oto moje przypadki testowe, jeśli ktoś ich chce:
źródło
05AB1E ,
1211 bajtówKod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252.
źródło
CJam, 16 bajtów
Nienazwany blok (funkcja), który pobiera tablicę i zwraca tablicę.
Zestaw testowy.
Wyjaśnienie
źródło
Narzędzia Bash + GNU, 36
I / O sformatowane jako listy rozdzielone znakiem nowej linii przez STDIN / STDOUT.
Wypróbuj online.
źródło
Python, 68 bajtów
Przykładowy przebieg.
Bryła wbudowanych. Myślę, że najlepszym sposobem na wyjaśnienie jest przejrzenie przykładu.
enumerate
zamienia listę w pary indeks / wartość (technicznie rzecz biorącenumerate
obiekt).Pary są najpierw sortowane według największej wartości, zachowując bieżącą kolejność indeksu dla powiązań. To stawia na pierwszym planie najwyżej ocenione komentarze, zerwane wcześniejszym postem. Następnie branych jest pod uwagę 5 najlepszych takich komentarzy.
Umieść pięć pierwszych komentarzy z powrotem w kolejności publikowania, a następnie usuń indeksy, zachowując tylko wyniki.
źródło
PowerShell v4,
12097 bajtówEksperymentując, znalazłem alternatywne podejście, które oderwało kilka dodatkowych bajtów. Wydaje się jednak, że jest specyficzny dla PowerShell v4 i tego, jak ta wersja obsługuje sortowanie tablicy hashującej - domyślnie wydaje się, że w v4, jeśli wiele Wartości ma tę samą wartość, bierze tę z „niższym” kluczem, ale nie masz gwarancji, że w wersji 3 lub wcześniejszej, nawet jeśli używasz uporządkowanego słowa kluczowego w wersji 3. Nie w pełni sprawdziłem to w stosunku do programu PowerShell v5, aby stwierdzić, czy zachowanie będzie kontynuowane.
Ta wersja tylko dla v4 pobiera dane wejściowe jako
$a
, a następnie tworzy nową pustą tabelę mieszającą$b
. Przechodzimy przez wszystkie elementy wejścia$a|%{...}
i do każdej iteracji dodajemy parę klucz / wartość$b
(odbywa się to poprzez wstępną inkrementację zmiennej pomocniczej$d
jako klucza dla każdej iteracji). Następniesort
$b
na podstawieValue
, następnie ast , następnie przez (czyli klucz), i wreszcie wyjście tylkoselect
-l
5
sort
Name
.Value
na południe od otrzymanego hash.Jeśli wprowadzonych zostanie mniej niż 5 elementów, po prostu posortuje według wartości, wybierze ostatnie pięć (tj. Wszystkie), ponownie posortuje według klucza i wyprowadzi.
Starsze, 120 bajtów, działa we wcześniejszych wersjach
Sam algorytm jak Morgan Thrapp za odpowiedź , która jest podobno wskazanie, że wielkie umysły myślą podobnie. :)
Pobiera dane wejściowe, sprawdza, czy liczba elementów jest mniejsza niż lub równa 5, a jeśli tak, wysyła dane wejściowe i wychodzi. W przeciwnym razie tworzymy ArrayList
$b
(z nadmiernie długą[System.Collections.ArrayList]
obsadą) pięciu najlepszych elementów$a
. Następnie iterujemy ponad$a
i dla każdego elementu, jeśli jest w nim$b
, wypisujemy go, a następnie usuwamy z$b
środku, wypisujemy (i oto dlaczego musimy użyć ArrayList, ponieważ usuwanie elementów z tablicy nie jest obsługiwaną funkcją w PowerShell, ponieważ są one technicznie naprawione rozmiar).Wymaga v3 lub wyższej dla
-in
operatora. Na odpowiedź, która działa we wcześniejszych wersjach, swap$_-in$b
dla$b-contains$_
w sumie 126 bajtów .źródło
Haskell, 62 bajty
Przykład użycia:
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]
.Jak to działa: powiększ każdy element o jego indeks, posortuj malejąco, weź 5 pierwszych elementów, posortuj według indeksu i usuń indeks.
źródło
PHP 5,
107102Zaoszczędź 5 bajtów dzięki @WashingtonGuedes
Bez golfa
Spróbuj.
źródło
1 1 5 1 1 5
przesłanie powoduje wygenerowanie wyniku1 5 1 1 5
zamiast prawidłowego1 1 5 1 5
.Rubin, 82
8789bajtów$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)
zadzwonić:
ruby test.rb [1,2,2,3,4,5]
oryginalne przesłanie - 56 bajtów, ale w niektórych przypadkach testowych kończy się niepowodzeniem i nie obsługuje $ stdin i $ stdout
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
Wyjaśnienie
źródło
Java 7, 155 bajtów
Nieskluczony i kod testowy:
Wypróbuj tutaj.
Wydajność:
źródło
Julia, 48 bajtów
Wypróbuj online!
Jak to działa
Komentarz c 1 ma wyższy priorytet niż komentarz c 2, jeśli spełniony jest jeden z poniższych warunków:
Określa to całkowitą kolejność komentarzy, a zadaniem jest znalezienie pięciu komentarzy, które mają najwyższy priorytet.
Zamiast sortować komentarze według priorytetu (co zmieni ich kolejność, dla każdego komentarza c liczymy komentarze, które mają większy lub równy priorytet. Zachowujemy c wtedy i tylko wtedy, gdy ta liczba wynosi 5 lub mniej.
Aby częściowo posortować komentarze według liczby głosów pozytywnych, wykonujemy następujące czynności. Niech x będzie wektorem kolumny zawierającym liczbę głosów. Następnie
x'
transponuje x - tworząc wektor wiersza - ix.<x'
tworzy macierz boolowską, która porównuje każdy element x z każdym elementem x T .Dla x = [0, 2, 5, 4, 0, 1, 0] daje to
Sumując w wierszach (via
sum(...,2)
), liczymy liczbę komentarzy, które mają ściśle więcej głosów pozytywnych niż komentarze w tym indeksie.Dla przykładowego wektora daje to
Następnie policzymy liczbę komentarzy o równej liczbie pozytywnych opinii, które zostały opublikowane wcześniej niż ten komentarz. Osiągamy to w następujący sposób.
Najpierw musimy zbudować tabelę równi z
x.==x'
, co compraes elementy x, z elementami x T . Dla naszego przykładowego wektora daje to:Następnie wykorzystujemy
cumsum
do obliczenia skumulowanych sum każdej kolumny macierzy.diag
Diagon ( ) przechowuje liczbę komentarzy, które mają taką samą liczbę głosów upvotes i pojawiają się nie później niż odpowiadający im komentarz.Dodając dwa wytworzone przez nas wektory wierszowe, otrzymujemy priorytety ( 1 jest najwyższy) komentarzy.
Komentarze o priorytetach od 1 do 5 powinny być wyświetlane, więc określamy ich indeksy za pomocą
find(....<6)
i wyszukujemy odpowiednie komentarze za pomocąx[...]
.źródło
Python 3.5, 68 bajtów
Brak dopasowania dla mojej odpowiedzi w języku Python 2 , ale tylko trzy bajty dłuższe niż port do Pythona 3 i myślę, że jest wystarczająco inny, aby być interesującym.
I / O ma postać krotek. Przetestować go na repl.it .
źródło