Señor de los campos de golf

9

Introducción

En El señor de los anillos de JRR Tolkien, esta frase está en la portada de cada libro.

Three Rings for the Elven-kings under the sky,
Seven for the Dwarf-lords in their halls of stone, 
Nine for Mortal Men doomed to die,
One for the Dark Lord on his dark throne
In the Land of Mordor where the Shadows lie.
One Ring to rule them all, One Ring to find them,
One Ring to bring them all, and in the darkness bind them,
In the Land of Mordor where the Shadows lie

Sin embargo, esto no es tan interesante. Es solo . Cambiemos esto a .

Lo que tienes que hacer

Use la API de Stack Exchange (o codegolf.stackexchange.com/usersel Explorador de datos de Stack Exchange) y encuentre a los dos usuarios con las puntuaciones más altas en , el usuario más nuevo y el usuario de mayor reputación con solo una publicación de con puntuación negativa .

Luego, debe insertar estos nombres de usuario en el siguiente texto:

Three Golfs for the <highest-scored code-golf user>-king under the sky,
Seven for the <second-highest-scored code-golf user>-lord in their halls of stone,
Nine for the Mortal <newest user> doomed to die,
One for the Dark Lord <highest reuptation user with only negative scored code-golf posts>
In the land of Golfdor, where the Golfers lie
One Golf to rule them all, One Golf to find them,
One Golf to bring them all, and in the darkness bind them,
In the Land of Golfdor, where the Golfers lie

Debe insertar los cuatro nombres de usuario que encontró en el texto entre corchetes.

Otras reglas

  • Este es el por lo que gana el código más corto.
  • Sin acortadores de URL (incluidos ppcg.(ga|lol))
No hay nadie aquí
fuente
1
¿Quieres In the Land of Golfdor, where the Golfers lieen la salida dos veces como en los libros?
Riley
¿Podemos suponer que habrá al menos un usuario con solo publicaciones de golf de código con puntaje negativo?
Martin Ender
1
@ Riley Oh, ya veo. Edición.
NoOneIsHere
1
¿Podría el señor oscuro tener 0 puntos en el código de golf, o debe ser un puntaje negativo?
MegaTom
1
@MegaTom Debe ser negativo.
NoOneIsHere

Respuestas:

2

PHP, 577 bytes

no probado; Actualmente no tengo ningún sistema disponible allow_url_fopen=On
y no me tomé el tiempo para copiar y pegar las fuentes de la página.

function g($s){return join(file("http://codegolf.stackexchange.com/$s"));}$m=preg_match_all;$m("#r-de.+/(\d+)/.+>(.+)<#U",$a=g($u="$u&filter=all"),$b);$h=$b[2];$m("#>(.+)</a.+\s1 i#",g("users?tab=NewUsers&sort=creationdate"),$c);while($a){foreach($b[1]as$i=>$n)if($m("#st \"><strong>(-?)\d+#",$e=g("search?tab=votes&q=user:$n+[code-golf]"),$d)&&$d[1][0])break 2;if($a=strstr($a,"l=\"n"))$m("#r-de.+/(\d+)/.+>(.+)<#U",$a=g("$u&page=".$p+=!$p++),$b);}$m("#<code>(.+)</code>#U",g("q/93545"),$t);echo join([1=>$h[0],3=>$h[1],5=>$c[1][0],7=>$b[2][$i];]+split("#&[lg]t;#",$t[1][2]));

Descompostura

// function to get page content from ppcg
function g($s){return join(file("http://codegolf.stackexchange.com/$s"));}

$m=preg_match_all;

// A,B: highest scores: find user names
$m("#r-de.+/(\d+)/.+>(.+)<#U",$a=g($u="users?filter=all"),$b);
$h=$b[2];   // remember the names

// C: new users: find username after "1 in one day"
$m("#>(.+)</a.+\s1 i#",g("$u&tab=NewUsers&sort=creationdate"),$c);

// D: loop through users from first query
while($a)
{
    foreach($b[1]as$i=>$n)
        // find "vote-count-post" in code-golf votes for that user
        if($m("#st \"><strong>(-?)\d+#",$e=g("search?tab=votes&q=user:$n+[code-golf]"),$d)
        &&$d[1][0])             // test if highest vote is negative
            break 2;
    // none found yet?
    if($a=strstr($a,"l=\"n"))   // if there is a "next" link, get next page
        $m("#r-de.+/(\d+)/.+>(.+)<#U",$a=g("$u&page=".$p+=!$p++),$b);
}

$m("#<code>(.+)</code>#U",g("q/93545"),$t); // get code blocks from question page

echo join([         // 4. join and print
    1=>$h[0],           // first two results from first preg_match
    3=>$h[1],
    5=>$c[1][0],        // first result from second preg_match
    7=>$b[2][$i];       // $i-th username from (latest) reputation list
]+                  // 3. and replace indexes 1,3,5,7 with above array
split("#&[lg]t;#",  // 2. split by "<" and ">"
    $t[1][2]        // 1. output template is the 3rd code block
));
Tito
fuente