【謎解きプログラム】乱数で発生する数値は?【組み合わせ】
本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。
それでは以下、各問題とその解答を見ていきましょう。
問題のオープニング
ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。
「24時間以内に謎が解けない場合は、このPCのデータは消失する。
謎は、あなたが真のプログラマーなら解けるものだ」
これは挑戦状ではなく脅迫状だ!
そこには、見たことのない謎が掲載されていた。
あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。
問題1
あなたは、乱数を発生する式を提示されました。この式で発生する数値としてあり得るものを、選択肢から答えて下さい。
// 式の意味
rnd(a, b) …… a, bは、0~100の整数。a以上、b以下の整数の乱数を発生する。
+ - * / …… 加減乗除の演算子。計算結果の小数点以下は切り捨てられ整数になる。
// 問題の式
rnd(2, 4) + 1
// 選択肢
1
2
3
この問題は、実際に発生する数字をピックアップすれば、どの選択肢と一致するか知ることができます。
まずは、式を変形していく形で求めてみましょう。「rnd(a, b)」を展開したものを、「[a, a+1, ……, b-1, b]」とします。
// 式を変形
rnd(2, 4) + 1
→ [2, 3, 4] + 1
→ [3, 4, 5]
また、コードを書いて、発生する数値の一覧を出力してみましょう。
// JavaScript コンソールに出力
for (var r1 = 2; r1 <= 4; r1 ++) {
var res = r1 + 1;
console.log(`rnd:${r1} + 1`, '→', res);
}
// 出力結果
rnd:2 + 1 → 3
rnd:3 + 1 → 4
rnd:4 + 1 → 5
2種類の方法で求めてみました。発生する数値は「3」「4」「5」です。このうち、選択肢にあるのは「3」になります。
というわけで、3番目の選択肢「3」が答えになります。
問題2
あなたは、乱数を発生する式を提示されました。この式で発生する数値としてあり得るものを、選択肢から答えて下さい。
// 式の意味
rnd(a, b) …… a, bは、0~100の整数。a以上、b以下の整数の乱数を発生する。
+ - * / …… 加減乗除の演算子。計算結果の小数点以下は切り捨てられ整数になる。
// 問題の式
rnd(3, 5) * 3
// 選択肢
3
5
8
12
17
この問題は、実際に発生する数字をピックアップすれば、どの選択肢と一致するか知ることができます。
まずは、式を変形していく形で求めてみましょう。「rnd(a, b)」を展開したものを、「[a, a+1, ……, b-1, b]」とします。
// 式を変形
rnd(3, 5) * 3
→ [3, 4, 5] * 3
→ [9, 12, 15]
また、コードを書いて、発生する数値の一覧を出力してみましょう。
// JavaScript コンソールに出力
for (var r1 = 3; r1 <= 5; r1 ++) {
var res = r1 * 3;
console.log(`rnd:${r1} * 3`, '→', res);
}
// 出力結果
rnd:3 * 3 → 9
rnd:4 * 3 → 12
rnd:5 * 3 → 15
2種類の方法で求めてみました。発生する数値は「9」「12」「15」です。このうち、選択肢にあるのは「12」になります。
というわけで、4番目の選択肢「12」が答えになります。
問題3
あなたは、乱数を発生する式を提示されました。この式で発生する数値としてあり得るものを、選択肢から答えて下さい。
// 式の意味
rnd(a, b) …… a, bは、0~100の整数。a以上、b以下の整数の乱数を発生する。
+ - * / …… 加減乗除の演算子。計算結果の小数点以下は切り捨てられ整数になる。
// 問題の式
rnd(3, 5) * rnd(2, 3) + 1
// 選択肢
3
6
8
13
15
この問題は、実際に発生する数字をピックアップすれば、どの選択肢と一致するか知ることができます。
まずは、式を変形していく形で求めてみましょう。「rnd(a, b)」を展開したものを、「[a, a+1, ……, b-1, b]」とします。
// 式を変形
rnd(3, 5) * rnd(2, 3) + 1
→ [3, 4, 5] * [2, 3] + 1
→ [6, 9, 8, 12, 10, 15] + 1
→ [7, 10, 9, 13, 11, 16]
また、コードを書いて、発生する数値の一覧を出力してみましょう。
// JavaScript コンソールに出力
for (var r1 = 3; r1 <= 5; r1 ++) {
for (var r2 = 2; r2 <= 3; r2 ++) {
var res = r1 * r2 + 1;
console.log(`rnd:${r1} * rnd:${r2} + 1`, '→', res);
}
}
// 出力結果
rnd:3 * rnd:2 + 1 → 7
rnd:3 * rnd:3 + 1 → 10
rnd:4 * rnd:2 + 1 → 9
rnd:4 * rnd:3 + 1 → 13
rnd:5 * rnd:2 + 1 → 11
rnd:5 * rnd:3 + 1 → 16
2種類の方法で求めてみました。発生する数値は「7」「10」「9」「13」「11」「16」です。このうち、選択肢にあるのは「13」になります。
というわけで、4番目の選択肢「13」が答えになります。
CodeIQ運営事務局より
柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!