StackExchange Mustafa не может быть задан один и тот же вопрос три раза


16

Остин: "Кто тебя послал?"

Мустафа: «Вы должны убить меня!»

Остин: "Кто тебя послал?"

Мустафа: "Поцелуй меня в задницу, Пауэрс!"

Остин: "Кто тебя послал?"

Мустафа: «Доктор Зло».

(...)

Мустафа: «Я терпеть не могу, когда мне задают один и тот же вопрос три раза. Это меня просто раздражает».

Вам предстоит смоделировать короткий диалог в духе Остина Пауэрса и Мустафы . Но источником данных для всего разговора будет вопрос StackOverflow (предоставленный как входные данные из URL).

правила

Имя пользователя спрашивающего будет использоваться вместо «Остин». Вопрос, который они зададут три раза, прибывает из последнего предложения в заголовке вопроса (который был вынужден заканчиваться знаком вопроса, если это еще не было).

StackExchange будет играть роль «Мустафы». Ответ, который в конечном итоге дается, приходит из первого предложения в ответе, которое не заканчивается знаком вопроса, и будет приписываться имени пользователя, который ответил.

Чтобы вопрос соответствовал требованиям игры, он должен (а) иметь ответ и (б) должна быть последовательность комментариев к исходному вопросу, которая звучит так:

  • комментарий от кого-то, кроме спрашивающего
  • (любое количество пропущенных комментариев)
  • комментарий от спрашивающего
  • комментарий от кого-то, кроме спрашивающего
  • (любое количество пропускаемых комментариев)
  • комментарий от спрашивающего

Если эта последовательность не выполняется до даты ответа , получившего самый высокий рейтинг , программа должна просто вывести"Oh, behave!"

Гневные реплики StackExchange Мустафы происходят из первого предложения комментариев от кого-то, кроме спрашивающего, который не заканчиваются знаком вопроса - и гарантируют, что оно заканчивается восклицательным знаком. Если в комментарии нет предложения, которое не заканчивается знаком вопроса, оно пропускается как кандидат на реторту. Реторты комментариев относятся к имени пользователя автора.

Разъяснения

  • Удалите все ведущие данные ответа "@XXX" из комментария.

  • Поскольку StackOverflow суммирует комментарии, если их много, вам, вероятно, придется использовать второй запрос, чтобы получить полный список. Этот запрос имеет форму /programming//posts/NNN/comments?_=MMMс идентификатором записи в N и идентификатором вопроса в M. См., Например: /programming//posts/11227809/comments?_=211160

  • URL-адреса должны быть удалены только для привязки текста.

  • Мы определим «предложение» как что-либо вне блока кода, которое заканчивается точкой, вопросительным знаком или восклицательным знаком. Если строка текста не имеет конечной пунктуации этой формы, то конец текста является концом предложения; как будто это было написано с точкой.

  • Если вы ищете забавные тестовые случаи, которые могут подойти, вы можете попробовать использовать StackExchange Data Explorer, например, « Посты с наибольшим количеством комментариев» .

  • ... еще впереди, я сделаю ставку ...

образцы

Образец первый

Входные данные:

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

Выход:

Шейни: «Как мне этически подходить к хранению пароля пользователя для последующего получения открытого текста?»

stefanw: «Я думаю, он знает, что это не хорошо!»

Шейни: «Как мне этически подходить к хранению пароля пользователя для последующего получения открытого текста?»

Грач: «Возможно, вам следует спросить, как можно безопасно внедрить уязвимость переполнения буфера!»

Шейни: «Как мне этически подходить к хранению пароля пользователя для последующего получения открытого текста?»

Майкл Берр: «Спросите, почему пароль должен быть в незашифрованном виде: если это так, чтобы пользователь мог восстановить пароль, то, строго говоря, вам действительно не нужно восстанавливать пароль, который он установил (они не помнят, что это такое) во всяком случае), вы должны иметь возможность дать им пароль, который они могут использовать ".

Образец второй

Входные данные:

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

Выход:

ДВК: «Почему волшебники, рожденные маглами, не используют маггловскую технологию для борьбы с Пожирателями смерти?»

DampeS8N: «Это снова танцы на грани!»

ДВК: «Почему волшебники, рожденные маглами, не используют маггловскую технологию для борьбы с Пожирателями смерти?»

DampeS8N: «Правильно, но этот сайт не о том, чтобы указывать дыры в сюжете!»

ДВК: «Почему волшебники, рожденные маглами, не используют маггловскую технологию для борьбы с Пожирателями смерти?»

Джефф: «Я полагаю, хотя я не смог найти ссылку, что Джоан Роулинг действительно упоминала об этом в один момент».

Образец третий

Входные данные:

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

Выход:

"О, веди себя!"

(Самое рейтинговое время ответа - это время Jun 27 '12 at 13:56, когда второй последующий комментарий задающего спрашивает время Jun 27 '12 at 14:52. Следовательно, нет причинно-следственной связи между вторым продолжением и ответом. :-P)

Критерии победы

Код Гольф - выигрывает самый короткий код.


4
Только что провел последние полчаса, читая эту тему Гарри Поттера. +1 за это!
BrunoJ

В последнее время не было новых ответов на этот вопрос. Может быть, пришло время закончить это сейчас или хотя бы добавить крайний срок?
Ларс Эберт

@LarsEbert Готово ... (хотя на самом деле я собирался сделать это в Ребму, шансы сделать это по моему расписанию невелики.)
HostileFork говорит, что не доверяю SE

Вы все еще можете добавить его в будущем. Я хотел бы видеть альтернативное (и, возможно, более короткое) решение.
Ларс Эберт

Ответы:


3

PHP, 1282 символа

В то время как 1282 достаточно велики для игры в гольф, эта задача довольно сложная. (И я не очень хорош в гольфе.)

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

Неуправляемая версия

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

?>

Вы можете связать все эти $a=function(1,2,$a)вещи вместе.
wizzwizz4
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.