ガジェット通信 GetNews

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

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

DATE:
  • ガジェット通信 GetNewsを≫

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

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

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

問題のオープニング

ある日、出社すると、あなたの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まで幅広い業種・職種がラインナップしています。この機会にぜひご登録ください!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。