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

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

【謎解きプログラム】答えを当てよ!【○△値】解答と解説

【謎解きプログラム】答えを当てよ!【○△値】

本問題は、「答えを当てよ!」というテーマで、プログラムにちなんだ謎を解くというものでした。

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

問題のオープニング

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

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

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

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

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

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

説明

法則を見つけよう!

ヒントとして、文字と記号で表された計算式が複数示されます。

計算式中の「+」や「-」は、加算減算ではなく、プログラム的な特定の計算を行います。

そのヒントの計算式を元に、問題の計算の答えを当ててください。

問題1

// ヒント
O + O = O
O + X = X
X + O = X
X + X = X

// 問題
「猫 + 猫 = 猫」
「猫 + 犬 = 犬」
「犬 + 猫 = 犬」 の場合、
「犬 + 犬」の値は?

// 選択肢

猫犬

犬犬

ヒントには、マルとバツが書かれています。マルとバツの2つの状態がある値は、プログラマーなら真偽値だと推測できます。また、真偽値同士を計算した結果ということで、以下の式だと推測することができます。

// 解答1

// 真偽値のAND演算
O(true) +(&) O(true) → O(true)
O(true) +(&) X(false) → X(false)
X(false) +(&) O(true) → X(false)
X(false) +(&) X(false) → X(false)

// 猫と犬の対応
猫(true) +(&) 猫(true) → 猫(true)
猫(true) +(&) 犬(false) → 犬(false)
犬(false) +(&) 猫(true) → 犬(false)

犬(false) +(&) 犬(false) → 犬(false)

あるいは、真偽値を逆にして、AND演算をOR演算に変えることでも、答えを得ることができます。

// 解答2

// 真偽値のAND演算
O(false) +(|) O(false) → O(false)
O(false) +(|) X(true) → X(true)
X(true) +(|) O(false) → X(true)
X(true) +(|) X(true) → X(true)

// 猫と犬の対応
猫(false) +(|) 猫(false) → 猫(false)
猫(false) +(|) 犬(true) → 犬(true)
犬(true) +(|) 猫(false) → 犬(true)

犬(true) +(|) 犬(true) → 犬(true)

上記の通り、答えは3番目の選択肢の『犬』になります。

Javaサンプル

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

// 参考コード
import java.util.*;
class Main {
public static void main(String[]args) {
// 参考コード1
{
boolean 猫 = true;
boolean 犬 = false;
Map o = new HashMap();
o.put(true, “猫”); o.put(false, “犬”);
System.out.println(“猫 & 猫 ” + (猫 & 猫) + ” ” + o.get(猫 & 猫));
System.out.println(“猫 & 犬 ” + (猫 & 犬) + ” ” + o.get(猫 & 犬));
System.out.println(“犬 & 猫 ” + (犬 & 猫) + ” ” + o.get(犬 & 猫));
System.out.println(“犬 & 犬 ” + (犬 & 犬) + ” ” + o.get(犬 & 犬));
}
// 参考コード2
{
boolean 猫 = false;
boolean 犬 = true;
Map o = new HashMap();
o.put(false, “猫”); o.put(true, “犬”);
System.out.println(“猫 | 猫 ” + (猫 | 猫) + ” ” + o.get(猫 | 猫));
System.out.println(“猫 | 犬 ” + (猫 | 犬) + ” ” + o.get(猫 | 犬));
System.out.println(“犬 | 猫 ” + (犬 | 猫) + ” ” + o.get(犬 | 猫));
System.out.println(“犬 | 犬 ” + (犬 | 犬) + ” ” + o.get(犬 | 犬));
}
}
}

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