StackExchange Mustafaは、同じ質問を3回受けるのに耐えられません


16

オースティン:「誰があなたを送ったの?」

ムスタファ:「あなたは私を殺さなければならない!」

オースティン:「誰があなたを送ったの?」

ムスタファ:「お尻にキスして、パワーズ!」

オースティン:「誰があなたを送ったの?」

ムスタファ:「悪魔博士」

(...)

ムスタファ:「同じ質問を3回聞かれるのは我慢できません。ただイライラさせられます。」

オースティンパワーズとムスタファの精神で、短い会話をシミュレートします。ただし、会話全体のデータソースはStackOverflowの質問になります(URLからの入力として提供されます)。

ルール

「オースティン」の代わりに質問者のユーザー名が使用されます。彼らが3回尋ねる質問は、質問のタイトルの最後の文から来ています(まだない場合は疑問符で終わることを余儀なくされています)。

StackExchangeが「ムスタファ」の役目を果たします。最終的に与えられる回答は、疑問符で終わらない回答の最初の文に由来し、回答したユーザーの名前に起因します。

質問がゲームに適格であるためには、(a)答えがなければならず、(b)元の質問に一連のコメントがなければなりません:

  • 質問者以外からのコメント
  • (スキップされたコメントの数)
  • 質問者からのコメント
  • 質問者以外からのコメント
  • (スキップ可能なコメントの数)
  • 質問者からのコメント

上位の回答の日付より前にこのシーケンスが満たさない場合、プログラムは単に出力する必要があります"Oh, behave!"

StackExchange Mustafaの怒っているレトルトは、疑問符で終わらない質問者以外の誰かからのコメントの最初の文に由来し、感嘆符で終わることを保証します。コメントに疑問符で終わらない文が存在しない場合、レトルトの候補としてスキップされます。コメントレトルトは、作成者のユーザー名に起因します。

明確化

  • コメントから先頭の「@XXX」応答データを取り除きます。

  • StackOverflowはコメントが多数ある場合にコメントを要約するため、完全なリストを取得するには、おそらく2番目のリクエストを使用する必要があります。そのリクエストは/programming//posts/NNN/comments?_=MMM、Nに投稿ID、Mに質問IDを持つフォームです。たとえば、https//stackoverflow.com/posts/11227809/comments?_ = 211160を参照してください。

  • URLは、テキストのみをアンカーするために削除する必要があります。

  • 「文」は、ピリオド、疑問符、または感嘆符で終わるコードブロックの外側にあるものとして定義します。テキストの連続にこの形式の終了句読点がない場合、テキストの終わりは文の終わりです。ピリオドで書かれているかのように。

  • 修飾される可能性が高い面白いテストケースを探している場合は、ほとんどのコメントのある投稿など、StackExchange Data Explorerを使用してみてください

  • ...さらに来て、賭けます...

サンプル

サンプル1

入力:

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

出力:

shanee:「後でプレーンテキストを取得するために、ユーザーのパスワードストレージに倫理的にアプローチする方法は?」

stefanw:「彼はそれが良くないことを知っていると思います!」

shanee:「後でプレーンテキストを取得するために、ユーザーのパスワードストレージに倫理的にアプローチする方法は?」

ルーク:「おそらく、安全な方法でバッファオーバーフローの脆弱性を実装する方法を尋ねるべきです!」

shanee:「後でプレーンテキストを取得するために、ユーザーのパスワードストレージに倫理的にアプローチする方法は?」

Michael Burr:「パスワードがプレーンテキストである必要がある理由を尋ねます。ユーザーがパスワードを取得できるようにする場合、厳密に言えば、設定したパスワードを取得する必要はまったくありません(パスワードが何であるか覚えていませんとにかく、あなたは彼らが使用できるパスワードを彼らに与えることができる必要があります。」

サンプル2

入力:

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

出力:

DVK:「マグル生まれの魔法使いがマグル技術を使ってデスイーターと戦わないのはなぜですか?」

DampeS8N:「これは再び端で踊る!」

DVK:「マグル生まれの魔法使いがマグル技術を使ってデスイーターと戦わないのはなぜですか?」

DampeS8N:「正しいが、このサイトはプロットの穴を指摘することではない!」

DVK:「マグル生まれの魔法使いがマグル技術を使ってデスイーターと戦わないのはなぜですか?」

ジェフ:「参考文献を見つけることができませんでしたが、JKローリングは実際にこれをある時点で言及したと思います。」

サンプル3

入力:

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

出力:

「ああ、振る舞う!」

Jun 27 '12 at 13:56質問者による質問に対する2番目のフォローアップコメントが時間にあるのに対して、トップ評価の回答時間はJun 27 '12 at 14:52です。したがって、2番目のフォローアップと回答の間に因果関係はありません。:-P)

受賞基準

コードゴルフ-最短コードが勝ちます。


4
最後の30分をハリー・ポッターのスレッドを読んだだけです。そのために+1!
ブルーノJ 14

しばらくの間、この質問に対する新しい答えはありません。今すぐ終了するか、少なくとも期限を追加する時間でしょうか?
ラースエバート

@LarsEbert完了...(実際にRebmuで問題を解決するつもりでしたが、私のスケジュールで成功する確率はスリムなATMです。)
Rebmu博士15

今後も追加できます。私は代替の(そしておそらくより短い)解決策を見たいと思っています。
ラースエバート

回答:


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.