CodeIQ MAGAZINECodeIQ MAGAZINE

【選択式問題】JavaScript検定RPG Array編 問題解説 #javascript

2015.11.25 Category:CodeIQ問題解説・リーダーボード Tag:

  • 4
  • このエントリーをはてなブックマークに追加
eye_catch

JavaScript の知識を駆使して敵を倒す『JavaScript検定RPG』。

今回の『Array編』は全て解けましたか? というわけで、解答と解説をどうぞ!
by クロノス・クラウン合同会社 柳井政和

今回の問題

今回の『JavaScript検定RPG』は『Array編』ということで、JavaScript のArrayについての問題が出題されました。

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

問題1

配列を作る方法として適切でないのはどれ?

new Array(0, 1, 2)
[3, 4, 5]
Array{6, 7, 8}

JavaScriptでは、「new Array(要素, 要素, …)」あるいは「[要素, 要素, …]」といった方法で、配列を作ることができます。しかし、「Array{要素, 要素, …}」といった方法では、配列を作ることができません。

Array を new 演算子で初期化する際は、その引数が1つかつ0以上の整数値の場合は、引数は要素数になります。それ以外の場合は、配列の各要素になります。

そのため答えは、3番目の「Array{6, 7, 8}」になります。

// 参考コードと出力結果
console.log("[" + new Array(0, 1, 2) + "]");  // [0,1,2]
console.log("[" + new Array("9") + "]");      // [9]
console.log("[" + new Array() + "]");         // []
console.log("[" + new Array(4) + "]");        // [,,,]

console.log("[" + [3, 4, 5] + "]");           // [3,4,5]

参考1:Array – JavaScript | MDN

問題2

配列の長さを得る方法はどれ?

[0, 1, 2].length
[3, 4, 5].length()
length([6, 7, 8])
Array.length([9, 0, 1])

JavaScriptでは、「配列.length」で配列の長さを得られます。

そのため答えは、1番目の「[0, 1, 2].length」になります。

// 参考コードと出力結果
console.log([0, 1, 2].length);  // 3

参考1:Array – JavaScript | MDN

問題3

var a = [0, 1]; の時、a[2] の値は?

0
1
-1
undefined

JavaScriptでは、配列の要素の範囲外を参照しようとした際は「undefined」が戻ります。JavaScriptは、配列の要素の添え字を0から数えます。そのため、「a[2]」は要素の範囲外となります。

そのため答えは、4番目の「undefined」になります。

// 参考コードと出力結果
var a = [0, 1];
console.log(a[2]);  // undefined

参考:Array – JavaScript | MDN

問題4

以下の式でエラーが出ないのはどれ?

new Array(-1)
new Array(Math.pow(2,-1))
new Array(2<<32)
new Array(Math.pow(2,32))

Array を new 演算子で初期化する際、引数が1つだけで、数値が設定された際は、その引数は要素数と見なされます。

その際、0 から 232-1 までの整数値の場合は、正しく配列が作られて、それ以外の数値の場合はエラーが起きます。

問題の引数のうち、上記の条件を満たすものは「2<<32」のみです。「2<<32」は 2 となり、条件に合致します。

(※「2<<29」は 1073741824、「2<<30」は -2147483648、「2<<31」は 0、「2<<32」は 2となります。詳しくは「参考コードと出力結果2」を参照)

「-1」は負の数です。「Math.pow(2,-1)」は 0.5 で浮動小数点数です。「Math.pow(2,32)」は、0 から 232-1 の範囲をオーバーします。

そのため答えは、3番目の「new Array(2<<32)」になります。

// 参考コードと出力結果1
try {
    new Array(-1);
} catch(e) {
    console.log(e);  // Uncaught RangeError: Invalid array length
}

try {
    new Array(Math.pow(2,-1));
    // 「Math.pow(2,-1)」は「0.5」。
} catch(e) {
    console.log(e);  // Uncaught RangeError: Invalid array length
}

console.log("[" + new Array(2<<32) + "]");    // [,]
    // 「2<<32」は「2」。

try {
    new Array(Math.pow(2,32));
    // 「Math.pow(2,32)」は「4294967296」。
} catch(e) {
    console.log(e);  // Uncaught RangeError: Invalid array length
}
// 参考コードと出力結果2
var arr = [];
for (var i = 0; i < 34; i ++) {
    arr.push([i, "2 << " + i, 2 << i, (2 << i).toString(2)]);
}
console.table(arr);

/*
0  "2 << 0"  2           "10"
1  "2 << 1"  4           "100"
2  "2 << 2"  8           "1000"
3  "2 << 3"  16          "10000"
4  "2 << 4"  32          "100000"
5  "2 << 5"  64          "1000000"
6  "2 << 6"  128         "10000000"
7  "2 << 7"  256         "100000000"
8  "2 << 8"  512         "1000000000"
9  "2 << 9"  1024        "10000000000"
10 "2 << 10" 2048        "100000000000"
11 "2 << 11" 4096        "1000000000000"
12 "2 << 12" 8192        "10000000000000"
13 "2 << 13" 16384       "100000000000000"
14 "2 << 14" 32768       "1000000000000000"
15 "2 << 15" 65536       "10000000000000000"
16 "2 << 16" 131072      "100000000000000000"
17 "2 << 17" 262144      "1000000000000000000"
18 "2 << 18" 524288      "10000000000000000000"
19 "2 << 19" 1048576     "100000000000000000000"
20 "2 << 20" 2097152     "1000000000000000000000"
21 "2 << 21" 4194304     "10000000000000000000000"
22 "2 << 22" 8388608     "100000000000000000000000"
23 "2 << 23" 16777216    "1000000000000000000000000"
24 "2 << 24" 33554432    "10000000000000000000000000"
25 "2 << 25" 67108864    "100000000000000000000000000"
26 "2 << 26" 134217728   "1000000000000000000000000000"
27 "2 << 27" 268435456   "10000000000000000000000000000"
28 "2 << 28" 536870912   "100000000000000000000000000000"
29 "2 << 29" 1073741824  "1000000000000000000000000000000"
30 "2 << 30" -2147483648 "-10000000000000000000000000000000"
31 "2 << 31" 0           "0"
32 "2 << 32" 2           "10"
33 "2 << 33" 4           "100"
*/

参考:Array - JavaScript | MDN

参考:ビット演算子 - JavaScript | MDN

CodeIQ運営事務局より

柳井さん、ありがとうございました!
現在、柳井さんの最新問題が出題中です。
ぜひ挑戦してみてくださいね!

  • 4
  • このエントリーをはてなブックマークに追加

■この記事を書いた人

avatar

クロノス・クラウン合同会社 柳井政和

クロノス・クラウン合同会社 代表。ゲームやアプリを作ったり、プログラムを 書いたり、文章を書いたり、絵を描いたり。『マンガでわかるJavaScript』、 CodeIQの問題を解説付きでまとめた『プログラマのためのコードパズル~ JavaScriptで挑むコードゴルフとアルゴリズム』執筆。 twitter: @ruten Web Site: http://crocro.com/

■関連記事

【謎解きプログラム】解像度に対応せよ!【dpi】解答と解説... 【謎解きプログラム】解像度に対応せよ!【dpi】 本問題は、「解像度に対応せよ!」というテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されてい...
【選択式問題】JavaScript検定RPG String編 問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『String編』ということで、JavaScriptのStringについての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 文字列の特定の位置の文字を得る方法として、適切でないのはどれ? "ねこみみ"...
【選択式問題】JavaScript検定RPG ループ処理編 問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『ループ処理編』ということで、JavaScript のループ処理についての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 for (var i = 0, s = ""; i < 5; i++) s +=...
【選択式問題】JavaScript検定RPG 条件分岐編──問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『条件分岐編』ということで、JavaScript の条件分岐についての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 ifのあとに書き、条件に一致しない場合の処理を行う構文は何? elf dwarf ...
大人気ダンジョンシリーズ!IQのダンジョンの解説+最短コード発表 #javascript... IQのダンジョン 今回の ダンジョンは、以下のような問題でした。 【問題】 標準入力から得られる値は「」のような文字列です。この文字列を、配列として解釈した配列の各要素には、36進数(0,1,2~,x,y,z)の数値を表す文字列が入っています。 この配列の各要素を、36進数の数字として解釈し...
【選択式問題】JavaScript検定RPG Object編 問題解説 #javascript... 今回の問題 今回の『JavaScript検定RPG』は『Object編』ということで、JavaScriptのObjectについての問題が出題されました。 それでは以下、各問題とその解答を見ていきましょう。 問題1 オブジェクトを作る方法として正しいのはどれ? newObject() obj...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ