Penguasa Golf

9

Intro

Dalam Lord of the Rings JRR Tolkien, frasa ini ada di sampul setiap buku.

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

Namun, ini tidak terlalu menarik. Itu hanya . Mari kita ubah ini menjadi .

Apa yang harus kamu lakukan

Gunakan Stack Exchange API (atau codegolf.stackexchange.com/users, atau Stack Exchange Data Explorer) dan temukan dua pengguna dengan skor tertinggi dalam , pengguna terbaru, dan pengguna reputasi tertinggi dengan hanya pos diberi skor negatif .

Kemudian, Anda harus memasukkan nama pengguna ini ke dalam teks berikut:

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

Anda harus memasukkan empat nama pengguna yang Anda temukan ke dalam teks dalam kurung sudut.

Peraturan Lainnya

  • Ini adalah sehingga kode terpendek menang.
  • Tidak ada Penyingkat URL (termasuk ppcg.(ga|lol))
Tidak Ada Di Sini
sumber
1
Apakah Anda ingin In the Land of Golfdor, where the Golfers liehasilnya dua kali seperti yang ada di buku?
Riley
Bisakah kita berasumsi bahwa akan ada setidaknya satu pengguna dengan hanya posting kode golf skor negatif?
Martin Ender
1
@Riley Oh, begitu. Editing.
NoOneIsHere
1
Mungkinkah penguasa gelap memiliki 0 poin dalam kode-golf, atau haruskah itu skor negatif?
MegaTom
1
@MegaTom Pasti negatif.
NoOneIsHere

Jawaban:

2

PHP, 577 byte

tidak diuji; Saat ini saya tidak memiliki sistem yang tersedia allow_url_fopen=On
dan saya tidak meluangkan waktu untuk menyalin & menempel sumber halaman.

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]));

kerusakan

// 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
));
Titus
sumber