Kto ma najwięcej gwiazd w Dziewiętnastym bajcie?

16

Uwaga: wyzwanie to polega na pobieraniu i przesiewaniu stron internetowych HTML. Jeśli twój język nie radzi sobie z tym, możesz nie chcieć brać udziału w tym wyzwaniu.

Wprowadzenie

W The Nineteenth Byte Chat zawsze dyskutuje się o tym, kto prowadzi prawą burtę. Pomóżmy więc wszystkim i policz całkowitą liczbę gwiazdek na użytkownika na czacie.

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą, Nktóra jest większa od zera, oblicz lider (-y) prawej burty ostatnich Nwiadomości oznaczonych gwiazdką na czacie. Te wiadomości można wyświetlić tutaj . Wskazówka: każda strona zawiera 50 wiadomości oznaczonych gwiazdką. Wyjściowa będzie lista 5 najlepszych użytkowników według liczby wiadomości oznaczonych gwiazdką . Bonus w wysokości -15% zniżki na liczbę bajtów zostanie przyznany, jeśli będziesz mógł wyświetlić nazwy tych użytkowników, ale nie zostaniesz ukarany, jeśli tylko wyświetlisz numery identyfikacyjne użytkownika. Pamiętaj, że niektóre wiadomości oznaczone gwiazdką zawierają wulgaryzmy. Jeśli jesteś wrażliwy na ten typ języka, wyświetl stronę z rozwagą.

Przykłady (Zdjęcie jest aktualną prawą burtą w chwili pisania tego wyzwania):

wprowadź opis zdjęcia tutaj

  • (RED) Wejście: 5Wyjście (z premią):[Geobits Sp3000 PhiNotPi Seadrus]
  • (NIEBIESKI) Wejście: 10Wyjście (Bez premii):[51024 17335 24697 116494 129255]
  • (ZIELONY) Wejście: 14Wyjście (bez premii):[51024 116494 141697 17335 24697]

Dodatkowe rzeczy:

Remisy w pierwszej piątce zostaną posortowane według numeru identyfikatora użytkownika od najniższego do najwyższego . Jeśli jest mniej niż pięciu użytkowników, po prostu wypisz tabelę wyników z pustymi miejscami na końcu. Dane wejściowe i wyjściowe mogą być w dowolnym formacie. Dane wyjściowe nie muszą być pisane dużymi literami. Jeśli dane wejściowe są większe niż 50, nadal musisz policzyć wiadomości na stronie 2, stronie 3 itp. Możesz założyć, że dane wejściowe zawsze będą niższe 2^31, a także nie będą tak duże, że 1) będą większe niż liczba wiadomości oznaczonych gwiazdką że istnieje i 2) nie spowoduje awarii programu (przez powiększenie tablic, brak pamięci itp.).

To jest , wygrywa najkrótszy kod w bajtach!


Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=62182,OVERRIDE_USER=36670;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>

GamrCorps
źródło
3
Dzięki. Już od dłuższego czasu jestem ciekawy tego i nie chciałem zawracać sobie głowy pisaniem czegoś, aby się dowiedzieć. Teraz inni zrobią to dla mnie :)
Geobits
11
Zanim ktokolwiek zapyta, czat nie ma oficjalnego interfejsu API.
Alex A.,
Czy adres URL musi się liczyć w liczbie bajtów? Właśnie zauważyłem, że TeaScript / JavaScript będzie miał problemy z udostępnianiem zasobów między źródłami
Downgoat
1
@ Vɪʜᴀɴ Trudno byłoby ocenić, które znaki do usunięcia są częścią adresu URL. Czy uważasz, że pozwolenie każdemu na usunięcie 70 znaków (mniej więcej długości adresu URL) pomogłoby w rozwiązaniu tego problemu?
GamrCorps
1
W przeszłości byłem uwieczniony: D
Conor O'Brien

Odpowiedzi:

11
  • Bardzo mi przykro z powodu powolności, ale czytanie wiadomości oznaczonych gwiazdką, podczas gdy kodowanie było tak przezabawne i rozwlekłe, że mogło utrzymać mój nastrój przez miesiąc.

  • Edycja: Tak, znalazłem, problemy z remisami i duplikatami są rozwiązywane harmonicznie. Sztuczka polega na tym, że stary kod sortuje identyfikatory użytkowników według malejącej liczby gwiazdek, więc przekręciłem niektóre linie mojego programu w taki sposób, że sortuje użytkowników według 99 gwiazdek; ponieważ 99 jest o wiele większy niż górny hit hitu (mam nadzieję - przypuszczałem), sortowanie wyniku według rosnącej liczby gwiazd zabija oba ptaki jednym kamieniem, a gwiazdy zstępujące z rosnącymi identyfikatorami użytkowników.

BrownRecluse ,bez premii = 536 z premią = 551–15% = 468 b

U=New(URL);P=New(Parser);L=New(Stack);t=New(Stack);v='http://chat.stackexchange.com/rooms/info/240/the-nineteenth-byte?tab=stars&page=';j=input();a=0;for i=1to j\50+1do begin U.Location=v+i;U.get;P.Parse(U.Data);x=New(RegEx);x.Data=U.Data;x.Mask='users/(\d*)/(\S*)".*?"times">(\d*?)<';while(x.Match)and(a<j)do begin L.Push(Format('%3d%9s%s',[99-x.Value[3],x.Value[1],x.Value[2]]));a=a+1;end;end;L.sort;i=0;for each L as y do if(not y.empty)and(not t.find(y.right(y.Length-12)))and(i<5)then begin y.delete(1,12);i=i+1;t.push(y);end;output(t.join(' '));

Wejście

60

Wynik

mego rainbolt alex-a lembik v

Wejście

90

Wynik

aditsu mego rainbolt alex-a lembik

UWAGI

  • Ten program (w tym bonus) nie obsługuje znaków Unicode - przepraszam Vɪʜᴀɴ!

  • Ten program działa w oparciu o standardową funkcję polegającą na tym, że każda strona domyślnie zawiera prawie 50 wiadomości oznaczonych gwiazdką.

  • Zobacz wyraźnie, że 60 i 90 komunikatów znajduje się na pierwszych dwóch stronach, a wyniki różnią się.

  • To jest strona pobierania tego języka programowania na wypadek, gdyby nie był on w twoim posiadaniu

  • W razie potrzeby jest to program bez premii 485 b

    U=New(URL);P=New(Parser);L=New(Stack);t=New(Stack);v='http://chat.stackexchange.com/rooms/info/240/the-nineteenth-byte?tab=stars&page=';j=input();a=0;for i=1to j\50+1do begin U.Location=v+i;U.get;P.Parse(U.Data);x=New(RegEx);x.Data=U.Data;x.Mask='users/(\d*)/(\S*)".*?"times">(\d*?)<';while(x.Match)and(a<j)do begin L.Push(Format('%3d%9s',[99-x.Value[3],x.Value[1]]));a=a+1;end;end;L.sort;i=0;for each L as y do if(not y.empty)and(not t.find(y.right(y.Length-3)))and(i<5)then begin y.delete(1,3);i=i+1;t.push(y);end;output(t.join(' '));
    

Wejście

60

Wynik

169713    107051    141888     94625    116494

Wejście

90

Wynik

50454    169713    107051    141888     94625

Jeśli między wynikami była niespójność, mój kod nie ponosi winy!

Abr001am
źródło
1
Dlaczego alex-ana wyjściu są dwa ?
feersum
@feersum naprawione.
Abr001am