CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】座標の移動【Matrix】解答と解説

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

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

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

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

【謎解きプログラム】座標の移動【Matrix】

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

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

問題のオープニング

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

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

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

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

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

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

問題1

行列を利用した座標の変換は、プログラムではよく行なわれます。

X,Yで表される2次元座標を、指定の方法で変換する行列演算を、選択肢から選んでください。

● 座標と変換

座標:X は 12, Y は16。
変換:X方向に 3, Y方向に 4。

● 選択肢

// 行列演算1
┏     ┓┏  ┓ ┏ ┓
┃3 0 0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃0 4 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

// 行列演算2
┏     ┓┏  ┓ ┏ ┓
┃1 0 3┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃0 1 4┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

// 行列演算3
┏     ┓┏  ┓ ┏ ┓
┃1 0 0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃0 1 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃3 4 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

● 答え

まず、問題文から移動後の座標を計算してみましょう。

X は 12 → X方向に 3 移動 → X は 15
Y は 16 → Y方向に 4 移動 → Y は 20

また、行列の計算方法を示します。

// 行列の計算方法
┏        ┓┏ ┓ ┏                        ┓
┃a0 a1 a2┃┃X┃ ┃a0 * X + a1 * Y + a2 * Z┃
┃b0 b1 b2┃┃Y┃=┃b0 * X + b1 * Y + b2 * Z┃
┃c0 c1 c2┃┃Z┃ ┃c0 * X + c1 * Y + c2 * Z┃
┗        ┛┗ ┛ ┗                        ┛

その上で、各選択肢の行列演算を実際に解いてみます。

// 行列演算1
┏     ┓┏  ┓ ┏                 ┓ ┏           ┓ ┏  ┓
┃3 0 0┃┃12┃ ┃3*12 + 0*16 + 0*1┃ ┃36 +  0 + 0┃ ┃36┃ ← X座標
┃0 4 0┃┃16┃=┃0*12 + 4*16 + 0*1┃=┃ 0 + 64 + 0┃=┃64┃ ← Y座標
┃0 0 1┃┃ 1┃ ┃0*12 + 0*16 + 1*1┃ ┃ 0 +  0 + 1┃ ┃ 1┃
┗     ┛┗  ┛ ┗                 ┛ ┗           ┛ ┗  ┛

// 行列演算2
┏     ┓┏  ┓ ┏                 ┓ ┏           ┓ ┏  ┓
┃1 0 3┃┃12┃ ┃1*12 + 0*16 + 3*1┃ ┃12 +  0 + 3┃ ┃15┃ ← X座標
┃0 1 4┃┃16┃=┃0*12 + 1*16 + 4*1┃=┃ 0 + 16 + 4┃=┃20┃ ← Y座標
┃0 0 1┃┃ 1┃ ┃0*12 + 0*16 + 1*1┃ ┃ 0 +  0 + 1┃ ┃ 1┃
┗     ┛┗  ┛ ┗                 ┛ ┗           ┛ ┗  ┛

// 行列演算3
┏     ┓┏  ┓ ┏                 ┓ ┏           ┓ ┏   ┓
┃1 0 0┃┃12┃ ┃1*12 + 0*16 + 0*1┃ ┃12 +  0 + 0┃ ┃ 12┃ ← X座標
┃0 1 0┃┃16┃=┃0*12 + 1*16 + 0*1┃=┃ 0 + 16 + 0┃=┃ 16┃ ← Y座標
┃3 4 1┃┃ 1┃ ┃3*12 + 4*16 + 1*1┃ ┃36 + 64 + 1┃ ┃101┃
┗     ┛┗  ┛ ┗                 ┛ ┗           ┛ ┗   ┛

というわけで、答えは選択肢2の「行列演算2」になります。今回のような移動は、X, Yの移動量をtx, tyとすると、以下の行列になります。

// 移動
┏      ┓
┃1 0 tx┃
┃0 1 ty┃
┃0 0  1┃
┗      ┛

以下、JavaScriptで確認するコードを掲載しておきます。以降の問題で、evalCode関数は共通です。

● 確認コード

// 計算実行用関数
var evalCode = function(s) {
    console.log(s);
    s = s.replace(/^\n+|\n+$/g, '')
    s = s.replace(/\/\/.+$/gm, '')
    s = s.replace(/\/\*.+?\*\//g, '')
    if (s.length === 0) {return}

    s = s.replace(/(PI|cos|sin)/g, 'Math.$1')

    var arr = s.match(/[\d\w\(\)\.\-\+\*\/\%]+/g);

    var arr2 = [
        `${arr[0]}*${arr[3]} + ${arr[1]}*${arr[7]} + ${arr[2]}*${arr[11]}`,
        `${arr[4]}*${arr[3]} + ${arr[5]}*${arr[7]} + ${arr[6]}*${arr[11]}`,
        `${arr[8]}*${arr[3]} + ${arr[9]}*${arr[7]} + ${arr[10]}*${arr[11]}`
    ];
    var arr3 = arr2.map(x => {
        return Math.round(eval(x));
    });

    console.log(arr2.join('\n') + '\n');
    arr3[0] += ' ← X座標';
    arr3[1] += ' ← Y座標';
    console.log(arr3.join('\n'));
    console.log('-'.repeat(40));
};

evalCode(`
// 行列演算1
┏     ┓┏  ┓ ┏ ┓
┃3 0 0┃┃12┃ ┃?┃/* ← X座標 */
┃0 4 0┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛
`);

evalCode(`
// 行列演算2
┏     ┓┏  ┓ ┏ ┓
┃1 0 3┃┃12┃ ┃?┃/* ← X座標 */
┃0 1 4┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛
`);

evalCode(`
// 行列演算3
┏     ┓┏  ┓ ┏ ┓
┃1 0 0┃┃12┃ ┃?┃/* ← X座標 */
┃0 1 0┃┃16┃=┃?┃/* ← Y座標 */
┃3 4 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛
`);

● 出力結果

// 行列演算1
┏     ┓┏  ┓ ┏ ┓
┃3 0 0┃┃12┃ ┃?┃/* ← X座標 */
┃0 4 0┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

3*12 + 0*16 + 0*1
0*12 + 4*16 + 0*1
0*12 + 0*16 + 1*1

36 ← X座標
64 ← Y座標
1
----------------------------------------

// 行列演算2
┏     ┓┏  ┓ ┏ ┓
┃1 0 3┃┃12┃ ┃?┃/* ← X座標 */
┃0 1 4┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

1*12 + 0*16 + 3*1
0*12 + 1*16 + 4*1
0*12 + 0*16 + 1*1

15 ← X座標
20 ← Y座標
1
----------------------------------------

// 行列演算3
┏     ┓┏  ┓ ┏ ┓
┃1 0 0┃┃12┃ ┃?┃/* ← X座標 */
┃0 1 0┃┃16┃=┃?┃/* ← Y座標 */
┃3 4 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

1*12 + 0*16 + 0*1
0*12 + 1*16 + 0*1
3*12 + 4*16 + 1*1

12 ← X座標
16 ← Y座標
101
----------------------------------------

問題2

行列を利用した座標の変換は、プログラムではよく行なわれます。

X,Yで表される2次元座標を、指定の方法で変換する行列演算を、選択肢から選んでください。

● 座標と変換

座標:X は 12, Y は16。
変換:原点に対して、X方向に 3倍, Y方向に 2倍。

● 選択肢

// 行列演算1
┏     ┓┏  ┓ ┏ ┓
┃1 0 3┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃0 1 2┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

// 行列演算2
┏     ┓┏  ┓ ┏ ┓
┃1 3 0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃2 1 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

// 行列演算3
┏     ┓┏  ┓ ┏ ┓
┃3 0 0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃0 2 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

● 答え

まず、問題文から移動後の座標を計算してみましょう。

X は 12 → 原点に対して X 方向に 3倍 → X は 36
Y は 16 → 原点に対して Y 方向に 2倍 → Y は 32

その上で、各選択肢の行列演算を実際に解いてみます。

// 行列演算1
┏     ┓┏  ┓ ┏                 ┓ ┏           ┓ ┏  ┓
┃1 0 3┃┃12┃ ┃1*12 + 0*16 + 3*1┃ ┃12 +  0 + 3┃ ┃15┃ ← X座標
┃0 1 2┃┃16┃=┃0*12 + 1*16 + 2*1┃=┃ 0 + 16 + 2┃=┃18┃ ← Y座標
┃0 0 1┃┃ 1┃ ┃0*12 + 0*16 + 1*1┃ ┃ 0 +  0 + 1┃ ┃ 1┃
┗     ┛┗  ┛ ┗                 ┛ ┗           ┛ ┗  ┛

// 行列演算2
┏     ┓┏  ┓  ┏                 ┓ ┏           ┓ ┏  ┓
┃1 3 0┃┃12┃  ┃1*12 + 3*16 + 0*1┃ ┃12 + 48 + 0┃ ┃60┃ ← X座標
┃2 1 0┃┃16┃==┃2*12 + 1*16 + 0*1┃=┃24 + 16 + 0┃=┃40┃ ← Y座標
┃0 0 1┃┃ 1┃  ┃0*12 + 0*16 + 1*1┃ ┃ 0 +  0 + 1┃ ┃ 1┃
┗     ┛┗  ┛  ┗                 ┛ ┗           ┛ ┗  ┛

// 行列演算3
┏     ┓┏  ┓ ┏                 ┓ ┏           ┓ ┏  ┓
┃3 0 0┃┃12┃ ┃3*12 + 0*16 + 0*1┃ ┃36 +  0 + 0┃ ┃36┃ ← X座標
┃0 2 0┃┃16┃=┃0*12 + 2*16 + 0*1┃=┃ 0 + 32 + 0┃=┃32┃ ← Y座標
┃0 0 1┃┃ 1┃ ┃0*12 + 0*16 + 1*1┃ ┃ 0 +  0 + 1┃ ┃ 1┃
┗     ┛┗  ┛ ┗                 ┛ ┗           ┛ ┗  ┛

というわけで、答えは選択肢3の「行列演算3」になります。今回のような拡大縮小は、X, Yの比率をsx, syとすると、以下の行列になります。

// 拡大縮小
┏       ┓
┃sx 0  0┃
┃0  sy 0┃
┃0  0  1┃
┗       ┛

以下、JavaScriptで確認するコードを掲載しておきます。evalCode関数は問題1と共通です。

● 確認コード

evalCode(`
// 行列演算1
┏     ┓┏  ┓ ┏ ┓
┃1 0 3┃┃12┃ ┃?┃/* ← X座標 */
┃0 1 2┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛
`);

evalCode(`
// 行列演算2
┏     ┓┏  ┓ ┏ ┓
┃1 3 0┃┃12┃ ┃?┃/* ← X座標 */
┃2 1 0┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛
`);

evalCode(`
// 行列演算3
┏     ┓┏  ┓ ┏ ┓
┃3 0 0┃┃12┃ ┃?┃/* ← X座標 */
┃0 2 0┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛
`);

● 出力結果

// 行列演算1
┏     ┓┏  ┓ ┏ ┓
┃1 0 3┃┃12┃ ┃?┃/* ← X座標 */
┃0 1 2┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

1*12 + 0*16 + 3*1
0*12 + 1*16 + 2*1
0*12 + 0*16 + 1*1

15 ← X座標
18 ← Y座標
1
----------------------------------------

// 行列演算2
┏     ┓┏  ┓ ┏ ┓
┃1 3 0┃┃12┃ ┃?┃/* ← X座標 */
┃2 1 0┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

1*12 + 3*16 + 0*1
2*12 + 1*16 + 0*1
0*12 + 0*16 + 1*1

60 ← X座標
40 ← Y座標
1
----------------------------------------

// 行列演算3
┏     ┓┏  ┓ ┏ ┓
┃3 0 0┃┃12┃ ┃?┃/* ← X座標 */
┃0 2 0┃┃16┃=┃?┃/* ← Y座標 */
┃0 0 1┃┃ 1┃ ┃?┃
┗     ┛┗  ┛ ┗ ┛

3*12 + 0*16 + 0*1
0*12 + 2*16 + 0*1
0*12 + 0*16 + 1*1

36 ← X座標
32 ← Y座標
1
----------------------------------------

問題3

行列を利用した座標の変換は、プログラムではよく行なわれます。

X,Yで表される2次元座標を、指定の方法で変換する行列演算を、選択肢から選んでください。

● 座標と変換

座標:X は 12, Y は16。
変換:原点に対して、1/2Π 回転。
特記:ΠはPI、コサインはcos()、サインはsin()と表記。

● 選択肢

// 行列演算1
┏                     ┓┏  ┓ ┏ ┓
┃cos(PI/2) 0         0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃0         sin(PI/2) 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0         0         1┃┃ 1┃ ┃?┃
┗                     ┛┗  ┛ ┗ ┛

// 行列演算2
┏                      ┓┏  ┓ ┏ ┓
┃cos(PI/2) -sin(PI/2) 0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃sin(PI/2)  cos(PI/2) 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0          0         1┃┃ 1┃ ┃?┃
┗                      ┛┗  ┛ ┗ ┛

// 行列演算3
┏                     ┓┏  ┓ ┏ ┓
┃cos(PI/2) sin(PI/2) 0┃┃12┃ ┃?┃ ← 1つ目の?は変換後のX座標
┃sin(PI/2) cos(PI/2) 0┃┃16┃=┃?┃ ← 2つ目の?は変換後のY座標
┃0         0         1┃┃ 1┃ ┃?┃
┗                     ┛┗  ┛ ┗ ┛

● 答え

まず、問題文から移動後の座標を計算してみましょう。

X は 12 → 原点に対して 1/2Π 回転 → 原点に対して 90 度回転 → X は -16
Y は 16 → 原点に対して 1/2Π 回転 → 原点に対して 90 度回転 → Y は 12

その上で、各選択肢の行列演算を実際に解いてみます。

// 行列演算1
┏                     ┓┏  ┓ ┏                 ┓ ┏          ┓ ┏  ┓
┃cos(PI/2) 0         0┃┃12┃ ┃0*12 + 0*16 + 0*1┃ ┃0 +  0 + 0┃ ┃ 0┃ ← X座標
┃0         sin(PI/2) 0┃┃16┃=┃0*12 + 1*16 + 0*1┃=┃0 + 16 + 0┃=┃16┃ ← Y座標
┃0         0         1┃┃ 1┃ ┃0*12 + 0*16 + 1*1┃ ┃0 +  0 + 1┃ ┃ 1┃
┗                     ┛┗  ┛ ┗                 ┛ ┗          ┛ ┗  ┛

// 行列演算2
┏                      ┓┏  ┓  ┏                  ┓ ┏            ┓ ┏   ┓
┃cos(PI/2) -sin(PI/2) 0┃┃12┃  ┃0*12 + -1*16 + 0*1┃ ┃ 0 + -16 + 0┃ ┃-16┃ ← X座標
┃sin(PI/2)  cos(PI/2) 0┃┃16┃==┃1*12 +  0*16 + 0*1┃=┃12 +   0 + 0┃=┃ 12┃ ← Y座標
┃0          0         1┃┃ 1┃  ┃0*12 +  0*16 + 1*1┃ ┃ 0 +   0 + 1┃ ┃  1┃
┗                      ┛┗  ┛  ┗                  ┛ ┗            ┛ ┗   ┛

// 行列演算3
┏                     ┓┏  ┓ ┏                 ┓ ┏           ┓ ┏  ┓
┃cos(PI/2) sin(PI/2) 0┃┃12┃ ┃0*12 + 1*16 + 0*1┃ ┃ 0 + 16 + 0┃ ┃16┃ ← X座標
┃sin(PI/2) cos(PI/2) 0┃┃16┃=┃1*12 + 0*16 + 0*1┃=┃12 +  0 + 0┃=┃12┃ ← Y座標
┃0         0         1┃┃ 1┃ ┃0*12 + 0*16 + 1*1┃ ┃ 0 +  0 + 1┃ ┃ 1┃
┗                     ┛┗  ┛ ┗                 ┛ ┗           ┛ ┗  ┛

というわけで、答えは選択肢2の「行列演算2」になります。今回のような回転は、回転をrとすると、以下の行列になります。

// 回転
┏                ┓
┃cos(r) -sin(r) 0┃
┃sin(r)  cos(r) 0┃
┃0       0      1┃
┗                ┛

以下、JavaScriptで確認するコードを掲載しておきます。evalCode関数は問題1と共通です。

● 確認コード

eevalCode(`
// 行列演算1
┏                     ┓┏  ┓ ┏ ┓
┃cos(PI/2) 0         0┃┃12┃ ┃?┃/* ← X座標 */
┃0         sin(PI/2) 0┃┃16┃=┃?┃/* ← Y座標 */
┃0         0         1┃┃ 1┃ ┃?┃
┗                     ┛┗  ┛ ┗ ┛
`);

evalCode(`
// 行列演算2
┏                      ┓┏  ┓ ┏ ┓
┃cos(PI/2) -sin(PI/2) 0┃┃12┃ ┃?┃/* ← X座標 */
┃sin(PI/2)  cos(PI/2) 0┃┃16┃=┃?┃/* ← Y座標 */
┃0          0         1┃┃ 1┃ ┃?┃
┗                      ┛┗  ┛ ┗ ┛
`);

evalCode(`
// 行列演算3
┏                     ┓┏  ┓ ┏ ┓
┃cos(PI/2) sin(PI/2) 0┃┃12┃ ┃?┃/* ← X座標 */
┃sin(PI/2) cos(PI/2) 0┃┃16┃=┃?┃/* ← Y座標 */
┃0         0         1┃┃ 1┃ ┃?┃
┗                     ┛┗  ┛ ┗ ┛
`);

● 出力結果

// 行列演算1
┏                     ┓┏  ┓ ┏ ┓
┃cos(PI/2) 0         0┃┃12┃ ┃?┃/* ← X座標 */
┃0         sin(PI/2) 0┃┃16┃=┃?┃/* ← Y座標 */
┃0         0         1┃┃ 1┃ ┃?┃
┗                     ┛┗  ┛ ┗ ┛

Math.cos(Math.PI/2)*12 + 0*16 + 0*1
0*12 + Math.sin(Math.PI/2)*16 + 0*1
0*12 + 0*16 + 1*1

0 ← X座標
16 ← Y座標
1
----------------------------------------

// 行列演算2
┏                      ┓┏  ┓ ┏ ┓
┃cos(PI/2) -sin(PI/2) 0┃┃12┃ ┃?┃/* ← X座標 */
┃sin(PI/2)  cos(PI/2) 0┃┃16┃=┃?┃/* ← Y座標 */
┃0          0         1┃┃ 1┃ ┃?┃
┗                      ┛┗  ┛ ┗ ┛

Math.cos(Math.PI/2)*12 + -Math.sin(Math.PI/2)*16 + 0*1
Math.sin(Math.PI/2)*12 + Math.cos(Math.PI/2)*16 + 0*1
0*12 + 0*16 + 1*1

-16 ← X座標
12 ← Y座標
1
----------------------------------------

// 行列演算3
┏                     ┓┏  ┓ ┏ ┓
┃cos(PI/2) sin(PI/2) 0┃┃12┃ ┃?┃/* ← X座標 */
┃sin(PI/2) cos(PI/2) 0┃┃16┃=┃?┃/* ← Y座標 */
┃0         0         1┃┃ 1┃ ┃?┃
┗                     ┛┗  ┛ ┗ ┛

Math.cos(Math.PI/2)*12 + Math.sin(Math.PI/2)*16 + 0*1
Math.sin(Math.PI/2)*12 + Math.cos(Math.PI/2)*16 + 0*1
0*12 + 0*16 + 1*1

16 ← X座標
12 ← Y座標
1
----------------------------------------

CodeIQ運営事務局より

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

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

■関連記事

【謎解きプログラム】どう防ぐ?【無限ループ】解答と解説... 【謎解きプログラム】どう防ぐ?【無限ループ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に謎...
数学の問題をプログラミングで解こう!「タワー・ビルディング」問題解説... 問題のおさらい A を一辺が 1 の立方体のブロックとし、B を縦が 1、横が 1、高さが 2 の直方体のブロックとします。 (下は横から見た図です。) 自然数 n, a, b に対し、A を最大 a 個、B を最大 b 個使って、縦が 1、横が 1、高さが n の直方体の塔を作ります。 こ...
【謎解きプログラム】正しいコードは?【一人すごろく】解答と解説... 【謎解きプログラム】正しいコードは?【一人すごろく】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間...
数学の問題をプログラミングで解こう!「ペア・ドロップ」問題解説... 問題のおさらい n を自然数とします。1 から n までの自然数が 1 つずつ書かれた n 枚のカードが 2 組あります。 これら 2n 枚のカードをよく混ぜ、A と B の 2 人に n 枚ずつ配ります。 A と B は、それぞれ自分の持ち札の中に番号が一致するカードがあればその 2 枚を捨...
【謎解きプログラム】中身はどうなる?【出し入れ】解答と解説... 【謎解きプログラム】中身はどうなる?【出し入れ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内...
数学の問題をプログラミングで解こう!「ストレート・ラインズ」問題解説... 問題のおさらい 2 以上の自然数 n に対し、n×n の格子状に並んだ点を考えます。 これらの点のうちちょうど 2 個の点を通る直線の数を F(n) と定義します。 例えば F(2)=6 です。題意を満たす直線は以下の 6 通りです。 また、F(3)=12 です。題意を満たす直線は以下の...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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