StackExchange Mustafa ne supporte pas qu'on lui pose la même question trois fois

16

Austin: "Qui vous a envoyé?"

Mustafa: "Tu dois me tuer!"

Austin: "Qui vous a envoyé?"

Mustafa: "Embrasse mon cul, Powers!"

Austin: "Qui vous a envoyé?"

Mustafa: "Dr Evil."

(...)

Mustafa: "Je ne supporte pas qu'on me pose la même question trois fois. Cela m'irrite juste."

Vous devez simuler un bref dialogue dans l'esprit d' Austin Powers et de Mustafa . Mais la source de données pour toute la conversation sera une question StackOverflow (fournie en entrée d'une URL).

Règles

Le nom d'utilisateur du demandeur sera utilisé à la place de "Austin". La question qu'ils poseront trois fois vient de la dernière phrase du titre de la question (qui a été forcée de se terminer par un point d'interrogation si ce n'était déjà fait).

StackExchange jouera le rôle de "Mustafa". La réponse finalement donnée provient de la première phrase de la réponse qui ne se termine pas par un point d'interrogation et sera attribuée au nom de l'utilisateur qui a répondu.

Pour qu'une question soit éligible pour le jeu, elle doit (a) avoir une réponse, et (b) il doit y avoir une séquence de commentaires sur la question d'origine qui va:

  • commentaire de quelqu'un d'autre que celui qui pose la question
  • (n'importe quel nombre de commentaires ignorés)
  • commentaire du questionneur
  • commentaire de quelqu'un d'autre que celui qui pose la question
  • (n'importe quel nombre de commentaires désactivables)
  • commentaire du questionneur

Si cette séquence n'est pas satisfaite avant la date de la réponse la mieux classée , le programme doit simplement produire"Oh, behave!"

Les répliques en colère de StackExchange Mustafa proviennent de la première phrase des commentaires de quelqu'un d'autre que l'interrogateur qui ne se termine pas par un point d'interrogation - et en s'assurant que cela se termine par un point d'exclamation. S'il n'y a pas de phrase dans le commentaire qui ne se termine pas par un point d'interrogation, elle est ignorée en tant que candidat pour la réplique. Les répliques de commentaires sont attribuées au nom d'utilisateur de l'auteur.

Clarifications

  • Supprimez toutes les données de réponse "@XXX" principales d'un commentaire.

  • Étant donné que StackOverflow résume les commentaires s'il y en a beaucoup, vous devrez probablement utiliser une deuxième demande pour obtenir la liste complète. Cette demande est du formulaire /programming//posts/NNN/comments?_=MMMavec l'ID de poste en N et l'ID de question en M. Voir par exemple: /programming//posts/11227809/comments?_=211160

  • Les URL doivent être supprimées uniquement pour le texte d'ancrage.

  • Nous définirons une "phrase" comme tout élément en dehors d'un bloc de code qui se termine par un point, un point d'interrogation ou un point d'exclamation. Si une séquence de texte n'a pas de ponctuation de fin de ce formulaire, la fin du texte est la fin de la phrase; comme s'il était écrit avec un point.

  • Si vous recherchez des cas de test amusants susceptibles de se qualifier, vous pouvez essayer d'utiliser StackExchange Data Explorer, tels que les publications avec le plus de commentaires .

  • ... plus à venir, je parie ...

Échantillons

Échantillon un

Contribution:

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

Production:

shanee: "Comment dois-je aborder éthiquement le stockage des mots de passe des utilisateurs pour une récupération ultérieure du texte en clair?"

stefanw: "Je pense qu'il sait que ce n'est pas bon!"

shanee: "Comment dois-je aborder éthiquement le stockage des mots de passe des utilisateurs pour une récupération ultérieure du texte en clair?"

Rook: "Vous devriez peut-être vous demander comment mettre en œuvre une vulnérabilité de dépassement de tampon de manière sécurisée!"

shanee: "Comment dois-je aborder éthiquement le stockage des mots de passe des utilisateurs pour une récupération ultérieure du texte en clair?"

Michael Burr: "Demandez pourquoi le mot de passe doit être en clair: si c'est pour que l'utilisateur puisse récupérer le mot de passe, alors à proprement parler, vous n'avez pas vraiment besoin de récupérer le mot de passe qu'ils ont défini (ils ne se souviennent pas de quoi il s'agit) de toute façon), vous devez être en mesure de leur donner un mot de passe qu'ils peuvent utiliser. "

Échantillon deux

Contribution:

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

Production:

DVK: "Pourquoi les sorciers nés de moldus n'utilisent-ils pas la technologie moldue pour combattre les mangemorts?"

DampeS8N: "Ça danse encore sur le bord!"

DVK: "Pourquoi les sorciers nés de moldus n'utilisent-ils pas la technologie moldue pour combattre les mangemorts?"

DampeS8N: "D' accord , mais ce site ne vise pas à signaler les trous de l'intrigue!"

DVK: "Pourquoi les sorciers nés de moldus n'utilisent-ils pas la technologie moldue pour combattre les mangemorts?"

Jeff: "Je crois, bien que je n'aie pas été en mesure de trouver une référence, que JK Rowling ait effectivement mentionné cela à un moment donné."

Échantillon trois

Contribution:

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

Production:

"Oh, sois sage!"

(Le temps de réponse le mieux noté est Jun 27 '12 at 13:56, tandis que le deuxième commentaire de suivi sur la question par le questionneur est à temps Jun 27 '12 at 14:52. Par conséquent, il n'y a pas de lien de causalité entre le deuxième suivi et la réponse. :-P)

Critères gagnants

Code Golf - le code le plus court gagne.

HostileFork dit de ne pas faire confiance à SE
la source
4
Je viens de passer la dernière demi-heure à lire ce fil Harry Potter. +1 pour ça!
BrunoJ
Il n'y a pas eu de nouvelles réponses à cette question depuis un certain temps. Peut-être qu'il est temps d'y mettre fin maintenant, ou au moins d'ajouter un délai?
Lars Ebert
@LarsEbert Done ... (même si j'allais vraiment m'y attaquer à Rebmu, les chances que cela arrive à mon horaire sont minces ATM.)
HostileFork dit de ne pas faire confiance au SE
Vous pouvez toujours l'ajouter à l'avenir. J'aimerais voir une solution alternative (et peut-être plus courte).
Lars Ebert

Réponses:

3

PHP, 1282 caractères

Alors que 1282 est assez énorme pour un défi de golf à code, le défi est assez complexe. (Et je ne suis pas très bon au 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;

Version non golfée

<?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
la source
Vous pouvez enchaîner toutes ces $a=function(1,2,$a)choses ensemble.
wizzwizz4