Paizaで「論理演算」の最終問題に挑戦!
「ド・モルガンの法則」を知ったらスマートな式になる!
🎯問題
問題:A, B, C, D(各0か1)が与えられたとき、
の値を出力せよ!
💻コード例
①そのまま
const rl = require('readline').createInterface({input:process.stdin})
rl.on('line', (input) => {
const [A,B,C,D] = input.split(' ').map(Number);
console.log( !((!A & !B) | !C) ^ D);
rl.close();
});
②ド・モルガン登場! 簡潔な式に!
const rl = require('readline').createInterface({input:process.stdin})
rl.on('line', (input) => {
const [A,B,C,D] = input.split(' ').map(Number);
console.log((A | B) & C ^ D);
rl.close();
});
✨ 解説
Step変形:
!((!A & !B) | !C)
= !(!A & !B) & !!C
= (A | B) & C
なので全体は:
(A | B) & C ^ D
!!C は C と同じなので省略OK。
📌 気づきメモ まとめ
-
!!x = xは地味だけど覚えとくと便利 -
^(XOR)は分配法則を持たない。だから(A | B) & (C ^ D)みたいな変形は不可 - 論理演算は「数学っぽい」けど、「可読性ファースト」で書くとバグ減る
おまけ: 💡ド・モルガンの法則とは?
2つの基本形があります:
✅ 1. 否定がANDにかかっているとき:
!(A && B) ≡ (!A || !B)
「AとBの両方じゃない」は、「Aじゃない か Bじゃない」
✅ 2. 否定がORにかかっているとき:
!(A || B) ≡ (!A && !B)
「AまたはBじゃない」は、「AもBもじゃない」
例:
元の式:
!((!A & !B) | !C)
変形:
= !(!A & !B) & !!C
= (A | B) & C ←スッキリ!
💡 なぜ便利?
- 長い論理式を 簡単に&読みやすく 書き直せる
- 条件分岐や論理演算問題を 論理的に変形できる
- 回路設計(AND/ORゲート)の基本法則でもある
🧪 まとめ
ド・モルガンの法則を覚えると、「条件の否定」や「論理演算の整理」がめちゃくちゃスムーズになる!
覚え方はシンプルに:
「!(NOT)が中に入ると、演算子(AND ⇔ OR)が逆になる!」
