¿Como estas?

20

Martin ha creado un buen fragmento que se puede utilizar para realizar un seguimiento de la puntuación de las respuestas a los desafíos. Eso es genial y todo, pero ¿no sería mejor si pudieras seguirlo tú mismo?

Cree un programa que compare el recuento de bytes en sí mismo con el resto de las respuestas a esta pregunta y devuelva "Soy el número de respuesta n".

Reglas:

  • El recuento de bytes en su propia respuesta se puede codificar en el código

  • La función puede tomar la url como entrada, o puede estar codificada. Los caracteres para la url no contarán para el recuento de bytes, por lo que no es necesario usar un acortador de url.

  • las direcciones URL de las respuestas no pueden codificarse

  • El puntaje de las respuestas se puede encontrar en el encabezado (de la misma manera que lo hace el fragmento de Martin).

  • El encabezado de respuesta debe tener el formato correcto (descrito a continuación).

  • Si es posible ejecutar el programa en línea, comparta un enlace a un compilador en línea (o un fragmento de código que se pueda ejecutar desde la respuesta). Si no es posible, muestre cómo llamar a la función y muestre el resultado de su propio compilador (en el momento en que publicó la respuesta. No necesita actualizarla a menos que, por supuesto, lo desee).

  • En realidad, debe comparar la respuesta con las otras respuestas a esta pregunta. Simplemente escribir un guión I'm answer number 1.en algún idioma no es legal.

  • Si otras respuestas tienen el mismo número de bytes que las suyas, puede elegir si desea ser el mejor o el peor de ellos.

El encabezado debe estar formateado:

# Language Name, N bytes

No se puede usar tachado, etc., por lo que si se cambia el tamaño del código, muéstrelo en negrita debajo del encabezado o indíquelo de alguna otra manera.

La salida debe ser I'm answer number n., donde el número nes la posición (la línea / espacios finales están bien). Entonces, la respuesta más corta generará: "Soy la respuesta número 1.", la segunda será "Soy la respuesta número 2." etc.

Este es el código de golf, por lo que la respuesta más corta en bytes ganará.

Stewie Griffin
fuente
Si otras respuestas tienen el mismo número de bytes que las suyas, puede elegir si desea ser el mejor o el peor de ellos. Tal vez la fecha de publicación debería ser un factor decisivo, por lo que no tiene dos respuestas que afirman ser el mismo número. O bien, podría usar el estándar de que si están empatados, ambos están empatados en el puesto más alto.
mbomb007
2
No estoy seguro de que esto vaya a funcionar. La mayoría de los (buenos) intérpretes en línea no permiten curvar otras páginas web, pero en el desafío dice que el código debe ejecutarse en un intérprete en línea.
un espagueti
Hablemos de esto en el chat.
un espagueti
¿Es necesario contar las citas alrededor de la URL? Algunas respuestas actualmente los excluyen del recuento, otros los incluyen.
hvd

Respuestas:

2

Perl, 107 bytes

use LWP;print"I'm answer number ",1+grep($_<107,LWP::UserAgent->new->get('http://codegolf.stackexchange.com/q/60204')->content=~/<h1>.+, (\d+)/g),'.';

Ligeramente menos golfizado:

use LWP;
$agent = new LWP::UserAgent();
$response = $agent->get('http://codegolf.stackexchange.com/q/60204');
@answers = $response->content =~ m/<h1>.+, (\d+)/g;
print "I'm answer number ", 1+grep($_<107, @answers), '.';

Uso de muestra

$ perl my_rank.pl
I'm answer number 1.
primo
fuente
7

Python 2, 145 bytes

from requests import*
print"I'm answer number %s."%(sorted([int(a["body"].split(",")[1].split()[0])for a in get('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=activity&site=codegolf&filter=!SWJ_BpAceOT6L*G2Qa').json()["items"]]).index(145)+1)

Salida de 2015-10-10 17:30:00 UTC:

I'm answer number 1.

No conté ninguna de las URL para mi puntaje, si debo comentar cuánto debo agregarle. Tiene puntaje propio codificado en él, supone que ya está publicado. Se romperá si alguna vez se publican más de 99 respuestas.

Azul
fuente
6

AutoIt, 175 bytes

(202 bytes - 27 para la URL)

#include<String.au3>
$0=_StringBetween
$1=1
For $2 In $0(BinaryToString(InetRead("http://q.codegolf.xyz/60204")),'<h1>',' b')
$1+=$0($2,', ','')[0]<175?1:0
Next
ConsoleWrite("I'm answer number "&$1&".")

Salida de 2015-10-09 17:47:00 UTC:

I'm answer number 1.
mınxomaτ
fuente
Nunca he oído hablar de Autolt, pero ¿es correcto que esto no funcione si el nombre del idioma tiene una coma? (No sé si hay tales idiomas, así que no estoy seguro de si importa)
Stewie Griffin
@StewieGriffin Sí, pero tampoco recuerdo ningún idioma con una coma ;-). Si aparece uno, lo cambiaré.
mınxomaτ
@minxomat Parece que el nombre tiene un en llugar de un I, así que lo leí mal. La única razón por la que me di cuenta es al ver el artículo de Wikipedia , que tiene un serif.
mbomb007
Solo esperando que alguien invente un lenguaje con una coma para sabotear esta respuesta ...
Darrel Hoffman
@DarrelHoffman Bueno, tendría que tener una coma y un espacio consecutivo en su nombre ^^
mınxomaτ
4

JavaScript (ES7), 149 bytes

283 bytes - 134 para la URL. Nunca he usado solicitudes HTTP antes, pero aquí va ...

x=z=>alert(`I'm answer number ${[for(y of z.items)y.body.match(/, (\d+)/)[1]].sort().indexOf("149")+1}.`);document.write('<script src="//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T&callback=x">\x3C/script>')

Probado con éxito en Firefox 41.

Primero busca a través de los encabezados de todas las respuestas para encontrar sus conteos de bytes, luego encuentra la primera posición con el conteo de bytes 243 149. Actualmente está configurado para verificar solo las primeras 100 respuestas, y se romperá si alguien tiene menos de 100 bytes, pero funciona por ahora. ;)

Gracias a @GeorgeReith por la técnica mucho más corta. Versión antigua que usa AJAX (243 bytes):

x=new XMLHttpRequest,x.onreadystatechange=_=>{if(x.readyState==4&&x.status==200)alert(`I'm answer number ${[for(y of JSON.parse(x.responseText).items)y.body.match(/, (\d+)/)[1]].sort((a,b)=>a-b).indexOf("243")+1}.`)},x.open("GET","//api.stackexchange.com/2.2/questions/60204/answers?pagesize=100&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T",!0),x.send()
ETHproducciones
fuente
Se ve bien ... aunque posiblemente se romperá si alguien publica otra respuesta de 151 bytes
George Reith
@ GeorgeReith Nah, no debería. El OP dice que los lazos se pueden romper de cualquier manera, y esto solo se colocará por delante de la otra.
ETHproductions
Ah, él lo editó. Aún así, probablemente sea mejor ordenar por fecha de creación en lugar de hacerlo para que sea más probable que encuentre el tuyo en lugar de uno de los pocos que publicó antes y edite su respuesta.
George Reith
@GeorgeReith If other answers have the same number of bytes as your own, you can choose if you want to be best or worse of them.Eso todavía está en la publicación principal; ¿Estoy malinterpretando algo?
ETHproductions
Sin disculpas, estaba leyendo el historial de edición y me confundí.
George Reith
4

PHP, 158 159 164 bytes

I'm answer number <?for(;$h[]=json_decode(fread(gzopen('http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r),1e4),1)[items][+$i++][body];);echo array_sum(preg_filter(~„ÑÕß×£›ÔÖ߆‹šŒÃЗÎÑÕ‚Œš,~ÛÎÃÎÊÇ,$h)),~Ñ;

127 bytes desde 'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T'no contados

Versión formateada con cadenas sin golf:

<?
for(;
    $h[]=json_decode(
        fread(
            gzopen(
                'http://api.stackexchange.com/2.2/questions/60204/answers?pagesize=99&order=desc&sort=votes&site=codegolf&filter=!--pn9sqW9y0T',r
            ), 1e4
        ), 1
    )[items][+$i++][body];
);
echo"I'm answer number ",
    array_sum(
        preg_filter('{.* (\d+) bytes</h1.*}se','$1<159', $h)
    ),
    ".";
  • Carga la respuesta JSON (una vez por respuesta para ahorrar 5 bytes, gracias a @Blackhole)
  • Recoge cuerpos de respuesta en $h
  • reemplaza todo el texto con "1" (verdadero) si el recuento de bytes es <= 159, o "" (falso) de lo contrario
  • suma los resultados

Las secuencias de caracteres como ¶Ø’ßž‘Œˆšß‘Š’šßson nombres constantes válidos en PHP, pero debido a que las constantes no existen se tratan como cadenas literales. ~los invierte, este a "I'm answer number "(guardando un byte para una comilla cada uno)

Uso

php -derror_reporting=0 howareyou.php

Soy la respuesta número 1.

Fabian Schmengler
fuente
¿Es $arealmente necesaria la variable? ¿Por qué no lo haces simplemente $h[]=json_decode(…)[items][+$i++][body]? ¿Qué son estos personajes extraños, por cierto?
Blackhole
Buen punto. Esto hará una nueva solicitud para cada respuesta, pero a quién le importa :) Los caracteres extraños son cadenas invertidas en bits. Son nombres constantes válidos en PHP que se usan como literales de cadena si no existen, por lo que puedo guardar las comillas. Por ejemplo " "(3 bytes) se puede reducir a (2 bytes)
Fabian Schmengler
De hecho, he encontrado su explicación en esta respuesta . Dado que es un método inusual, creo que podría ser una buena idea explicarlo nuevamente aquí en tu publicación :).
Blackhole
Creo que se puede hacer mucho mejor si se salta el json_decodey justo spliten ':'o algo así, por ejemplo: codepad.org/7rZg06by
Primo
Buena idea, pero me temo que podría no ser confiable, ya que habrá muchos dos puntos en los códigos fuente. Poner "Soy número de respuesta" antes de que la etiqueta PHP de apertura guarde al menos dos bytes, ¡gracias por eso!
Fabian Schmengler
3

Javascript (ES6), 186 bytes

(335 - 149 bytes para la URL)

a=d=>alert(`I'm answer number ${d.items.map(q=>(y=[q.body.match(/, (\d+)/)[1],(x=q.owner.user_id==11182)])&&x?z=y:y).sort().indexOf(z)+1}.`)
document.write(`<script src="https://api.stackexchange.com/questions/60204/answers?pagesize=100&order=desc&sort=activity&site=codegolf&filter=!)Q2B_A19OPkd2j8JforD00f5&callback=a">\x3C/script>`)

George Reith
fuente
¡No tenía idea de que pudieras hacerlo de esa manera! ¿Puedo preguntar por qué lo usaste en \x3Clugar de <?
ETHproductions
@ETHproductions Debido a que el navegador busca la etiqueta de script de cierre de inmediato y de lo contrario no ejecutará el script, esto difiere el cierre de la etiqueta de script hasta la inserción posterior. Utiliza JSONP con una devolución de llamada y depende de la API si lo admite, pero afortunadamente stackexchange sí. Honestamente, no entiendo completamente el razonamiento, pero es un problema legítimo.
George Reith
1

Awk, 153 bytes

BEGIN{if(u){print"I\047m answer number "system("curl -s "u"|awk -f a")".";exit}FS="1>.*,|es<\/h"}NF==3{r+=($2+0)<153?1:0}END{exit(r<1?1:r)}

Esto debe guardarse en un archivo ay ejecutarse como:

awk -v u=http://codegolf.stackexchange.com/questions/60204/how-are-you-doing -f a

Estoy restando los 68 bytes http://codegolf.stackexchange.com/questions/60204/how-are-you-doingy agregando 13 al código para el arranque awk -v u=y -f a.

Menos golf, esto puede ser aún más corto:

curl -s http://codegolf.stackexchange.com/questions/60204/how-are-you-doing | awk -F"1>.*,|es<\/h" 'NF==3{r+=(0+$2)<103?1:0}END{print"I\047m answer number "(r<1?1:0)"."}'

Siempre se prefiere en lazos. El recuento de bytes está codificado en cada uno.

La versión más deportiva tiene el script que se llama a sí mismo y genera el valor de salida a través del sistema. En cada caso, solo cuenta más bajo que el incremento de valor codificado r, que luego debe ajustarse de nuevo a 1si es líder.

Esto no encontrar correctamente bytes si hay espacios en blanco entre bytesy </h1>y probablemente un número de otros casos que no han considerado.

A partir de Sun Oct 11 05:17:51 UTC 2015, esto da:

I'm answer number 3.
n0741337
fuente
Dado que esta es mi primera vez jugando al golf, avíseme si violé alguna regla, laguna, recuento, etc. o qué mejoras podría hacer.
n0741337
Creo que debe imprimir "Soy el número de respuesta" en lugar de "Soy el número".
lirtosiast
@ThomasKwa ¡Ja! Sabía que era demasiado bueno para ser verdad. Gracias y arreglado. ¿Agregar bytes de nuevo requiere un tachado?
n0741337
No necesita uno, al igual que no necesita un tachado cuando juega al golf en bytes.
lirtosiast
1

GNU Awk, 156 bytes

(Inspirado por la solución Awk de n0741337 ).

Éste lo hace todo por sí mismo, sin ejecutar un comando externo.

BEGIN{d="/inet/tcp/0/"h"/80"
print"GET "p" HTTP/1.1\nHost:"h"\n"|&d
while(d|&getline)n+=match($0,/1>.*, ([0-9]+)/,m)&&m[1]<156
print"I'm answer number",n+1}

Espera el nombre de host y la ruta como valores separados. Dado que están disponibles de forma gratuita, es de esperar que esto no rompa las reglas.

Ejecución de muestra:

bash-4.3$ awk -v h=codegolf.stackexchange.com -v p=/questions/60204/how-are-you-doing -f number.awk 
I'm answer number 4
hombre trabajando
fuente