O StackExchange Mustafa não suporta a mesma pergunta três vezes

16

Austin: "Quem te enviou?"

Mustafa: "Você tem que me matar!"

Austin: "Quem te enviou?"

Mustafa: "Beije minha bunda, poderes!"

Austin: "Quem te enviou?"

Mustafa: "Dr. Mal".

(...)

Mustafa: "Não suporto receber a mesma pergunta três vezes. Isso apenas me irrita".

Você deve simular um breve diálogo no espírito de Austin Powers e Mustafa . Mas a fonte de dados para toda a conversa será uma pergunta StackOverflow (fornecida como entrada de uma URL).

Regras

O nome de usuário do solicitante da pergunta será usado no lugar de "Austin". A pergunta que eles farão três vezes vem da última frase no título da pergunta (que foi forçada a terminar em um ponto de interrogação, se ainda não o fez).

O StackExchange fará o papel de "Mustafa". A resposta dada em última instância vem da primeira frase da resposta que não termina em um ponto de interrogação e será atribuída ao nome do usuário que respondeu.

Para uma pergunta se qualificar para o jogo, ela deve (a) ter uma resposta e (b) deve haver uma sequência de comentários sobre a pergunta original:

  • comentar de alguém que não seja o questionador
  • (qualquer número de comentários ignorados)
  • comentário do questionador
  • comentar de alguém que não seja o questionador
  • (qualquer número de comentários ignoráveis)
  • comentário do questionador

Se essa sequência não for satisfeita antes da data da resposta mais classificada , o programa deve simplesmente gerar"Oh, behave!"

As réplicas furiosas de StackExchange Mustafa vêm da primeira frase dos comentários de alguém que não seja o interlocutor que não termina com um ponto de interrogação - e garante que ele termine com um ponto de exclamação. Se não existir uma frase no comentário que não termine em um ponto de interrogação, ela será ignorada como candidata à réplica. As réplicas de comentários são atribuídas ao nome de usuário do autor.

Esclarecimentos

  • Retire todos os dados de resposta "@XXX" principais de um comentário.

  • Como o StackOverflow resume os comentários, se houver muitos deles, você provavelmente precisará usar uma segunda solicitação para obter a lista completa. Essa solicitação é do formulário /programming//posts/NNN/comments?_=MMMcom o ID da postagem em N e o ID da pergunta em M. Consulte, por exemplo: /programming//posts/11227809/comments?_=211160

  • Os URLs devem ser removidos para ancorar apenas o texto.

  • Definiremos uma "sentença" como qualquer coisa fora de um bloco de código que termine em um ponto, ponto de interrogação ou ponto de exclamação. Se uma sequência de texto não tiver uma pontuação final desse formulário, o final do texto será o final da frase; como se tivesse sido escrito com um ponto.

  • Se você estiver procurando por casos de teste engraçados que provavelmente se qualificam, tente usar o StackExchange Data Explorer, como Postagens com mais comentários .

  • ... mais por vir, aposto ...

Amostras

Amostra Um

Entrada:

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

Resultado:

shanee: "Como devo abordar eticamente o armazenamento de senha de usuário para recuperação posterior de texto sem formatação?"

stefanw: "Eu acho que ele sabe que não é bom!"

shanee: "Como devo abordar eticamente o armazenamento de senha de usuário para recuperação posterior de texto sem formatação?"

Torre: "Talvez você deva perguntar como implementar uma vulnerabilidade de estouro de buffer de maneira segura!"

shanee: "Como devo abordar eticamente o armazenamento de senha de usuário para recuperação posterior de texto sem formatação?"

Michael Burr: "Pergunte por que a senha deve estar em texto sem formatação: se é para que o usuário possa recuperá-la, então, estritamente falando, você realmente não precisa recuperar a senha que definiu (eles não se lembram do que é"). de qualquer maneira), você precisa fornecer uma senha que eles possam usar ".

Amostra Dois

Entrada:

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

Resultado:

DVK: "Por que os bruxos nascidos trouxas não usam a tecnologia trouxa para combater os Comensais da Morte?"

DampeS8N: "Isso dança no limite novamente!"

DVK: "Por que os bruxos nascidos trouxas não usam a tecnologia trouxa para combater os Comensais da Morte?"

DampeS8N: "Certo, mas este site não é sobre apontar buracos na trama!"

DVK: "Por que os bruxos nascidos trouxas não usam a tecnologia trouxa para combater os Comensais da Morte?"

Jeff: "Acredito, apesar de não ter conseguido encontrar uma referência, que JK Rowling realmente mencionou isso em um ponto."

Amostra Três

Entrada:

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

Resultado:

"Oh, comporte-se!"

(O tempo de resposta mais bem avaliado é que Jun 27 '12 at 13:56, enquanto o segundo comentário de acompanhamento da pergunta é feito no momento Jun 27 '12 at 14:52. Portanto, não há um nexo de causalidade entre o segundo acompanhamento e a resposta. :-P)

Critérios Vencedores

Código Golf - o código mais curto vence.

Dr. Rebmu
fonte
4
Acabei de passar a última meia hora lendo aquele tópico de Harry Potter. +1 para isso!
precisa saber é
Não há novas respostas para essa pergunta há algum tempo. Talvez seja hora de terminar agora, ou pelo menos adicionar um prazo?
Lars Ebert
@LarsEbert Feito ... (embora eu realmente estava indo para tomar uma rachadura em que em Rebmu, as chances de ele fazer isso na minha agenda são escassas ATM.)
Dr. Rebmu
Você ainda pode adicioná-lo no futuro. Eu adoraria ver uma solução alternativa (e possivelmente mais curta).
Lars Ebert

Respostas:

3

PHP, 1282 caracteres

Embora 1282 seja enorme para um desafio de código de golfe, o desafio é bastante complexo. (E eu não sou muito bom em golfe.)

<?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;

Versão ungolfed

<?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
fonte
Você pode encadear todas essas $a=function(1,2,$a)coisas juntas.
wizzwizz4