Quem tem mais estrelas no décimo nono byte?

16

Nota: esse desafio envolve o download e a filtragem de páginas da Web em HTML. Se o seu idioma não conseguir lidar com isso, você pode não querer participar deste desafio.

Introdução

Sempre há discussões no The XIX XIX Byte Chat sobre quem lidera a estibordo. Então, vamos ajudar todos e contar a quantidade total de estrelas por usuário no chat.

Desafio

Dado um número inteiro positivo Nmaior que zero, calcule o (s) líder (es) do estibordo das últimas Nmensagens marcadas com estrela no chat. Essas mensagens podem ser visualizadas aqui . Dica: cada página possui 50 mensagens com estrela. A saída será uma lista dos 5 principais usuários por quantidade de mensagens com estrela . Um bônus de -15% em sua contagem de bytes será concedido se você puder exibir os nomes de usuário desses usuários, mas nenhuma penalidade será concedida se você simplesmente exibir os números de identificação do usuário. Observe que há palavrões em algumas das mensagens marcadas com uma estrela. Se você é sensível a esse tipo de idioma, visualize a página com cuidado.

Exemplos (a imagem é estibordo atual, ao escrever este desafio):

insira a descrição da imagem aqui

  • Entrada (RED): 5Saída (Com bônus):[Geobits Sp3000 PhiNotPi Seadrus]
  • (AZUL) Entrada: 10Saída (Sem bônus):[51024 17335 24697 116494 129255]
  • (VERDE) Entrada: 14Saída (Sem bônus):[51024 116494 141697 17335 24697]

Coisas extras:

Os laços no top 5 serão classificados pelo menor para o maior número de identificação do usuário . Se houver menos de cinco usuários, basta exibir a tabela de classificação com slots vazios no final. A entrada e a saída podem estar em qualquer formato. A saída não precisa ser capitalizada. Se a entrada é maior do que 50, você ainda deve contar as mensagens na página 2, página 3, etc. Você pode assumir que a entrada será sempre sob 2^31, e também não será tão grande que 1) é maior do que a quantidade de mensagens com estrela que existe e 2) não travará o programa (criando matrizes grandes, ficando sem memória etc.).

Este é o , o código mais curto em bytes vence!


Classificação

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:

## [><>](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
fonte
3
Obrigado. Eu estive ociosamente curioso sobre isso por um tempo agora e não queria me preocupar em escrever algo para descobrir. Agora os outros vão fazer isso por mim :)
Geobits
11
Antes que alguém pergunte, o bate-papo não possui uma API oficial.
Alex A.
O URL precisa contar na contagem de bytes? Só notei que TeaScript / JavaScript terá problemas com Cross-Origin Resource Sharing
Downgoat
11
@ Vɪʜᴀɴ Seria difícil julgar quais caracteres remover que fazem parte do URL, você acha que permitir que todos removam 70 caracteres (aproximadamente o comprimento do URL) ajudaria nesse problema?
GamrCorps
11
Fui imortalizado no passado: D
Conor O'Brien

Respostas:

11
  • Sinto muito por ser lento, mas a leitura de mensagens estreladas enquanto a codificação era tão hilária e dilatória que isso poderia ter mantido meu humor por um mês.

  • Edit: Sim, eu achei, os problemas de empate e duplicação de IDs são corrigidos harmonicamente. O truque é que o código antigo classifica os IDs de usuário por número decrescente de estrelas; portanto, distorci algumas linhas do meu programa de maneira a classificar os usuários de acordo com as 99-n ° _stars; já que 99 é muito maior que o limite máximo de estrelas (espero - eu assumi), classificar o resultado aumentando o número de estrelas mata os dois pássaros com uma pedra e as estrelas descendentes com IDs de usuário ascendentes.

BrownRecluse ,sem bônus = 536 com bônus = 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(' '));

Entrada

60

Resultado

mego rainbolt alex-a lembik v

Entrada

90

Resultado

aditsu mego rainbolt alex-a lembik

NOTAS

  • Este programa (incluindo bônus) não suporta caracteres unicode - desculpe Vɪʜᴀɴ!

  • Este programa funciona com base no recurso padrão de que cada página contém quase 50 mensagens com estrela por padrão.

  • Veja claramente que 60 e 90 mensagens estão contidas nas duas primeiras páginas, enquanto as saídas diferem.

  • Esta é a página de download desta linguagem de programação, caso ela não esteja em sua posse.

  • Caso necessário, este é o programa sem bônus de 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(' '));
    

Entrada

60

Resultado

169713    107051    141888     94625    116494

Entrada

90

Resultado

50454    169713    107051    141888     94625

Se houve incoerência entre os resultados, meu código não está assumindo a culpa!

Abr001am
fonte
11
Por que existem dois alex-as na saída?
precisa saber é
@feersum fixed.
Abr001am 03/11/2015