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
  • このエントリーをはてなブックマークに追加

■関連記事

数学の問題をプログラミングで解こう!「ストレート・ラインズ」問題解説... 問題のおさらい 2 以上の自然数 n に対し、n×n の格子状に並んだ点を考えます。 これらの点のうちちょうど 2 個の点を通る直線の数を F(n) と定義します。 例えば F(2)=6 です。題意を満たす直線は以下の 6 通りです。 また、F(3)=12 です。題意を満たす直線は以下の...
【謎解きプログラム】この処理は?【コードを読もう】解答と解説... 【謎解きプログラム】この処理は?【コードを読もう】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以...
数学の問題をプログラミングで解こう!「ループ・トラッキング」問題解説... 問題のおさらい 自然数 n に対し、関数 Fn(x) を次のように定義します(floor():床関数)。 例えば n=10, x=1 のとき、F10(1) = floor(4×1×9÷10) = 3 です。 さて、整数 k(0 ≦ k ≦ n)に対して、関数 Fn による変換を繰り返し行い...
【謎解きプログラム】どんな結果になる?【アロー関数】解答と解説... 【謎解きプログラム】どんな結果になる?【アロー関数】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間...
数学の問題をプログラミングで解こう!「カウント・スリー」問題解説... 問題のおさらい 自然数を 1 から順に書き並べていきます。 このとき、3 の数字が現れる回数を数えます。 自然数 n に対し、ちょうど n 個目の 3 の数字が現れたときに書いている数を F(n) と定義します。 例えば F(10)=35 です。 下の通り、10 個目の 3 は、35 を書いて...
【息抜き】カードを上手く並べよう【言語不問】解答と解説... 【息抜き】カードを上手く並べよう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 あなたは、11から99までの、89枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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