CodeIQ MAGAZINECodeIQ MAGAZINE

【謎解きプログラム】解像度に対応せよ!【dpi】解答と解説

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

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

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

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

【謎解きプログラム】解像度に対応せよ!【dpi】

本問題は、「解像度に対応せよ!」というテーマで、プログラムにちなんだ謎を解くというものでした。

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

問題のオープニング

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

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

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

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

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

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

説明

解像度に対応せよ!

画面には、画像ファイルについての情報が示されています。

dpiやピクセル数、実サイズなどを変えることで、他の値がどのように変わるかを当ててください。

問題1

提示情報
  ピクセル数:幅 640、高さ 480
  実サイズ(cm): 幅 5.42、高さ 4.06
  解像度(dpi):300
変更する値
  解像度(dpi):300  → 150
  (解像度を変更するだけなので、実サイズは変わらず)
求める値
  ピクセル数:幅 ?、高さ ?

// 選択肢
ピクセル数:幅 640、高さ 480
ピクセル数:幅 1280、高さ 960
ピクセル数:幅 320、高さ 240

解像度は、ディスプレイやビットマップ画像、プリンターやスキャナーで扱う画像の精細さです。この解像度は、画素(ドット、ピクセル)の数で表します。

dpiは、ドット・パー・インチの略です。1インチ(2.54cm)の中に、どれだけの画素があるかがdpiになり、この値が大きいほど精細になります。

以下、dpiの簡単な式を示します。全て、同じ式を変形したものです。

ピクセル数 / 解像度(dpi) = 実サイズ(インチ)

解像度(dpi) * 実サイズ(インチ) = ピクセル数

ピクセル数 / 実サイズ(インチ) = 解像度(dpi)

問題では、実サイズを変えずに、解像度を半分にしています。

解像度(半分)、実サイズ(固定)

「解像度 * 実サイズ = ピクセル数」なので、等式を成り立たせるためには、ピクセル数を半分にしなければなりません。

解像度(半分) * 実サイズ(固定) = ピクセル数(半分)

そのため、3番目の選択肢の『ピクセル数:幅 320、高さ 240』が答えになります。

Javaサンプル

以下、サンドボックス(言語は「Java8」)で、実行確認できるコードを示します。コード欄に、下記のコードをコピペして、INPUTは空で、RUNボタンを押してください。

// 参考コード
import java.lang.Math;

class Main{
    static final double inch = 2.54;

    // main
    public static void main(String[]args) throws Exception {
        // 提示情報
        double cmW = 5.42;
        double cmH = 4.06;

        // 計算
        int dpi = 150;
        int pxlW = (int)Math.round(cmW * dpi / inch);
        int pxlH = (int)Math.round(cmH * dpi / inch);

        // 出力
        System.out.println("pxlW : " + pxlW);
        System.out.println("pxlH : " + pxlH);
    }
}
// 出力
pxlW : 320
pxlH : 240

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

var inch = 2.54;

// 提示情報
var cmW = 5.42;
var cmH = 4.06;
var dpi = 150;

// 計算
var pxlW = Math.round(cmW * dpi / inch);
var pxlH = Math.round(cmH * dpi / inch);

// 出力
console.log("pxlW : " + pxlW);
console.log("pxlH : " + pxlH);
// 出力
pxlW : 320
pxlH : 240

問題2

提示情報
  ピクセル数:幅 900、高さ 300
  実サイズ(cm): 幅 7.62、高さ 2.54
  解像度(dpi):300
変更する値
  ピクセル数:幅 900、高さ 300 → 幅 300、高さ 100
  (ピクセル数を変更するだけで、実サイズは変更せず)
求める値
  解像度(dpi):?

// 選択肢
解像度(dpi):300
解像度(dpi):900
解像度(dpi):100

問題では、実サイズを変えずに、ピクセル数を1/3にしています。

ピクセル数(1/3)、実サイズ(固定)

「ピクセル数 / 実サイズ = 解像度」なので、等式を成り立たせるためには、解像度を1/3にしなければなりません。

ピクセル数(1/3) * 実サイズ(固定) = 解像度(1/3)

そのため、3番目の選択肢の『解像度(dpi):100』が答えになります。

Javaサンプル

以下、サンドボックス(言語は「Java8」)で、実行確認できるコードを示します。コード欄に、下記のコードをコピペして、INPUTは空で、RUNボタンを押してください。

// 参考コード
import java.lang.Math;

class Main{
    static final double inch = 2.54;

    // main
    public static void main(String[]args) throws Exception {
        // 提示情報
        double cmW = 7.62;

        // 計算
        int pxlW = 300;
        int dpi = (int)Math.round(pxlW / cmW * inch);

        // 出力
        System.out.println("dpi : " + dpi);
    }
}
// 出力
dpi : 100

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

var inch = 2.54;

// 提示情報
var cmW = 7.62;

// 計算
var pxlW = 300;
var dpi = Math.round(pxlW / cmW * inch);

// 出力
console.log("dpi : " + dpi);
// 出力
dpi : 100

問題3

提示情報
  ピクセル数:幅 640、高さ 480
  実サイズ(cm): 幅 5.42、高さ 4.06
  解像度(dpi):300
変更する値
  解像度(dpi):300  → 600
求める値
  ピクセル数:幅 ?、高さ ?
  実サイズ(cm): 幅 ?、高さ ?

// 選択肢
ピクセル数:幅 640、高さ 480 / 実サイズ(cm): 幅 10.84、高さ 8.12
ピクセル数:幅 1280、高さ 959 / 実サイズ(cm): 幅 10.84、高さ 8.12
ピクセル数:幅 1280、高さ 959 / 実サイズ(cm): 幅 5.42、高さ 4.06
ピクセル数:幅 320、高さ 240 / 実サイズ(cm): 幅 5.42、高さ 4.06

問題では、dpiを2倍にしています。この場合は、実サイズを固定してピクセル数を2倍にするか、実サイズを半分にしてピクセル数を固定にする必要があります。

解像度(2倍) * 実サイズ(固定) = ピクセル数(2倍)

解像度(2倍) * 実サイズ(半分) = ピクセル数(固定)

この条件に一致する選択肢を探します。

その結果、3番目の選択肢の『ピクセル数:幅 1280、高さ 959 / 実サイズ(cm): 幅 5.42、高さ 4.06』(ピクセル数を2倍、実サイズ固定)が答えになります。

以下に、各選択肢の解像度も計算しておきます。

ピクセル数:幅 640、高さ 480 / 実サイズ(cm): 幅 10.84、高さ 8.12
→ 解像度:640 / (10.84/2.54) = 約150dpi

ピクセル数:幅 1280、高さ 959 / 実サイズ(cm): 幅 10.84、高さ 8.12
→ 解像度:1280 / (10.84/2.54) = 約300dpi

ピクセル数:幅 1280、高さ 959 / 実サイズ(cm): 幅 5.42、高さ 4.06
→ 解像度:1280 / (5.42/2.54) = 約600dpi

ピクセル数:幅 320、高さ 240 / 実サイズ(cm): 幅 5.42、高さ 4.06
→ 解像度:320 / (5.42/2.54) = 約150dpi

Javaサンプル

以下、サンドボックス(言語は「Java8」)で、実行確認できるコードを示します。コード欄に、下記のコードをコピペして、INPUTは空で、RUNボタンを押してください。

// 参考コード
import java.lang.Math;

class Main{
    static final double inch = 2.54;

    // main
    public static void main(String[]args) throws Exception {
        // 提示情報
        double cmW = 5.42;
        double cmH = 4.06;

        // 各計算式の計算結果
        int dpi = 600;
        int pxlW = (int)Math.round(cmW * dpi / inch);
        int pxlH = (int)Math.round(cmH * dpi / inch);

        // 出力
        System.out.println("pxlW : " + pxlW);
        System.out.println("pxlH : " + pxlH);
    }
}
// 出力
pxlW : 1280
pxlH : 959

JavaScriptサンプル

以下、ブラウザのコンソールで確認できるように、JavaScriptのコードを示します。

// 参考コード

var inch = 2.54;

// 提示情報
var cmW = 5.42;
var cmH = 4.06;
var dpi = 600;

// 計算
var pxlW = Math.round(cmW * dpi / inch);
var pxlH = Math.round(cmH * dpi / inch);

// 出力
console.log("pxlW : " + pxlW);
console.log("pxlH : " + pxlH);
// 出力
pxlW : 1280
pxlH : 959

CodeIQ運営事務局より

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

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

■関連記事

【謎解きプログラム】この処理は?【コードを読もう】解答と解説... 【謎解きプログラム】この処理は?【コードを読もう】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたの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枚のカードを持っています。問題では、横幅と高さの整数が与えられます。この横幅と高さで作られるマス...
【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説... 【コードミステリ】数字に隠されたメッセージ【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。 それでは以下、問題とその解...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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