ガジェット通信 GetNews

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

体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

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

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

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

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

問題のオープニング

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

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

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

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

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

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

問題1

配列のソートは、プログラムでよく見られる処理です。その際、ソートの比較を関数で指定して、並べ替えを制御する方法が、よく用いられます。

以下、プログラムはJavaScriptで書いていますが、内容自体は汎用的なものです。

下記のような入力と出力が行なわれる際、ソートの比較を行なう関数は、選択肢1~3のうち、どのような内容になるでしょうか?

0, 2, 3, 5, 6, 7, 8, 4, 1, 9
// 入力
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
// 出力

// プログラム
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {
// ソート
var res;
// 選択肢のコードは、ここに入る
return res;
// 戻り値
});
console.log(a.join(‘, ‘));
// 出力

// 選択肢1
res = b + a;

// 選択肢2
res = b – a;

// 選択肢3
res = b * a;

以下は、参考用のJavaScriptの数値のソートです。

// 数値のソート
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {return a – b});
// ソート
console.log(a.join(‘, ‘));
// 出力
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

多くのプログラミング言語では、配列のソートを行なう際に、Comparator(コンパレーター)などと呼ばれる、比較を専門に行なう関数を引数に取れるようになっています。そして、この関数の中で、どちらの要素が前で、どちらの要素が後かを判定し、順番を並べ替えます。

参考として挙げているJavaScriptのソートでは、a, bの2つの値を引数に取る関数(compareFunction)が、sort関数の引数として設定されています。

この引数の関数では、0未満の値を戻すと、aをbより前に移動します。0の場合は移動なし。0より大きい場合は、bをaより前に移動します。

上記では、2つの引数a, bを使い、「a – b」の計算結果を戻すことで、昇順で出力されています。「a – b」の計算を行なうことで、0未満の値、0、0より大きい値、が得られるわけです。

問題は、降順で出力されていますので、「a – b」とは逆の順番になっています。

そのため、「b – a」の計算結果を戻せばよいことになります。

というわけで、2番目の選択肢『res = b – a;』が答えになります。

以下、Webブラウザのコンソールで実行可能な、JavaScriptのコードを掲載しておきます。

// サンプルコード
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {
// ソート
var res;
res = b + a;
// 選択肢のコードは、ここに入る
return res;
// 戻り値
});
console.log(a.join(‘, ‘));
// 出力
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {
// ソート
var res;
res = b – a;
// 選択肢のコードは、ここに入る
return res;
// 戻り値
});
console.log(a.join(‘, ‘));
// 出力
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {
// ソート
var res;
res = b * a;
// 選択肢のコードは、ここに入る
return res;
// 戻り値
});
console.log(a.join(‘, ‘));
// 出力

// 出力
9, 1, 4, 8, 7, 6, 5, 3, 2, 0
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
0, 9, 1, 4, 8, 7, 6, 5, 3, 2

問題2

配列のソートは、プログラムでよく見られる処理です。その際、ソートの比較を関数で指定して、並べ替えを制御する方法が、よく用いられます。

以下、プログラムはJavaScriptで書いていますが、内容自体は汎用的なものです。

下記のような入力と出力が行なわれる際、ソートの比較を行なう関数は、選択肢1~3のうち、どのような内容になるでしょうか?

32, 53, 25, 46, 97, 78, 84, 11, 69
// 入力
11, 32, 53, 84, 25, 46, 97, 78, 69
// 出力

// プログラム
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {
// ソート
var res;
// 選択肢のコードは、ここに入る
return res;
// 戻り値
});
console.log(a.join(‘, ‘));
// 出力

// 選択肢1 (乗算)
res = a*10 – b*10;

// 選択肢2 (除算)
res = a/10 – b/10;

// 選択肢3 (剰余)
res = a%10 – b%10;

以下は、参考用のJavaScriptの数値のソートです。

// 数値のソート
var a = [0, 2, 3, 5, 6, 7, 8, 4, 1, 9];
// 入力
a.sort((a, b) => {return a – b});
// ソート
console.log(a.join(‘, ‘));
// 出力
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

出力結果の規則性を見つけられれば、すぐに解けます。下1桁でソートが行なわれています。

規則性を見つけられなくても、選択肢の計算の結果、どのようなソートが行なわれるかを考えれば、自ずと答えが出ます。

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