CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】解答と解説

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

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

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

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

【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】

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

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

問題のオープニング

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

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

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

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

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

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

問題1

配列を抽出や加工して、新しい配列を作る処理は、プログラムでよく見られます。

以下、プログラムはJavaScriptで書いていますが、内容自体は汎用的なものです。JavaScriptでは、配列の抽出はfilter、加工はmap関数で行えます。

下記のような入力と出力が行なわれる際、各処理は選択肢1~3のうち、どれになるでしょうか?

0, 2, 3, 5, 6, 7, 8, 4, 1, 9    // 入力
奇数3, 奇数5, 奇数7, 奇数1, 奇数9    // 出力
// 選択肢1
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.map(x => x % 2 == 1)
.filter(x => '奇数' + x);
console.log(a.join(', '));   // 出力

// 選択肢2
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.filter(x => x % 2 == 1)
.map(x => '奇数' + x);
console.log(a.join(', '));   // 出力

// 選択肢3
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.map(x => x % 2)
.filter(x => x);
console.log(a.join(', '));   // 出力

以下は、JavaScriptのmapやfilterの処理のサンプルです。参考にして下さい。

var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.filter(x => x >= 5)
.map(x => '5以上' + x);
console.log(a.join(', '));   // 出力
// 5以上5, 5以上6, 5以上7, 5以上8, 5以上9

mapでは、配列を元にして、新しい配列を作ります。filterは、戻り値の真偽で配列を絞り込み、新しい配列を作ります。

選択肢1

// 選択肢1
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.map(x => x % 2 == 1)
.filter(x => '奇数' + x);
console.log(a.join(', '));   // 出力

選択肢1では、最初のmapのところで、「[false, false, true, true, false, true, false, false, true, true]」という配列を作ります。

次のfilterの引数の関数では、文字列を戻しています。JavaScriptでは、空でない文字列はtrueと見なされますので、全ての要素をそのまま戻します。

そのため、「false, false, true, true, false, true, false, false, true, true」と出力することになります。

選択肢2

// 選択肢2
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.filter(x => x % 2 == 1)
.map(x => '奇数' + x);
console.log(a.join(', '));   // 出力

選択肢2では、最初のfilterの引数の関数で、「x % 2 == 1」がtrueになる条件で絞り込んでいます。ここでは、「[3, 5, 7, 1, 9]」という配列になります。

次のmapのところで、「’奇数’ + x」という文字列を作成しています。

そのため、「奇数3, 奇数5, 奇数7, 奇数1, 奇数9」と出力することになります。

選択肢3

// 選択肢3
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.map(x => x % 2)
.filter(x => x);
console.log(a.join(', '));   // 出力

選択肢3では、最初のmapのところで、「[0, 0, 1, 1, 0, 1, 0, 0, 1, 1]」という配列を作ります。

次のfilterの引数の関数では、値をそのまま判定しています。JavaScriptでは、0でない数値はtrueと見なされます。

そのため、「1, 1, 1, 1, 1」と出力することになります。

答え

選択肢2が答えになります。

問題2

配列を抽出や加工して、新しい配列を作る処理は、プログラムでよく見られます。

以下、プログラムはJavaScriptで書いていますが、内容自体は汎用的なものです。JavaScriptでは、配列の抽出はfilter、加工はmap関数で行えます。

下記のような入力と出力が行なわれる際、各処理は選択肢1~3のうち、どれになるでしょうか?

-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5    // 入力
3***         // 出力
5*****
6******
7*******
8********
4****
1*
9*********
// 選択肢1
var a = [-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5]   // 入力
.filter(x => x > 0)
.map(x => x + '*'.repeat(x));
console.log(a.join('\n'));   // 出力

// 選択肢2
var a = [-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5]   // 入力
.filter(x => x >= 0)
.map(x => '*'.repeat(x));
console.log(a.join('\n'));   // 出力

// 選択肢3
var a = [-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5]   // 入力
.filter(x => x >= 0)
.map(x => x + 1)
.map(x => x + '*'.repeat(x));
console.log(a.join('\n'));   // 出力

以下は、JavaScriptのmapやfilterの処理のサンプルです。参考にして下さい。

var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.filter(x => x >= 5)
.map(x => '5以上' + x);
console.log(a.join(', '));   // 出力
// 5以上5, 5以上6, 5以上7, 5以上8, 5以上9

mapでは、配列を元にして、新しい配列を作ります。filterは、戻り値の真偽で配列を絞り込み、新しい配列を作ります。repeatは、文字列を引数回繰り返します。

選択肢1

// 選択肢1
var a = [-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5]   // 入力
.filter(x => x > 0)
.map(x => x + '*'.repeat(x));
console.log(a.join('\n'));   // 出力

選択肢1では、最初のfilterの引数の関数で、「x >= 0」がtrueになる条件で絞り込んでいます。ここでは、「[3, 5, 6, 7, 8, 4, 1, 9]」という配列になります。

次のmapのところで、「x + ‘*’.repeat(x)」という文字列を作成しています。

そのため、以下のように出力することになります。

3***
5*****
6******
7*******
8********
4****
1*
9*********

選択肢2

// 選択肢2
var a = [-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5]   // 入力
.filter(x => x >= 0)
.map(x => '*'.repeat(x));
console.log(a.join('\n'));   // 出力

選択肢2では、最初のfilterの引数の関数で、「x >= 0」がtrueになる条件で絞り込んでいます。ここでは、「[0, 3, 5, 6, 7, 8, 4, 1, 9]」という配列になります。

次のmapのところで、「’*’.repeat(x)」という文字列を作成しています。

そのため、以下のように出力することになります。

***
*****
******
*******
********
****
*
*********

選択肢3

// 選択肢3
var a = [-1, 0, -2, 3, 5, 6, 7, 8, 4, 1, 9, -5]   // 入力
.filter(x => x >= 0)
.map(x => x + 1)
.map(x => x + '*'.repeat(x));
console.log(a.join('\n'));   // 出力

選択肢3では、最初のfilterの引数の関数で、「x >= 0」がtrueになる条件で絞り込んでいます。ここでは、「[0, 3, 5, 6, 7, 8, 4, 1, 9]」という配列になります。

次のmapのところで、「x + 1」という数値を作成しています。

次のmapのところで、「x + ‘*’.repeat(x)」という文字列を作成しています。

そのため、以下のように出力することになります。

1*
4****
6******
7*******
8********
9*********
5*****
2**
10**********

答え

選択肢1が答えになります。

問題3

配列を抽出や加工して、新しい配列を作る処理は、プログラムでよく見られます。

以下、プログラムはJavaScriptで書いていますが、内容自体は汎用的なものです。JavaScriptでは、配列の抽出はfilter、加工はmap関数で行えます。

下記のような入力と出力が行なわれる際、各処理は選択肢1~3のうち、どれになるでしょうか?

'dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger'    // 入力
monkey:6, elephant:8, tiger:5    // 出力
// 選択肢1
var a = ['dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger']   // 入力
.map(x => x + ':' + x.length)
.filter(x => x.length > 3);
console.log(a.join(', '));   // 出力

// 選択肢2
var a = ['dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger']   // 入力
.map(x => x.length)
.filter(x => 3)
.map(x => x + ':' + x.length);
console.log(a.join(', '));   // 出力

// 選択肢3
var a = ['dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger']   // 入力
.filter(x => x.length > 3)
.map(x => x + ':' + x.length);
console.log(a.join(', '));   // 出力

以下は、JavaScriptのmapやfilterの処理のサンプルです。参考にして下さい。

var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9]   // 入力
.filter(x => x >= 5)
.map(x => '5以上' + x);
console.log(a.join(', '));   // 出力
// 5以上5, 5以上6, 5以上7, 5以上8, 5以上9

mapでは、配列を元にして、新しい配列を作ります。filterは、戻り値の真偽で配列を絞り込み、新しい配列を作ります。lengthは、その文字列の長さを示します。

選択肢1

// 選択肢1
var a = ['dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger']   // 入力
.map(x => x + ':' + x.length)
.filter(x => x.length > 3);
console.log(a.join(', '));   // 出力

選択肢1では、最初のmapで、「[“dog:3”, “cat:3”, “monkey:6”, “elephant:8”, “cow:3”, “tiger:5”]」という配列を作ります。

次のfilterの引数の関数で、「x.length > 3」がtrueになる条件で絞り込んでいます。注意すべき点は、最初にmapで配列内の文字列を加工している(文字数を加えている)ので、文字列長が長くなっています。

そのため、「dog:3, cat:3, monkey:6, elephant:8, cow:3, tiger:5」のように出力することになります。

選択肢2

// 選択肢2
var a = ['dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger']   // 入力
.map(x => x.length)
.filter(x => 3)
.map(x => x + ':' + x.length);
console.log(a.join(', '));   // 出力

選択肢2では、最初のmapで、「[3, 3, 6, 8, 3, 5]」という配列を作ります。

次のfilterの引数の関数で、「3」がtrueになる条件で絞り込んでいます(3はtrueと見なされるので全部採用)。

最後のmapで、「x + ‘:’ + x.length」という文字列の配列を作ります。この時のxは、最初のmapで作成した文字列長(数値)です。数値にはlengthというプロパティはなく、undefinedになります。

そのため、「3:undefined, 3:undefined, 6:undefined, 8:undefined, 3:undefined, 5:undefined」のように出力することになります。

選択肢3

// 選択肢3
var a = ['dog', 'cat', 'monkey', 'elephant', 'cow', 'tiger']   // 入力
.filter(x => x.length > 3)
.map(x => x + ':' + x.length);
console.log(a.join(', '));   // 出力

選択肢3では、最初のfilterの引数の関数で、「x.length > 3」がtrueになる条件で絞り込んでいます。ここでは、「[“monkey”, “elephant”, “tiger”]」という配列になります。

次のmapのところで、「x + ‘:’ + x.length」という文字列を作成しています。

そのため、「monkey:6, elephant:8, tiger:5」のように出力することになります。

答え

選択肢3が答えになります。

CodeIQ運営事務局より

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

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

■関連記事

【息抜き】カードを上手く並べよう【言語不問】解答と解説... 【息抜き】カードを上手く並べよう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 あなたは、11から99までの、89枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス...
【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説... 【コードミステリ】数字に隠されたメッセージ【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。 それでは以下、問題とその解...
数学の問題をプログラミングで解こう!「ディバイド・アウト」問題解説... 問題のおさらい 自然数 n と素数 p に対し、n の階乗(n!)を p でこれ以上割り切れなくなるまで繰り返し割り、その商をさらに p で割ったときの余りを F(n, p) と定義します。 例えば F(12, 5)=4 です。 12!(=479001600)は 5 で最大 2 回割ることができ...
【息抜き】ファイル名を作ろう【言語不問】解答と解説... 【息抜き】ファイル名を作ろう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 ファイルをディレクトリ内に作成する際、同じ名前のファイルがあると、末尾に数字を付けるなどして同じ名前にならないようにします。 こうし...
【夏のミステリー】殺人現場のコード 解答と解説... 【夏のミステリー】殺人現場のコード 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 殺人現場にプログラマが倒れていて、途中までプログラムが書かれている。 「続きを書いて欲しい」 これはダイイングメッセージなのか? どう...
数学の問題をプログラミングで解こう!「キャンディ・アンド・チョコレート」問題解説... 問題のおさらい n 個のキャンディをグループに分けます。 グループの最大のキャンディの個数が k 個となるような分け方の数を F(n, k) と定義します。 例えば、F(8, 3)=5 です。このときの分け方を以下に示します。 なお個々のキャンディを区別せずに扱う点に注意してください。 同...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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