CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】どんな結果になる?【アロー関数】解答と解説

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

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

言語不問で、プログラムにちなんだ謎を解く「謎解きプログラム」。

あなたは見事、謎を解けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

【謎解きプログラム】どんな結果になる?【アロー関数】

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

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

問題のオープニング

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

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

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

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

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

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

問題1

アロー関数は、最近のプログラミング言語ではよく見る記法です。この記法は、配列の反復メソッドと相性がよく、配列の加工に使われることが多いです。

以下の擬似コードを元に、変数resの中身がどのような配列になるか、当てて下さい。特に書いていない内容については、特殊ではない一般的なプログラミング言語のルールに従います。

● 擬似コードのルール

res = 0 …… 変数resに、数値0を入れる。
[5, 6, 7] …… 要素0が5、要素1が6、要素2が7の配列。
x => x …… アロー関数。「=>」の左辺が引数、右辺の計算結果が戻り値。
.map(関数) …… 関数の戻り値の要素の、新しい配列を作成。

● 問題

res = [10, 20, 30, 40, 50].map(x => x * x);

● 選択肢

// 選択肢1
[10, 20, 30, 40, 50]

// 選択肢2
[20, 40, 60, 80, 100]

// 選択肢3
[100, 400, 900, 1600, 2500]

// 選択肢4
[1000, 8000, 27000, 64000, 125000]

「x => x * x」の部分は以下のとおりです。

左辺「x」:各要素を取る引数。
右辺「x * x」:この計算結果が戻り値。各要素の2乗。

「.map()」により、この戻り値の配列が作られます。そのため、変数「res」に格納される配列は、元の配列の各要素を2乗したものになります。

[10, 20, 30, 40, 50]
↓
各要素を2乗
↓
[100, 400, 900, 1600, 2500]

というわけで、答えは選択肢3の「[100, 400, 900, 1600, 2500]」になります。

以下、JavaScriptによるサンプルコードです。Webブラウザのコンソールで実行できます。

res = [10, 20, 30, 40, 50].map(x => x * x);
console.log(res);

問題2

以下の擬似コードを元に、変数resの中身がどのような配列になるか、当てて下さい。

● 擬似コードのルール

res = 0 …… 変数resに、数値0を入れる。
10 % 2 …… 10を2で割った余り。
[5, 6, 7] …… 要素0が5、要素1が6、要素2が7の配列。
x => x == 0 …… アロー関数。「=>」の左辺が引数、右辺の計算結果が戻り値。
.filter(関数) …… 関数の戻り値が真の要素だけの、新しい配列を作成。

● 問題

res = [11, 22, 33, 44, 55].filter(x => x % 2 == 0);

● 選択肢

// 選択肢1
[11, 22, 33, 44, 55]

// 選択肢2
[1, 2, 3, 4, 5]

// 選択肢3
[2, 4]

// 選択肢4
[22, 44]

「x => x % 2 == 0」の部分は以下のとおりです。

左辺「x」:各要素を取る引数。
右辺「x % 2 == 0」:この計算結果が戻り値。各要素を2で割った値が0(偶数)ならtrue、それ以外(奇数)ならfalse。

「.filter()」により、trueを戻した要素のみの配列が作られます。そのため、変数「res」に格納される配列は、元の配列の各要素の中から、偶数のものになります。

[11, 22, 33, 44, 55]
↓
偶数のみ
↓
[22, 44]

というわけで、答えは選択肢4の「[22, 44]」になります。

以下、JavaScriptによるサンプルコードです。Webブラウザのコンソールで実行できます。

res = [11, 22, 33, 44, 55].filter(x => x % 2 == 0);
console.log(res);

問題3

以下の擬似コードを元に、変数resの中身がどのような配列になるか、当てて下さい。

● 擬似コードのルール

res = 0 …… 変数resに、数値0を入れる。
10 % 2 …… 10を2で割った余り。
[5, 6, 7] …… 要素0が5、要素1が6、要素2が7の配列。
x => x …… アロー関数。「=>」の左辺が引数、右辺の計算結果が戻り値。
.map(関数) …… 関数の戻り値の要素の、新しい配列を作成。
.filter(関数) …… 関数の戻り値が真の要素だけの、新しい配列を作成。

● 問題

res = [11, 22, 33, 44, 55]
    .map(x => x % 10 * 10)
    .filter(x => x % 4 == 0);

● 選択肢

// 選択肢1
[11, 33, 55]

// 選択肢2
[10, 30, 50]

// 選択肢3
[1, 3, 5]

// 選択肢4
[22, 44]

// 選択肢5
[20, 40]

// 選択肢6
[2, 4]

まずは、「.map()」から処理です。「x => x % 10 * 10」の部分は以下のとおりです。

左辺「x」:各要素を取る引数。
右辺「x % 10 * 10」:この計算結果が戻り値。各要素を10で割った余りに、10を掛けた値。

「.map()」により、この戻り値の配列が作られます。ここで生成される配列は、以下になります。

[11, 22, 33, 44, 55]
↓
x % 10 * 10
↓
[10, 20, 30, 40, 50]

次は、「.filter()」の処理です。先ほどの計算結果「[10, 20, 30, 40, 50]」の配列に対して処理を行ないます。「x => x % 4 == 0」の部分は以下のとおりです。

左辺「x」:各要素を取る引数。
右辺「x % 4 == 0」:この計算結果が戻り値。各要素を4で割った値が0ならtrue、それ以外ならfalse。

「.filter()」により、trueを戻した要素のみの配列が作られます。そのため、変数「res」に格納される配列は、以下になります。

[10, 20, 30, 40, 50]
↓
4で割った余りが0の場合のみ
↓
[20, 40]

というわけで、答えは選択肢5の「[20, 40]」になります。

以下、JavaScriptによるサンプルコードです。Webブラウザのコンソールで実行できます。

res = [11, 22, 33, 44, 55]
    .map(x => x % 10 * 10)
    .filter(x => x % 4 == 0);
console.log(res);

CodeIQ運営事務局より

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

【PR】あなたの本当の評価がわかる!年収確約サービス「moffers」

登録した詳細な経験・スキル情報に基づき、企業が「年収」を明示した形でスカウトを行う、ITエンジニアのための転職サービス「moffers」がオープンしました!

あなたの本当の評価がわかる「moffers」に登録してみませんか?

【moffers参加企業】
日産自動車、富士通、本田技術研究所、三菱電機、サイバーエージェント、ソニーネットワークコミュニケーションズ、リクルートテクノロジーズ、アマゾン ウェブ サービス ジャパン(AWS)、ほか

WebからIoT、自動運転、AIまで幅広い業種・職種がラインナップしています。この機会にぜひご登録ください!

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

■関連記事

【謎解きプログラム】この処理は?【コードを読もう】解答と解説... 【謎解きプログラム】この処理は?【コードを読もう】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以...
数学の問題をプログラミングで解こう!「ループ・トラッキング」問題解説... 問題のおさらい 自然数 n に対し、関数 Fn(x) を次のように定義します(floor():床関数)。 例えば n=10, x=1 のとき、F10(1) = floor(4×1×9÷10) = 3 です。 さて、整数 k(0 ≦ k ≦ n)に対して、関数 Fn による変換を繰り返し行い...
数学の問題をプログラミングで解こう!「カウント・スリー」問題解説... 問題のおさらい 自然数を 1 から順に書き並べていきます。 このとき、3 の数字が現れる回数を数えます。 自然数 n に対し、ちょうど n 個目の 3 の数字が現れたときに書いている数を F(n) と定義します。 例えば F(10)=35 です。 下の通り、10 個目の 3 は、35 を書いて...
【息抜き】カードを上手く並べよう【言語不問】解答と解説... 【息抜き】カードを上手く並べよう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 あなたは、11から99までの、89枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス...
【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説... 【コードミステリ】数字に隠されたメッセージ【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。 それでは以下、問題とその解...
数学の問題をプログラミングで解こう!「ディバイド・アウト」問題解説... 問題のおさらい 自然数 n と素数 p に対し、n の階乗(n!)を p でこれ以上割り切れなくなるまで繰り返し割り、その商をさらに p で割ったときの余りを F(n, p) と定義します。 例えば F(12, 5)=4 です。 12!(=479001600)は 5 で最大 2 回割ることができ...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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