CodeIQ MAGAZINECodeIQ MAGAZINE

【夏のミステリー】殺人現場のコード 解答と解説

2017.08.18 Category:CodeIQ問題解説・リーダーボード Tag:

  • 4
  • このエントリーをはてなブックマークに追加

夏のミステリーということで、ミステリー風味のプログラミング問題でした。

あなたは見事、プログラムを書けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

【夏のミステリー】殺人現場のコード

本問題は、表題のテーマで、簡単なプログラムを書くものです。

それでは以下、問題とその解答を見ていきましょう。

問題

殺人現場にプログラマが倒れていて、途中までプログラムが書かれている。

「続きを書いて欲しい」

これはダイイングメッセージなのか?

どうやらプログラムは、暗号を解き明かして、連続殺人犯の名前を出力するようだ。

暗号は各行、小文字のアルファベットで表されており、aを2の1乗、bを2の2乗、cを2の3乗……の2進数として、その文字列を結合したものだ。

各行の暗号を解き明かして、連続殺人犯の名前を出力しよう。

以下、入力例です。

100000000000000000000100000000100000
100010100000000000000000000

以下、出力例です。

the
cat

以下、途中まで書かれたコード「JavaScript (Node.js)」です。

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var lines = chunk.toString().split('\n');
    lines.forEach(function(line) {
        var arr = line.match(//g);
        if (arr === null) return;
        var res = arr.map(function(x) {
            return ;
        }).join('');
        process.stdout.write(res + '\n');
    });
});

答え

途中まで書かれたコードは、JavaScript製ですが、解答自体はどのプログラミング言語を選んで書き換えてもよいというものでした。

処理自体は単純なので、他のプログラミング言語に置き換えても、解答しやすいと思います。ここでは、問題の通りに、「JavaScript (Node.js)」での解答例を示します。

穴の空いた部分は2箇所。1つ目は、gフラグの付いた正規表現です。ここで結果の配列を得ます。そして、map関数を使い、2つ目の穴空き部分で、文字列に変換します。

まずは1つ目の解答例です。「1」の後に「0」が1つ以上続くパターンを指定しています。

10+

次は2つ目の解答例です。

String.fromCharCode('a'.charCodeAt(0) + x.length - 2)

「a」の文字コードに、1つ目の解答例で得た文字列(10……)の「文字列長-2」を足しています。そして、その数値を文字コードとして、文字を生成しています。

「x.length – 2」としているのは、「10」が「a」(2文字)、「100」が「b」(3文字)となっているためです。「aの文字コード」から「’10’の文字列長 – 2(= 0)」を足すと、「aの文字コード」になるようにしています。

以下、穴埋め後のコードです。

// 参考コード JavaScript (Node.js) https://codeiq.jp/tools/sandbox/
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var lines = chunk.toString().split('\n');
    lines.forEach(function(line) {
        var arr = line.match(/10+/g);
        if (arr === null) return;
        var res = arr.map(function(x) {
            return String.fromCharCode('a'.charCodeAt(0) + x.length - 2);
        }).join('');
        process.stdout.write(res + '\n');
    });
});

解答の入力と出力は、以下になります。

以下、入力1です。

100000000000000000000100000000100000
100010100000000000000000000

以下、出力1です。

the
cat

以下、入力2です。

10000000000101000100000000000
100000000000000000000100000000100000
1000000000000000000100000000010000000000000000100000000000000001000001000000000000000000

以下、出力2です。

jack
the
ripper

本問題は、出題者の最新小説「顔貌売人 ハッカー探偵 鹿敷堂桂馬」のプレゼント問題でした。

IT系エンタメ・ミステリの最新作。プログラマーなら、思わずニヤリとする要素もたくさん入っていますので、是非読んで下さい。

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

  • 4
  • このエントリーをはてなブックマークに追加

■関連記事

【謎解きプログラム】どう防ぐ?【無限ループ】解答と解説... 【謎解きプログラム】どう防ぐ?【無限ループ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に謎...
数学の問題をプログラミングで解こう!「タワー・ビルディング」問題解説... 問題のおさらい A を一辺が 1 の立方体のブロックとし、B を縦が 1、横が 1、高さが 2 の直方体のブロックとします。 (下は横から見た図です。) 自然数 n, a, b に対し、A を最大 a 個、B を最大 b 個使って、縦が 1、横が 1、高さが n の直方体の塔を作ります。 こ...
【謎解きプログラム】正しいコードは?【一人すごろく】解答と解説... 【謎解きプログラム】正しいコードは?【一人すごろく】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間...
数学の問題をプログラミングで解こう!「ペア・ドロップ」問題解説... 問題のおさらい n を自然数とします。1 から n までの自然数が 1 つずつ書かれた n 枚のカードが 2 組あります。 これら 2n 枚のカードをよく混ぜ、A と B の 2 人に n 枚ずつ配ります。 A と B は、それぞれ自分の持ち札の中に番号が一致するカードがあればその 2 枚を捨...
【謎解きプログラム】中身はどうなる?【出し入れ】解答と解説... 【謎解きプログラム】中身はどうなる?【出し入れ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内...
【謎解きプログラム】座標の移動【Matrix】解答と解説... 【謎解きプログラム】座標の移動【Matrix】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ