ガジェット通信 GetNews

見たことのないものを見に行こう

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

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

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

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

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

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

問題のオープニング

ある日、出社すると、あなたの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
dice 2, pos 3
dice 2, pos 5
dice 4, pos 9
dice 4, pos 13
dice 3, pos 16
dice 6, pos 22
dice 6, pos 28
dice 6, pos 34
dice 2, pos 36
dice 3, pos 39
dice 5, pos 44
dice 5, pos 49
dice 6, pos 55
dice 2, pos 57
dice 3, pos 60
dice 3, pos 63
dice 1, pos 64
dice 3, pos 67
dice 6, pos 73
dice 5, pos 78
dice 3, pos 81
dice 6, pos 87
dice 5, pos 92
dice 1, pos 93
dice 2, pos 95
dice 6, pos 101
dice 3, pos 104
dice 2, pos 106
dice 5, pos 111
dice 6, pos 117
dice 6, pos 123
GOAL!
——————–
選択肢2
dice 3, pos 4
dice 3, pos 7
dice 1, pos 8
dice 6, pos 14
dice 4, pos 18
dice 6, pos 24
dice 2, pos 26
dice 3, pos 29
dice 4, pos 33
dice 5, pos 38
dice 4, pos 42
dice 3, pos 45
dice 1, pos 46
dice 2, pos 48
dice 2, pos 50
dice 2, pos 52
dice 6, pos 58
dice 4, pos 62
dice 6, pos 68
dice 2, pos 70
dice 6, pos 76
dice 5, pos 81
dice 5, pos 86
dice 3, pos 89
dice 3, pos 92
dice 2, pos 94
dice 6, pos 100
GOAL!
——————–
選択肢3
dice 1, pos 2
GOAL!
——————–

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