CodeIQ MAGAZINECodeIQ MAGAZINE

【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説

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

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

ミステリー風味の簡単なプログラムを書いてみよう、というプログラミング問題でした。

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

【コードミステリ】数字に隠されたメッセージ【言語不問】

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

喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。

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

問題

各行から得られる正の整数(1~9999)を16で割ります。

得られた数字に応じて、以下の表を元に文字を得て、全て連結して出力して下さい。

各プログラミング言語の入出力の方法は、各言語の標準入出力サンプルを参考にして下さい。

以下、対応表です。

得られた数字 出力する文字
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 a
11 b
12 c
13 d
14 e
15 f

以下、入力例1です。

10
12
14
17

以下、出力例1です。

ace1

以下、入力例2です。

6562
5963
1450
2077

以下、出力例2です。

2bad

答え

この問題は、いくつかの解き方があります。

解法1

まずは、問題文の通りに解く方法です。各行から得られる整数を16で割り、その剰余を利用して対応する文字を取得します。

以下、実例のコードです。サンドボックスで試せる、Node.js用のものです。

// https://codeiq.jp/tools/sandbox/
// Node.js

// 解答1
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var lines = chunk.toString().split('\n');
    var src = lines.map(function(x) {return x * 1});

    var res = src.map(function(x) {
        return '0123456789abcdef'[x % 16];
    });
    process.stdout.write(res.join(''));
});

「’0123456789abcdef'[x % 16]」の部分で、対応する文字を決定しています。16で割った剰余を利用して、文字列の中から対応する文字を選んでいます(JavaScrptは『文字列[添え字]』で、その位置の文字を取得可能)。

そして、「res.join(”)」の部分で文字を結合しています。

解法2

次は、対応する文字が16進数の値であることに注目した方法です。数値を16進数に変換して末尾の1文字を得ます。

以下、実例のコードです。サンドボックスで試せる、Node.js用のものです。

// https://codeiq.jp/tools/sandbox/
// Node.js

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
    var lines = chunk.toString().split('\n');
    var src = lines.map(function(x) {return x * 1});

    var res = src.map(function(x) {
        return x.toString(16).substr(-1);
    });
    process.stdout.write(res.join(''));
});

「x.toString(16).substr(-1)」の部分で、対応する文字を得ています。16進数の文字列に変換したあと、末尾から1文字を得ています。

そして、「res.join(”)」の部分で文字を結合しています。ここは解法1と同じです。

解答の入力と出力

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

以下、入力1です。

6575
5962
1452
2078
1729
7314
595

以下、出力1です。

face123

以下、入力2です。

6573
5966
1450
2077
1732
7327
602
5916
7726

以下、出力2です。

dead4face

どちらの答えも、『顔貌売人』にちなんで『face』の文字が含まれています。対応する文字が『0123456789abcdef』なので、そこからアルファベット『abcdef』を利用して単語を組み立てています。

というわけで、小説『顔貌売人』もよろしくお願いします。

CodeIQ運営事務局より

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

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

■関連記事

【謎解きプログラム】どう防ぐ?【無限ループ】解答と解説... 【謎解きプログラム】どう防ぐ?【無限ループ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたの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

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