ガジェット通信

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

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

DATE:
  • ガジェット通信を≫

【謎解きプログラム】解像度に対応せよ!【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運営事務局より

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

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

TOP