¿Quién tiene más estrellas en The Nineteenth Byte?

16

Nota: este desafío implica descargar y seleccionar páginas web HTML. Si su idioma no puede manejar esto, es posible que no desee participar en este desafío.

Introducción

Siempre hay discusiones en The Nineteenth Byte Chat sobre quién lidera el estribor. Entonces, ayudemos a todos y cuentemos la cantidad total de estrellas por usuario en el chat.

Desafío

Dado un número entero positivo Nque es mayor que cero, calcule los líderes de estribor de los últimos Nmensajes destacados en el chat. Estos mensajes se pueden ver aquí . Sugerencia: cada página tiene 50 mensajes destacados. La salida será una lista de los 5 principales usuarios por cantidad de mensajes destacados . Se le otorgará un bono de -15% de descuento en su recuento de bytes si puede mostrar los nombres de usuario de esos usuarios, pero no se aplicará ninguna penalización si simplemente muestra los números de identificación de usuario. Tenga en cuenta que hay blasfemias en algunos de los mensajes destacados. Si es sensible a este tipo de lenguaje, vea la página con precaución.

Ejemplos (la imagen es de estribor actual al momento de escribir este desafío):

ingrese la descripción de la imagen aquí

  • (ROJO) Entrada: 5Salida (Con bonificación):[Geobits Sp3000 PhiNotPi Seadrus]
  • (AZUL) Entrada: 10Salida (Sin bonificación):[51024 17335 24697 116494 129255]
  • (VERDE) Entrada: 14Salida (Sin bonificación):[51024 116494 141697 17335 24697]

Cosas extra:

Los empates en los 5 primeros se ordenarán por el número de identificación de usuario más bajo a más alto . Si hay menos de cinco usuarios, simplemente muestre la tabla de clasificación con espacios vacíos al final. La entrada y la salida pueden estar en cualquier formato. La producción no necesita ser capitalizada. Si la entrada es mayor que 50, aún debe contar los mensajes en la página 2, página 3, etc. Puede suponer que la entrada siempre estará por debajo 2^31, y tampoco será tan grande que 1) sea mayor que la cantidad de mensajes destacados que existe y 2) no bloqueará el programa (haciendo matrices demasiado grandes, sin memoria, etc.).

Este es el , ¡el código más corto en bytes gana!


Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

## [><>](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
fuente
3
Gracias. He tenido curiosidad sobre esto por un tiempo y no quería molestarme en escribir algo para averiguarlo. Ahora otros lo harán por mí :)
Geobits
11
Antes de que alguien pregunte, el chat no tiene una API oficial.
Alex A.
¿La URL tiene que contar en el conteo de bytes? Acabo de notar que TeaScript / JavaScript tendrá problemas con el intercambio de recursos de origen
cruzado
1
@ Vɪʜᴀɴ Sería difícil juzgar qué caracteres eliminar que forman parte de la url, ¿cree que permitir que todos eliminen 70 caracteres (aproximadamente la longitud de la url) ayudaría a este problema?
GamrCorps
1
He sido inmortalizado en este pasado: D
Conor O'Brien

Respuestas:

11
  • Lamento mucho ser lento, pero leer mensajes destacados mientras la codificación era tan graciosa y dilatoria, esto podría haber mantenido mi estado de ánimo durante un mes.

  • Editar: Sí, lo encontré, los problemas de empate y de identificadores duplicados se solucionan armónicamente. El truco es que el código antiguo clasifica los identificadores de usuario descendiendo el número de estrellas, por lo que giré algunas líneas de mi programa de manera que clasifique a los usuarios de acuerdo con 99-n ° _stars; dado que 99 es mucho más grande que la tapa de estrella de mayor éxito (con suerte, supuse), ordenar el resultado al aumentar el número de estrellas mata a ambos pájaros de un tiro, estrellas descendentes con identificadores de usuario ascendentes.

BrownRecluse ,sin bonificación = 536 con bonificación = 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

Salida

mego rainbolt alex-a lembik v

Entrada

90

Salida

aditsu mego rainbolt alex-a lembik

Notas

  • Este programa (incluida la bonificación) no admite caracteres Unicode. Lo siento, Vɪʜᴀɴ.

  • Este programa funciona en función de la función estándar de que cada página contiene casi 50 mensajes destacados de forma predeterminada.

  • Observe claramente que los mensajes 60 y 90 están contenidos dentro de las dos primeras páginas, mientras que las salidas difieren.

  • Esta es la página de descarga de este lenguaje de programación en caso de que no esté en su poder.

  • En caso necesario, este es el programa de bonificación 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

Salida

169713    107051    141888     94625    116494

Entrada

90

Salida

50454    169713    107051    141888     94625

Si hubo una incoherencia entre los resultados, ¡mi código no tiene la culpa!

Abr001am
fuente
1
¿Por qué hay dos alex-as en la salida?
feersum el
@feersum arreglado.
Abr001am