Zadanie:
Jesteś niesamowitym programistą i odpowiadającym na Stackoverflow i decydujesz się odpowiedzieć na każde pytanie nagrodą za Stackoverflow. Jesteś tak dobry, że udaje ci się zdobyć wszystkie nagrody we wszystkich pytaniach. Czekając na pojawienie się przedstawiciela, piszesz program, który idzie i sprawdza, jaka jest całkowita liczba przedstawicieli we wszystkich tych zleceniach.
Zasady:
- Po uruchomieniu
- Twój program będzie poruszał się po zakładce w Przepełnieniu stosu.
- Zeskrobuje wartość każdej nagrody,
- Następnie doda to i wyświetli sumę
- Musi pobierać dane z dowolnego miejsca na SO (i tylko SO), ale zaleciłbym użycie https://stackoverflow.com/questions?pagesize=50&sort=featured , ponieważ jest to tylko około 10 stron
- To jest golf golfowy , więc wygrywa najkrótszy kod
Odpowiedzi:
JavaScript -
176133130108106Edycja 1: zmniejszyłem niektóre selektory i wykorzystałem
?:
sugestię z kompilatora zamknięcia Google (przez @ Sirko - dzięki)Edycja 2: inicjuj
s
wewnątrzd
i inicjujt
jak0
zamiast""
Edycja 3: zdałem sobie sprawę, że tak naprawdę nie muszę celować w konkretny kontener i mogę zamiatać cały dokument, który pozbywa się wielu
.find
wywołań i niepotrzebnego selektora (oraz zmiennej przechowującej go)Edycja 4: wepchnij
t
inicjator w wywołanie funkcji, aby uniknąć;
(i tak zostanie on podniesiony na górę) i zmiażdż funkcję do jednej instrukcji (połącz dwie instrukcje w jedną w warunku instrukcji trójkowej), aby upuścić{}
Uwaga : nie jestem pewien, czy to oszustwo, ale należy to uruchomić z poziomu okna konsoli przeglądarki, która już wskazuje
http://stackoverflow.com/questions?page=1&sort=featured
. Opiera się na fakcie, że jQuery i odpowiednie linki stronicowania są dostępne na samej stronie. Wygląda na to, że działa tylko w przeglądarce Firefox, a nie w IE ani Chrome.Dane wyjściowe (w momencie wysłania):
Wybuchł / skomentował :
źródło
s=" #mainbar";d=$(s);t="";function a(){d.find(".bounty-indicator").each(function(){t+=this.innerHTML});(u=d.find("[rel=next]")[0])?d.load(u.href+s,a):alert(eval(t))}a();
169 - używany kompilator Google Closure.(
parena, czy to naprawdę działa?Python -
232,231,195,183,176, 174Analizuje HTML z https://stackoverflow.com/questions?sort=featured przy użyciu wyrażeń regularnych.
Górna granica
range
wfor
pętli musi byćnumber of pages + 1
lub kod zostanie podniesiony zHTTPError
powodu 404s. Domyślna liczba wyników na stronę wynosi 15, co wykorzystuje kod (pominięcie?pagesize=50
zapisywania znaków i jest równie skuteczne).Dzięki @Gabe za wskazówkę dotyczącą dalszego zmniejszenia liczby znaków .
Gra w golfa :
Dane wyjściowe (w momencie wysłania):
Bez golfa :
Oto nieco nie golfowa wersja, która powinna być nieco łatwiejsza do odczytania i zrozumienia.
źródło
for
pętli i sprowadzić ją do 176:import urllib,re;print sum(sum(map(int,re.findall(r"<.*>\+(\d+)<.*>",urllib.urlopen("http://stackoverflow.com/questions?sort=featured&page=%u"%i).read())))for i in range(1,33))
+
po nim cyfrę. Na przykład tytuł pytania może pasować do tego formatu.REBOL -
164133130 (139 do 404 sprawdzić)Analizuje html przy użyciu
parse
podjęzyka Rebol. Sprawdza pierwsze 98 stron. Uświadomiłem sobie, że mam takie samo ograniczenie jak rozwiązanie python - zbyt wiele powtórzeń trafiło w błędy 404 i zatrzymało wykonanie. Dzięki @rgchris za wiele ulepszeń! Zaktualizowano, aby sprawdzić do 98 stron.s: 0 repeat n 99[parse read join http://stackoverflow.com/questions?sort=featured&page= n[15[thru{>+}copy x to{<}(s: s + do x)]]]s
Z kontrolą błędów dla 404s (139):
s: 0 repeat n 99[attempt[parse read join http://stackoverflow.com/questions?sort=featured&page= n[15[thru{>+}copy x to{<}(s: s + do x)]]]]s
Test
Wyjaśnienie
Rebol ignoruje białe znaki, dlatego możesz umieścić to wszystko w jednym wierszu, jeśli chcesz. PARSE przyjmuje dwa dane wejściowe, a pierwszy argument (
read join ...
) jest dość oczywisty. Ale oto kilka komentarzy do instrukcji parsowania dialektu, w bardziej tradycyjnym wcięciu:źródło
n
wartości ... obecnie jest 28 stron nagród (dla rozmiaru strony 15). Nie wpłynie to jednak na liczbę znaków.Ruby, 260
Korzysta z interfejsu API wymiany stosu.
Dane wyjściowe (w momencie publikacji oryginalnego postu):
Nie liczę
&pagesize=100
liczby znaków, ponieważ działa bez niej, ale właśnie dodałem to dla wygody podczas testowania. Jeśli to usuniesz, robi to samo (z wyjątkiem tego, że zjada więcej przydziału i zajmuje nieco więcej czasu).źródło
require
s można zastąpić-r
flagą wiersza poleceń.Rebmu -
108107Test (o 19:05 AEST)
Rebmu wygląda raczej tajemniczo, ale jest całkiem czytelny, gdy się go zrozumie. Zacznijmy od usunięcia go i prawidłowego ułożenia.
Rebmu jest dialektem Rebola, dzięki czemu można zobaczyć podobieństwa w rozwiązaniu. Rebmu nie może jeszcze zmniejszyć rozmiaru każdej instrukcji, ale jest to język ewoluujący. Jeszcze raz dziękuję @rgchris za ulepszenia mojej pierwszej próby.
źródło
ti
(do liczby całkowitej!) byłoby bezpieczniejsze niżdo
w Rebmu bez zmiany długości kodu.Rubin - 197
Krótka wersja:
Wersja przyjazna dla człowieka:
I odpowiedź -
39700
Ruby z parametrami skryptu - 139
Aby uruchomić to z bash, po prostu wpisz
źródło
require
s można zastąpić-r
flagą wiersza poleceń.PHP - 121 bajtów
Użycie modyfikatora wyrażenia regularnego „eval”, aby uniknąć użycia
array_sum
lub podobnego. Wydaje się, że jest to najkrótsze rozwiązanie spośród ważnych wpisów.źródło
e
modyfikator jest przestarzała od PHP 5.5, ale wciąż jest przydatna do golfa jednak.PHP,
134,131, 127while($q=array_sum(preg_filter('#.*>\+#',0,file("http://stackoverflow.com/questions?sort=featured&page=".++$n))))$s+=$q;echo$s;
Przechodzi przez wszystkie strony,
pagesize
nie ustawiono zapisywania bajtów, więc więcejGET
s.Bardzo, bardzo brudny, ale ... korzystając z
PHP
„wad”!echo
while
zatrzymuje się przy przydzialeRegEx
zamianie jest ciągiem rozpoczynającym się od kwoty nagrodyarray_sum()
dodaje ciągi$n
i$s
są inicjowane, ale rozpoczynanie od zera jest równoważne. zaczynając od zeraźródło
Bash 206
możliwe optymalizacje, zbyt leniwe
wynik:
źródło
seq 1 11
można zredukować doseq 11
.JavaScript -
129119110107 znakówEDYCJA: NIEPRAWIDŁOWA ODPOWIEDŹ! To obsługuje tylko „Najczęściej polecane pytania”, które zawierają tylko ułamek z nich. Odpowiedź Alconji jest bardziej aktualna.
Wykonaj na https://stackoverflow.com/?tab=featured w oknie konsoli. Na podstawie rozwiązania Alconja.
Grał w golfa trochę więcej, usuwając niepotrzebne białe spacje.
Wykorzystano eval do usunięcia wywołania funkcji, usuwając kolejne 9 znaków.
usunęliśmy trochę niepotrzebnych białych znaków.
źródło
Java, 540 znaków
Ostrzeżenie: liczba aktywnych nagród wynosi ~ 470. Ten kod będzie wielokrotnie uzyskiwał dostęp do strony w przepełnieniu stosu. Może to sprawić kłopot z nimi za przesyłanie tak wielu żądań danych.
Mój wynik był
23400
, ale kiedy uruchomiłem kod @ TonyH, dostałem37550
. Złe wieści.Ładny kod:
Sposób, w jaki to działa, jest prosty. Czyta z adresu URL,
http://stackoverflow.com/questions"
aby określić liczbę pytań z nagrodami (uwaga: jeśli liczba wzrośnie, program się nie powiedzie, ale jeśli spadnie, działa dobrze). Wyszukuje dla tego numeru przy użyciu wyrażenia regularnego:b.>(\\d+)
. Działa to we wszystkich testach do tej pory, ale jeśli ktoś zadaje pytanie pasujące do wyrażenia regularnego, może to nie działać.Następnie otwieramy adres URL
http://stackoverflow.com/questions?pagesize=1&sort=featured&page=
+current question #
. Innymi słowy, otwieramy nową stronę dla każdego polecanego pytania i wymuszamy, aby liczba pytań była tylko1
, więc otrzymamy je wszystkie. Część dotycząca reputacji zawsze będzie pasowaćion.>.(\\d+)
, więc używam jej do znalezienia. Podzieliłem operację na dwie części, aby móc tanio sprawdzić, czy liczba pytań została zmniejszona (tzn. Zwracany ciąg nie jest liczbą całkowitą).Następnie podsumowujemy całą reputację i drukujemy ją.
Uruchomienie na moim komputerze zajęło około 3 minut i 20 sekund.
Czy ktoś wie, dlaczego nie drukuje właściwej liczby?
źródło
C # - 407
Korzystanie z Stackoverflow.com. To samo co poniżej, z wyjątkiem braku dekompresji Gzip i innych wyrażeń regularnych.
Test
Dziwnie, uzyskanie innej wartości niż poniżej.
C # - 496
Używa api.stackexchange, który jest gzipped i json.
Unminified:
Test
Domyślny rozmiar strony:
Rozmiar strony = 100:
źródło
jQuery 191
Działa z dowolnego miejsca na stosie wymiany (i wielu innych stronach), nie trzeba być na określonej stronie, jak w odpowiedziach @ Alconja / @ NateKerkhofs
źródło
$
PHP - 139
Gra w golfa:
Niegolfowany - 147
Prosty
file_get_contents
/preg_match
/array_sum
Test:
źródło
Bash 174
Na podstawie https://codegolf.stackexchange.com/a/25180/7664 :
źródło
pagesize=50&
i po prostu zapętlić więcej (myślę, że domyślny rozmiar strony to 15).Python (174 znaków):
Rozwijając powyższą odpowiedź na python (nie mam wystarczająco dużo karmy, aby komentować):
Prośby zamiast urllib zmniejszają 2 znaki.
źródło
Ruby (176 znaków):
Idąc za przykładem Tony'ego H. używania zakodowanych numerów stron, oto co otrzymałem:
dał mi 35300 w momencie pisania.
źródło