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

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

【謎解きプログラム】正しいコードは?【一人すごろく】解答と解説

【謎解きプログラム】正しいコードは?【一人すごろく】

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

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

問題のオープニング

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

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

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

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

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

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

問題1

あなたは、抽象化された「すごろく」の動作を、プログラムで書くことになりました。

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

要求動作を満たすコードを、選択肢から1つ選んで下さい。

変数posはマス目の位置、diceはサイコロの目を表します。関数printlnは出力、関数getDiceは1~6の範囲の整数をランダムで戻します。

● 要求動作

100マス目に到達したらゴール(折り返して戻ったりしない)

● コードと選択肢

// コード
pos = 1;
while(true) {
dice = getDice();
pos += dice;
println(“dice ” + dice + “, pos ” + pos);
if (pos == 100) {break;}
// 選択肢1
if (pos >= 100) {break;}
// 選択肢2
if (pos < 100) {break;}
// 選択肢3
}
println("GOAL!");

● 答え

「pos = 1;」と、posは1からスタートしています。そのため、100マス目は、posが100の時になります。

そのため、posが100以上の場合(折り返さないので通り過ぎてもよい)にゴールと見なせば、よいことになります。

この条件を満たす判定は、「pos >= 100」なので、答えは選択肢2の「if (pos >= 100) {break;}」になります。

以下、コードを、JavaScriptで処理したものを掲載します。冒頭の変数や関数は、問題2以降も共通です。また、無限に終わらないコードを防ぐために、デバッグ用の終了処理を加えています。

● 確認コード

// 共通
var pos, dice;
var println = console.log;
var getDice = function() {
return Math.floor(Math.random() * 6) + 1;
}

//—————————————-
// 100マス目に到達したらゴール

// 選択肢1 ×
console.log(‘選択肢1’);
(function() {
pos = 1;
while(true) {
dice = getDice();
pos += dice;
println(“dice ” + dice + “, pos ” + pos);
if (pos == 100) {break}
if (pos >= 120) {break}
// デバッグ用
}
println(“GOAL!”);
})();
console.log(‘-‘.repeat(20));

// 選択肢2 ○
console.log(‘選択肢2’);
(function() {
pos = 1;
while(true) {
dice = getDice();
pos += dice;
println(“dice ” + dice + “, pos ” + pos);
if (pos >= 100) {break}
}
println(“GOAL!”);
})();
console.log(‘-‘.repeat(20));

// 選択肢3 ×
console.log(‘選択肢3’);
(function() {
pos = 1;
while(true) {
dice = getDice();
pos += dice;
println(“dice ” + dice + “, pos ” + pos);
if (pos < 100) {break}
}
println("GOAL!");
})();
console.log('-'.repeat(20));

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