CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】中身はどうなる?【出し入れ】解答と解説

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

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

言語不問で、プログラムにちなんだ謎を解く「謎解きプログラム」。

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

【謎解きプログラム】中身はどうなる?【出し入れ】

本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。

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

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内にが解けない場合は、このPCのデータは消失する。

 は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

問題1

配列は値を、末尾から出し入れしたり、先頭から出し入れしたりすることがあります。多くのプログラミング言語では、そのための関数が用意されています。

以下の擬似コードを元に、配列を格納した変数の中身がどのようになるか、当てて下さい。特に書いていない内容については、特殊ではない一般的なプログラミング言語のルールに従います。

● 擬似コードのルール

[5, 6, 7] …… 要素0が5、要素1が6、要素2が7の配列。
a = [1, 2] …… 変数aに、配列や値を入れる。
unshift(配列, 値) …… 配列の先頭に値を追加。戻り値は引数の配列(処理後の配列の参照)。
shift(配列) …… 配列の先頭から値を削除。戻り値は削除した値。
push(配列, 値) …… 配列の末尾に値を追加。戻り値は引数の配列(処理後の配列の参照)。
pop(配列) …… 配列の末尾から値を削除。戻り値は削除した値。

● 問題

a = shift(push([9, 8, 7], 1));

● 選択肢

a の中身は [9, 8, 7, 1]
a の中身は [8, 7, 1]
a の中身は 9
a の中身は 1

● 答え

まず、問題を分解してみます。そして、関数の説明を追加します。

a = shift(push([9, 8, 7], 1));

--<以下、分解>--------------------------------------

tmp = push([9, 8, 7], 1);  // 配列の末尾に値を追加。戻り値は引数の配列。

a = shift(tmp);  // 配列の先頭から値を削除。戻り値は削除した値。

次に、処理結果を添えて書きます。

a = shift(push([9, 8, 7], 1));

--<以下、分解>--------------------------------------

tmp = push([9, 8, 7], 1);  // 配列の末尾に値を追加。戻り値は引数の配列。
// 「tmp」の中身は「[9, 8, 7, 1]」。

a = shift(tmp);  // 配列の先頭から値を削除。戻り値は削除した値。
↓
a = shift([9, 8, 7, 1]);  // 配列の先頭から値を削除。戻り値は削除した値。
// 「a」の中身は「9」

というわけで、答えは選択肢3の「a の中身は 9」になります。

以下、擬似コードを、JavaScriptで処理したものを掲載します。「evalCode」は、問題2以降も共通です。

● 確認コード

// 計算実行用関数
var evalCode = function(s) {
    console.log(s);

    var unshift = function(a, b) {
        a.unshift(b);
        return a;
    };
    var shift = function(a) {
        return a.shift();
    };
    var push = function(a, b) {
        a.push(b);
        return a;
    };
    var pop = function(a) {
        return a.pop();
    };

    eval(s);
};

evalCode(`
// push部分のみ
a = push([9, 8, 7], 1);
console.log(a);

// 全体実行
a = shift(push([9, 8, 7], 1));
console.log(a);
`);

● 出力結果

// push部分のみ
a = push([9, 8, 7], 1);
console.log(a);

// 全体実行
a = shift(push([9, 8, 7], 1));
console.log(a);

[ 9, 8, 7, 1 ]
9

問題2

配列は値を、末尾から出し入れしたり、先頭から出し入れしたりすることがあります。多くのプログラミング言語では、そのための関数が用意されています。

以下の擬似コードを元に、配列を格納した変数の中身がどのようになるか、当てて下さい。特に書いていない内容については、特殊ではない一般的なプログラミング言語のルールに従います。また計算順序は、内側の丸括弧や関数から解決します。

● 擬似コードのルール

[5, 6, 7] …… 要素0が5、要素1が6、要素2が7の配列。
a = [1, 2] …… 変数aに、配列や値を入れる。
unshift(配列, 値) …… 配列の先頭に値を追加。戻り値は引数の配列(処理後の配列の参照)。
shift(配列) …… 配列の先頭から値を削除。戻り値は削除した値。
push(配列, 値) …… 配列の末尾に値を追加。戻り値は引数の配列(処理後の配列の参照)。
pop(配列) …… 配列の末尾から値を削除。戻り値は削除した値。

● 問題

a = unshift([9, 8, 7], 1);
b = push([3, 2, 1], 9);

● 選択肢

a の中身は [9, 8, 7, 1] / b の中身は [3, 2, 1, 9]
a の中身は [1,9, 8, 7] / b の中身は [3, 2, 1, 9]
a の中身は [1,9, 8, 7] / b の中身は [9, 3, 2, 1]
a の中身は [9, 8, 7, 1] / b の中身は [9, 3, 2, 1]

● 答え

まず、問題に関数の説明を追加します。

a = unshift([9, 8, 7], 1);    // 配列の先頭に値を追加。戻り値は引数の配列。
b = push([3, 2, 1], 9);    // 配列の末尾に値を追加。戻り値は引数の配列。

次に、処理結果を添えて書きます。

a = unshift([9, 8, 7], 1);    // 配列の先頭に値を追加。戻り値は引数の配列。
// 「a」の中身は「[1, 9, 8, 7]」。

b = push([3, 2, 1], 9);    // 配列の末尾に値を追加。戻り値は引数の配列。
// 「b」の中身は「[3, 2, 1, 9]」。

というわけで、答えは選択肢2の「a の中身は [1,9, 8, 7] / b の中身は [3, 2, 1, 9]」になります。

以下、擬似コードを、JavaScriptで処理したものを掲載します。「evalCode」は、問題1で掲載しているので割愛します。

● 確認コード

evalCode(`
a = unshift([9, 8, 7], 1);
console.log(a);

b = push([3, 2, 1], 9);
console.log(b);
`);

● 出力結果

a = unshift([9, 8, 7], 1);
console.log(a);

b = push([3, 2, 1], 9);
console.log(b);

[ 1, 9, 8, 7 ]
[ 3, 2, 1, 9 ]

問題3

配列は値を、末尾から出し入れしたり、先頭から出し入れしたりすることがあります。多くのプログラミング言語では、そのための関数が用意されています。

以下の擬似コードを元に、配列を格納した変数の中身がどのようになるか、当てて下さい。特に書いていない内容については、特殊ではない一般的なプログラミング言語のルールに従います。また計算順序は、内側の丸括弧や関数から解決します。

● 擬似コードのルール

[5, 6, 7] …… 要素0が5、要素1が6、要素2が7の配列。
a = [1, 2] …… 変数aに、配列や値を入れる。
unshift(配列, 値) …… 配列の先頭に値を追加。戻り値は引数の配列(処理後の配列の参照)。
shift(配列) …… 配列の先頭から値を削除。戻り値は削除した値。
push(配列, 値) …… 配列の末尾に値を追加。戻り値は引数の配列(処理後の配列の参照)。
pop(配列) …… 配列の末尾から値を削除。戻り値は削除した値。

● 問題

a = [9, 8, 7];
push(a, shift(push(a, shift(a))));

● 選択肢

[9, 8, 7]
[7, 9, 8]
[7, 8, 9]
[8, 7, 9]

● 答え

内側にある関数から、1つずつ処理して行くことにします。

shift(a)
↓
shift([9, 8, 7])    // 配列の先頭から値を削除。戻り値は削除した値。
// 配列は「[8, 7]」、戻り値は「9」。


push(a, shift(a))
↓
push([8, 7], 9)    // 配列の末尾に値を追加。戻り値は引数の配列。
// 配列は「[8, 7, 9]」、戻り値も「[8, 7, 9]」。


shift(push(a, shift(a)))
↓
shift([8, 7, 9])    // 配列の先頭から値を削除。戻り値は削除した値。
// 配列は「[7, 9]」、戻り値は「8」。


push(a, shift(push(a, shift(a))));
↓
push([7, 9], 8)    // 配列の末尾に値を追加。戻り値は引数の配列。
// 配列は「[7, 9, 8]」、戻り値も「7, 9, 8]」。

というわけで、答えは選択肢2の「[7, 9, 8]」になります。

以下、擬似コードを、JavaScriptで処理したものを掲載します。「evalCode」は、問題1で掲載しているので割愛します。

● 確認コード

evalCode(`
a = [9, 8, 7];
push(a, shift(push(a, shift(a))));
console.log(a);
`);

● 出力結果

a = [9, 8, 7];
push(a, shift(push(a, shift(a))));
console.log(a);

[ 7, 9, 8 ]

CodeIQ運営事務局より

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

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

■関連記事

【謎解きプログラム】どう防ぐ?【無限ループ】解答と解説... 【謎解きプログラム】どう防ぐ?【無限ループ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたの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 枚を捨...
【謎解きプログラム】座標の移動【Matrix】解答と解説... 【謎解きプログラム】座標の移動【Matrix】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に...
数学の問題をプログラミングで解こう!「ストレート・ラインズ」問題解説... 問題のおさらい 2 以上の自然数 n に対し、n×n の格子状に並んだ点を考えます。 これらの点のうちちょうど 2 個の点を通る直線の数を F(n) と定義します。 例えば F(2)=6 です。題意を満たす直線は以下の 6 通りです。 また、F(3)=12 です。題意を満たす直線は以下の...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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