StackExchange Mustafa no puede soportar que se le haga la misma pregunta tres veces

16

Austin: "¿Quién te envió?"

Mustafa: "¡Tienes que matarme!"

Austin: "¿Quién te envió?"

Mustafa: "¡Bésame el culo, Powers!"

Austin: "¿Quién te envió?"

Mustafa: "Dr. Evil".

(...)

Mustafa: "No soporto que me hagan la misma pregunta tres veces. Simplemente me irrita".

Debes simular un breve diálogo en el espíritu de Austin Powers y Mustafa . Pero la fuente de datos para toda la conversación será una pregunta de StackOverflow (proporcionada como entrada desde una URL).

Reglas

El nombre de usuario del autor de la pregunta se utilizará en lugar de "Austin". La pregunta que harán tres veces proviene de la última oración en el título de la pregunta (que se ha visto obligado a terminar en un signo de interrogación si aún no lo hizo).

StackExchange interpretará el papel de "Mustafa". La respuesta dada en última instancia proviene de la primera oración de la respuesta que no termina en un signo de interrogación, y se atribuirá al nombre del usuario que respondió.

Para que una pregunta califique para el juego, debe (a) tener una respuesta y (b) debe haber una secuencia de comentarios sobre la pregunta original que dice:

  • comentario de alguien que no sea interlocutor
  • (cualquier número de comentarios omitidos)
  • comentario del interlocutor
  • comentario de alguien que no sea interlocutor
  • (cualquier número de comentarios que se pueden omitir)
  • comentario del interlocutor

Si esta secuencia no se satisface antes de la fecha de la respuesta mejor clasificada , el programa simplemente debería generar"Oh, behave!"

Las respuestas enfadadas de StackExchange Mustafa provienen de la primera oración de los comentarios de alguien que no sea el interrogador que no termina con un signo de interrogación, y se asegura de que termine con un signo de exclamación. Si no existe una oración en el comentario que no termine en un signo de interrogación, se omite como candidato para la réplica. Las réplicas de comentarios se atribuyen al nombre de usuario del autor.

Aclaraciones

  • Elimine los datos de respuesta "@XXX" de un comentario.

  • Debido a que StackOverflow resume los comentarios si hay muchos de ellos, probablemente tendrá que usar una segunda solicitud para obtener la lista completa. Esa solicitud es del formulario /programming//posts/NNN/comments?_=MMMcon el ID de la publicación en N y el ID de la pregunta en M. Consulte, por ejemplo: /programming//posts/11227809/comments?_=211160

  • Las URL deben eliminarse solo para anclar texto.

  • Definiremos una "oración" como cualquier cosa fuera de un bloque de código que termine en un punto, un signo de interrogación o un signo de exclamación. Si una secuencia de texto no tiene una puntuación final de esta forma, entonces el final del texto es el final de la oración; como si estuviera escrito con un punto.

  • Si está buscando casos de prueba divertidos que probablemente califiquen, puede intentar usar StackExchange Data Explorer, como Publicaciones con la mayoría de los comentarios .

  • ... más por venir, apostaré ...

Muestras

Muestra uno

Entrada:

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

Salida:

shanee: "¿Cómo debería abordar éticamente el almacenamiento de contraseñas de usuario para la recuperación posterior de texto sin formato?"

stefanw: "¡Creo que él sabe que no es bueno!"

shanee: "¿Cómo debería abordar éticamente el almacenamiento de contraseñas de usuario para la recuperación posterior de texto sin formato?"

Rook: "¡Quizás deberías preguntar cómo puedes implementar una vulnerabilidad de desbordamiento de búfer de forma segura!"

shanee: "¿Cómo debería abordar éticamente el almacenamiento de contraseñas de usuario para la recuperación posterior de texto sin formato?"

Michael Burr: "Pregunte por qué se requiere que la contraseña esté en texto sin formato: si es para que el usuario pueda recuperar la contraseña, entonces, estrictamente hablando, realmente no necesita recuperar la contraseña que estableció (no recuerda cuál es) de todos modos), debes poder darles una contraseña que puedan usar ".

Muestra dos

Entrada:

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

Salida:

DVK: "¿Por qué los magos nacidos de muggles no usan la tecnología muggle para luchar contra los mortífagos?"

DampeS8N: "¡Esto baila de nuevo en el borde!"

DVK: "¿Por qué los magos nacidos de muggles no usan la tecnología muggle para luchar contra los mortífagos?"

DampeS8N: "Correcto, ¡pero este sitio no se trata de señalar agujeros en la trama!"

DVK: "¿Por qué los magos nacidos de muggles no usan la tecnología muggle para luchar contra los mortífagos?"

Jeff: "Creo, aunque no he podido encontrar una referencia, que JK Rowling realmente mencionó esto en un momento".

Muestra tres

Entrada:

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

Salida:

"¡Oh, compórtate!"

(El tiempo de respuesta mejor calificado es Jun 27 '12 at 13:56, mientras que el segundo comentario de seguimiento sobre la pregunta del interrogador es a tiempo Jun 27 '12 at 14:52. Por lo tanto, no hay un vínculo causal entre el segundo seguimiento y la respuesta. :-P)

Criterios ganadores

Code Golf: el código más corto gana.

HostileFork dice que no confíes en SE
fuente
44
Acabo de pasar la última media hora leyendo ese hilo de Harry Potter. +1 por eso!
BrunoJ
No ha habido nuevas respuestas a esta pregunta en mucho tiempo. ¿Quizás es hora de terminarlo ahora, o al menos agregar una fecha límite?
Lars Ebert
@LarsEbert Hecho ... (aunque en realidad iba a echarle un vistazo en Rebmu, las probabilidades de que aparezca en mi agenda son
pocos
Todavía puede agregarlo en el futuro. Me encantaría ver una solución alternativa (y posiblemente más corta).
Lars Ebert

Respuestas:

3

PHP, 1282 caracteres

Si bien 1282 es bastante grande para un desafío de golf de código, el desafío es bastante complejo. (Y no soy muy bueno en el 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ón sin golf

<?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
fuente
Puedes encadenar todas esas $a=function(1,2,$a)cosas juntas.
wizzwizz4