ガジェット通信 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’));
// 出力

1 2 3次のページ
CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。

山寺宏一&高木渉で『ポプテピピック』

GetNews girl / GetNews boy