ガジェット通信

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

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

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

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

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

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

問題のオープニング

ある日、出社すると、あなたの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(犬 | 犬));
}
}
}

JavaScriptサンプル

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

// 参考コード1
var 猫 = true;
var 犬 = false;
var o = {true: “猫”, false: “犬”};
console.log(“猫 && 猫”, 猫 && 猫, o[猫 && 猫]);
console.log(“猫 && 犬”, 猫 && 犬, o[猫 && 犬]);
console.log(“犬 && 猫”, 犬 && 猫, o[犬 && 猫]);
console.log(“犬 && 犬”, 犬 && 犬, o[犬 && 犬]);

// 参考コード2
var 猫 = false;
var 犬 = true;
var o = {false: “猫”, true: “犬”};
console.log(“猫 || 猫”, 猫 || 猫, o[猫 || 猫]);
console.log(“猫 || 犬”, 猫 || 犬, o[猫 || 犬]);
console.log(“犬 || 猫”, 犬 || 猫, o[犬 || 猫]);
console.log(“犬 || 犬”, 犬 || 犬, o[犬 || 犬]);

問題2

// ヒント
O – O = O
O – X = O
X – O = O
X – X = X

// 問題
「羊 – 羊 = 羊」
「牛 – 牛 = 牛」
「羊 – 牛 = 牛」 の場合、
「牛 – 羊」の値は?

// 選択肢


牛羊
羊牛

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

// 解答1

// 真偽値のOR演算
O(true) -(|) O(true) → O(true)
O(true) -(|) X(false) → O(true)
X(false) -(|) O(true) → O(true)
X(false) -(|) X(false) → X(false)

// 羊と牛の対応
羊(false) -(|) 羊(false) → 羊(false)
牛(true) -(|) 牛(true) → 牛(true)
羊(false) -(|) 牛(true) → 牛(true)

牛(true) -(|) 羊(false) → 牛(true)

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

// 解答2

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

// 羊と牛の対応
羊(true) -(&) 羊(true) → 羊(true)
牛(false) -(&) 牛(false) → 牛(false)
羊(true) -(&) 牛(false) → 牛(false)

牛(false) -(|) 羊(true) → 牛(false)

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

Javaサンプル

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

// 参考コード
import java.util.*;
class Main {
public static void main(String[]args) {
// 参考コード1
{
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(牛 | 羊));
}
// 参考コード2
{
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(牛 & 羊));
}
}
}

JavaScriptサンプル

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

// 参考コード1
var 羊 = false;
var 牛 = true;
var o = {false: “羊”, true: “牛”};
console.log(“羊 || 羊”, 羊 || 羊, o[羊 || 羊]);
console.log(“牛 || 牛”, 牛 || 牛, o[牛 || 牛]);
console.log(“羊 || 牛”, 羊 || 牛, o[羊 || 牛]);
console.log(“牛 || 羊”, 牛 || 羊, o[牛 || 羊]);

// 参考コード2
var 羊 = true;
var 牛 = false;
var o = {true: “羊”, false: “牛”};
console.log(“羊 && 羊”, 羊 && 羊, o[羊 && 羊]);
console.log(“牛 && 牛”, 牛 && 牛, o[牛 && 牛]);
console.log(“羊 && 牛”, 羊 && 牛, o[羊 && 牛]);
console.log(“牛 && 羊”, 牛 && 羊, o[牛 && 羊]);

問題3

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

// 問題
「虎 – 龍 = 虎」の場合、
「虎 + 龍」の値は?

// 選択肢
龍虎

虎龍

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

// 解答1

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

// 虎と龍の対応
虎(true) -(|) 龍(false) → 虎(true)

虎(true) +(&) 龍(false) → 龍(false)

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

// 解答2

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

// 虎と龍の対応
虎(false) -(&) 龍(true) → 虎(false)

虎(false) +(|) 龍(true) → 龍(true)

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

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(虎 & 龍));
}
// 参考コード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(虎 | 龍));
}
}
}

JavaScriptサンプル

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

// 参考コード1
var 虎 = true;
var 龍 = false;
var o = {true: “虎”, false: “龍”};
console.log(“虎 || 龍”, 虎 || 龍, o[虎 || 龍]);
console.log(“虎 && 龍”, 虎 && 龍, o[虎 && 龍]);

// 参考コード2
var 虎 = false;
var 龍 = true;
var o = {false: “虎”, true: “龍”};
console.log(“虎 && 龍”, 虎 && 龍, o[虎 && 龍]);
console.log(“虎 || 龍”, 虎 || 龍, o[虎 || 龍]);

CodeIQ運営事務局より

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

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

TOP