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

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

【謎解きプログラム】どう防ぐ?【無限ループ】解答と解説

【謎解きプログラム】どう防ぐ?【無限ループ】

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

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

問題のオープニング

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

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

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

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

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

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

問題1

あなたは、無限ループしてしまうプログラムを修正することになりました。

(厳密に言うと、変数の上限まで来て負数になると停まったりするので、10000回以上繰り返される部分を、無限ループとします)

示されるコードは、C、Java、JavaScriptなどのプログラミング言語で見られるような、一般的な書き方のコードです。

無限ループを防げるコードを、選択肢から1つ選んで下さい。

● コードと選択肢

// コード
i = 0;
while(true) {
i ++;
if (i == 0) {break;}
// 選択肢1
if (i > 100) {break;}
// 選択肢2
if (i < 0)
{break;}
// 選択肢3
}
println("ESCAPE!");

● 答え

変数iは0から始まります。また、選択肢の前に「i ++;」という処理が入ります。そのため選択肢の時点で、iは1から始まり、1ずつ大きくなっていきます。

// コード
i = 0;
while(true) {
i ++;
// ←最初にここを通過したあと、変数iは、1加算されて1になる。
// 選択肢の時点で変数iは、1, 2, 3, ……と変化する

上記から、選択肢1の「i == 0」がtrueになることはありません。そのため選択肢1は答えではありません。

次に、選択肢3の「i 100」は、変数iが1から1ずつ大きくなっていった結果、101になった時にtrueになります。

というわけで選択肢2の「if (i > 100) {break;}」が答えになります。

以下、コードを、JavaScriptで処理したものを掲載します。

● 確認コード

// 共通
var i, j;
var println = console.log;

//—————————————-
// 選択肢1
console.log(‘選択肢1’);
(function() {
var cnt = 0;
i = 0;
while(true) {
i ++;
if (i == 0) {break;}
if (++cnt >= 10000) {break;}
// デバッグ用
}
println(“ESCAPE!”);
println(“cnt”, cnt, (cnt >= 10000) ? ‘×’ : ‘○’);
})();
console.log(‘-‘.repeat(20));

// 選択肢2
console.log(‘選択肢2’);
(function() {
var cnt = 0;
i = 0;
while(true) {
i ++;
if (i > 100) {break;}
if (++cnt >= 10000) {break;}
// デバッグ用
}
println(“ESCAPE!”);
println(“cnt”, cnt, (cnt >= 10000) ? ‘×’ : ‘○’);
})();
console.log(‘-‘.repeat(20));

// 選択肢3
console.log(‘選択肢3’);
(function() {
var cnt = 0;
i = 0;
while(true) {
i ++;
if (i = 10000) {break;}
// デバッグ用
}
println(“ESCAPE!”);
println(“cnt”, cnt, (cnt >= 10000) ? ‘×’ : ‘○’);
})();
console.log(‘-‘.repeat(20));

● 出力結果

選択肢1
ESCAPE!
cnt 10000 “×”
——————–
選択肢2
ESCAPE!
cnt 100 “○”
——————–
選択肢3
ESCAPE!
cnt 10000 “×”
——————–

問題2

あなたは、無限ループしてしまうプログラムを修正することになりました。

(厳密に言うと、変数の上限まで来て負数になると停まったりするので、10000回以上繰り返される部分を、無限ループとします)

示されるコードは、C、Java、JavaScriptなどのプログラミング言語で見られるような、一般的な書き方のコードです。

無限ループを防げるコードを、選択肢から1つ選んで下さい。

● コードと選択肢

// コード
i = 0;
while(true) {
i ++;
i ++;
if (i == 5)
{break;}
// 選択肢1
if (i * 2 == 10) {break;}
// 選択肢2
if (i — == 5)
{break;}
// 選択肢3
}
println(“ESCAPE!”);

● 答え

変数iは0から始まります。また、選択肢の前に「i ++;」という処理が2回入ります。そのため選択肢の時点で、iは2から始まり、2ずつ大きくなっていきます。

// コード
i = 0;
while(true) {
i ++;
// ←最初にここを通過したあと、変数iは、1加算されて1になる。
i ++;
// ←最初にここを通過したあと、変数iは、1加算されて2になる。
// 選択肢の時点で変数iは、2, 4, 6, ……と変化する

上記から、選択肢1の「i == 5」がtrueになることはありません。そのため選択肢1は答えではありません。

次に、選択肢2の「i * 2 == 10」の両辺を2で割ってみます。「i == 5」になり、選択肢1と同じになります。そのため、こちらもtrueになることはありません。そのため選択肢2も答えではありません。

最後に、選択肢3の「i — == 5」は、判定を行なったあと、変数iから1を減算しています。2増え、1減っているわけです。

その結果、判定に用いられる変数iの値は、2, 3, 4, 5, 6, 7, ……となります。そのため「== 5」が成立します。

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