体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

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

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

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

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

問題のオープニング

ある日、出社すると、あなたの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

1 2 3次のページ
CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。