StackExchange Mustafa tidak tahan ditanya pertanyaan yang sama tiga kali

16

Austin: "Siapa yang mengirimmu?"

Mustafa: "Kamu harus membunuhku!"

Austin: "Siapa yang mengirimmu?"

Mustafa: "Cium pantatku, Powers!"

Austin: "Siapa yang mengirimmu?"

Mustafa: "Dr. Evil."

(...)

Mustafa: "Saya tidak tahan ditanya pertanyaan yang sama tiga kali. Itu hanya membuat saya jengkel."

Anda harus mensimulasikan dialog singkat dalam semangat Austin Powers dan Mustafa . Tetapi sumber data untuk seluruh percakapan akan menjadi pertanyaan StackOverflow (disediakan sebagai input dari URL).

Aturan

Nama pengguna penanya pertanyaan akan digunakan sebagai pengganti "Austin". Pertanyaan yang akan mereka tanyakan tiga kali berasal dari kalimat terakhir dalam judul pertanyaan, (yang terpaksa diakhiri dengan tanda tanya jika belum).

StackExchange akan memainkan bagian "Mustafa". Jawaban yang akhirnya diberikan berasal dari kalimat pertama dalam jawaban yang tidak berakhir pada tanda tanya, dan akan dikaitkan dengan nama pengguna yang menjawab.

Agar sebuah pertanyaan memenuhi syarat untuk permainan, ia harus (a) memiliki jawaban, dan (b) harus ada urutan komentar pada pertanyaan asli yang berbunyi:

  • komentar dari orang lain selain penanya
  • (sejumlah komentar yang dilewati)
  • komentar dari penanya
  • komentar dari orang lain selain penanya
  • (sejumlah komentar yang dapat diabaikan)
  • komentar dari penanya

Jika urutan ini tidak terpenuhi sebelum tanggal jawaban peringkat teratas , program seharusnya hanya mengeluarkan"Oh, behave!"

Retort StackExchange Mustafa yang marah berasal dari kalimat pertama dari komentar dari seseorang selain dari penanya yang tidak berakhir dengan tanda tanya - dan memastikan itu berakhir dengan tanda seru. Jika tidak ada kalimat dalam komentar yang tidak berakhir dengan tanda tanya, itu dilewati sebagai kandidat untuk jawaban. Retort komentar dikaitkan dengan nama pengguna penulis.

Klarifikasi

  • Keluarkan semua data respons "@XXX" terkemuka dari komentar.

  • Karena StackOverflow merangkum komentar jika ada banyak, Anda mungkin harus menggunakan permintaan kedua untuk mendapatkan daftar lengkap. Permintaan itu dalam bentuk /programming//posts/NNN/comments?_=MMMdengan ID pos di N dan ID pertanyaan di M. Lihat misalnya: /programming//posts/11227809/comments?_=211160

  • URL harus dilucuti ke jangkar teks saja.

  • Kami akan mendefinisikan "kalimat" sebagai sesuatu di luar blok kode yang berakhir pada titik, tanda tanya, atau tanda seru. Jika serangkaian teks tidak memiliki tanda baca akhir dari formulir ini, maka akhir teks adalah akhir kalimat; seolah-olah ditulis dengan tanda titik.

  • Jika Anda mencari kasus uji lucu yang kemungkinan memenuhi syarat, Anda dapat mencoba menggunakan StackExchange Data Explorer, seperti Posting dengan Komentar Terbanyak .

  • ... lebih banyak yang akan datang, aku akan bertaruh ...

Sampel

Satu sampel

Memasukkan:

/programming/2283937/how-should-i-ethically-approach-user-password-storage-for-later-plaintext-retrie/

Keluaran:

shanee: "Bagaimana saya harus secara etis mendekati penyimpanan kata sandi pengguna untuk pengambilan plaintext nanti?"

stefanw: "Saya pikir dia tahu itu tidak baik!"

shanee: "Bagaimana saya harus secara etis mendekati penyimpanan kata sandi pengguna untuk pengambilan plaintext nanti?"

Rook: "Mungkin Anda harus bertanya bagaimana Anda bisa menerapkan Kerentanan Kelebihan Buffer dengan cara yang Aman!"

shanee: "Bagaimana saya harus secara etis mendekati penyimpanan kata sandi pengguna untuk pengambilan plaintext nanti?"

Michael Burr: "Tanyakan mengapa kata sandi diperlukan dalam plaintext: jika itu agar pengguna dapat mengambil kata sandi, maka secara tegas Anda tidak benar-benar perlu mengambil kata sandi yang mereka atur (mereka tidak ingat apa itu Lagi pula), Anda harus dapat memberi mereka kata sandi yang dapat mereka gunakan. "

Contoh Dua

Memasukkan:

http://scifi.stackexchange.com/questions/2611/why-dont-muggle-born-wizards-use-muggle-technology-to-fight-death-eaters

Keluaran:

DVK: "Mengapa penyihir kelahiran muggle tidak menggunakan teknologi Muggle untuk melawan Pelahap Maut?"

DampeS8N: "Ini menari di tepi lagi!"

DVK: "Mengapa penyihir kelahiran muggle tidak menggunakan teknologi Muggle untuk melawan Pelahap Maut?"

DampeS8N: "Benar, tapi situs ini bukan tentang menunjukkan lubang plot!"

DVK: "Mengapa penyihir kelahiran muggle tidak menggunakan teknologi Muggle untuk melawan Pelahap Maut?"

Jeff: "Saya percaya, meskipun saya tidak dapat menemukan referensi, bahwa JK Rowling sebenarnya menyebutkan ini pada satu titik."

Contoh Tiga

Memasukkan:

/programming/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array

Keluaran:

"Oh, bersikaplah!"

(Waktu jawaban berperingkat teratas adalah Jun 27 '12 at 13:56, sedangkan komentar tindak lanjut kedua pada pertanyaan oleh si penanya ada pada waktunya Jun 27 '12 at 14:52. Oleh karena itu, tidak ada hubungan sebab akibat antara tindak lanjut kedua dan jawabannya. :-P)

Kriteria Menang

Golf Kode - kode menang tercepat.

HostileFork mengatakan jangan percaya pada SE
sumber
4
Hanya menghabiskan setengah jam terakhir membaca utas Harry Potter itu. +1 untuk itu!
BrunoJ
Tidak ada jawaban baru untuk pertanyaan ini dalam beberapa saat. Mungkin sudah waktunya untuk mengakhirinya sekarang, atau setidaknya menambahkan tenggat waktu?
Lars Ebert
@ LarsEbert Selesai ... (meskipun saya benar-benar akan mengambil celah di Rebmu, kemungkinan membuatnya sesuai jadwal saya adalah ATM tipis.)
HostileFork mengatakan jangan percaya SE
Anda masih dapat menambahkannya di masa mendatang. Saya akan senang melihat solusi alternatif (dan mungkin lebih pendek).
Lars Ebert

Jawaban:

3

PHP, 1282 karakter

Sementara 1282 cukup besar untuk tantangan kode golf, tantangannya cukup kompleks. (Dan saya tidak pandai golf.)

<?php function a($a,$b='q'){$a=strip_tags(htmlspecialchars_decode($a,ENT_QUOTES));$a=preg_replace('/^@[^ ]+\s+/','',$a);$a=mb_split('(?<=(?:\.|!|\?))\s+',$a);if($b=='q'){return preg_replace('/(?:\.|!|\?)$/','',$a[0]).'?';}else{foreach($a as$s){if(!preg_match('/\?$/',$s)){if($b=='c'){return preg_replace('/(?:\.|!)$/','',$s).'!';}else{return preg_replace('/(?<!(?:\.|!))$/','.',$s);}}}}return 0;}function b($a){return json_decode(gzdecode(file_get_contents('http://api.stackexchange.com/2.2/questions/'.$a)));}function c($a){return $a->owner->display_name;}$n="\n";$x="Oh, behave!\n";$r=parse_url($argv[1]);$b=explode('/',$r['path']);$b=$b[2];$u=b($b.'?site='.$r['host']);$u=$u->items[0];$c=b($b.'/comments?filter=withbody&order=asc&sort=creation&site='.$r['host']);$a=b($b.'/answers?filter=withbody&order=desc&sort=votes&site='.$r['host']);if(!count($a->items)||!count($c->items))die($x);$a=$a->items[0];$s=array();$d=1;foreach($c->items as$e){if($e->creation_date>$a->creation_date)break;if($e->owner->user_id==$u->owner->user_id){$d=1;}elseif($d){$e->body=a($e->body,'c');if($e->body){$s[]=$e;}$d=0;}}if(count($s)<2)die($x);$q=c($u).': "'.a($u->title,'q').'"'.$n;echo$q.c($s[0]).': "'.$s[0]->body.'"'.$n.$q.c($s[1]).': "'.$s[1]->body.'"'.$n.$q.c($a).': "'.a($a->body,'a').'"'.$n;

Versi tidak disatukan

<?php

    function firstSentence($string, $type = 'q') {
        $string = strip_tags(htmlspecialchars_decode($string, ENT_QUOTES));
        $string = preg_replace('/^@[^ ]+\s+/', '', $string);
        $string = mb_split('(?<=(?:\.|!|\?))\s+', $string);
        if($type === 'q') {
            return preg_replace('/(?:\.|!|\?)$/', '', $string[0]) . '?';
        } else {
            foreach($string as $s) {
                if(!preg_match('/\?$/', $s)) {
                    if($type === 'c') {
                        return preg_replace('/(?:\.|!)$/', '', $s) . '!';
                    } else {
                        return preg_replace('/(?<!(?:\.|!))$/', '.', $s);
                    }
                }
            }
        }
        return false;
    }

    $x = "Oh, behave!\n";

    $url = parse_url($argv[1]);
    $api = 'http://api.stackexchange.com/2.2/';

    $id = explode('/', $url['path']);
    $id = $id[2];

    $question = json_decode(gzdecode(file_get_contents($api . 'questions/' . $id . '?site=' . $url['host'])));
    $question = $question->items[0];
    $comments = json_decode(gzdecode(file_get_contents($api . 'questions/' . $id . '/comments?filter=withbody&order=asc&sort=creation&site=' . $url['host'])));
    $answer = json_decode(gzdecode(file_get_contents($api . 'questions/' . $id . '/answers?filter=withbody&order=desc&sort=votes&site=' . $url['host'])));
    if(!count($answer->items) || !count($comments->items))
        die($x);

    $answer = $answer->items[0];

    $selected = array();
    $usable = true;
    foreach($comments->items as $comment) {
        if($comment->creation_date > $answer->creation_date)
            break;
        if($comment->owner->user_id === $question->owner->user_id) {
            $usable = true;
        } elseif($usable) {
            $comment->body = firstSentence($comment->body, 'c');
            if($comment->body !== false) {
                $selected[] = $comment;
            }
            $usable = false;
        }
    }

    if(count($selected) < 2)
        die($x);

    $q = $question->owner->display_name . ': "' . firstSentence($question->title, 'q') . '"' . "\n";
    echo $q;
    echo $selected[0]->owner->display_name . ': "' . $selected[0]->body . '"' . "\n";
    echo $q;
    echo $selected[1]->owner->display_name . ': "' . $selected[1]->body . '"' . "\n";
    echo $q;
    echo $answer->owner->display_name . ': "' . firstSentence($answer->body, 'a') . '"' . "\n";

?>
Lars Ebert
sumber
Anda bisa merantai semua itu $a=function(1,2,$a) menyatukan hal itu bersama-sama.
wizzwizz4