ガジェット通信 GetNews

見たことのないものを見に行こう
「ジャスティス・リーグ」特集サイト

【謎解きプログラム】どう比較する?【ソート】解答と解説

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

【謎解きプログラム】どう比較する?【ソート】

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

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

問題のオープニング

ある日、出社すると、あなたの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運営事務局より

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

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