第78回【JavaScript】論理積( AND )の基本、論理和( OR )の基本、否定( NOT )の基本、排他的論理和( XOR )の基本

現在取り組んでいるのは、paiza ラーニング問題集「論理演算メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 78 回目です。

ちょっと無理をすると、体調を崩します。昔はそんなことなかったのに。年齢的なものでしょうか。数日、ほとんどまともに寝てなくて、それでもようやく完成して、ほっと一息ついた途端にずぶずぶと沼に沈んでいった感じです。

それでは、今日も頑張ってみようと思います。

論理積( AND )の基本 (paizaランク D 相当)

0 または 1 の整数 A と B が与えられます。 A AND B の結果を出力してください。
ここで、 AND 演算とは、以下の表にしたがって算出する論理演算のことを指します。

入力1入力2出力
000
010
100
111

表を参考にして条件分岐を書くことによってもこの問題は解けますが、なるべく各言語に備わっている論理演算の機能を用いて実装するようにしましょう。たとえば、以下のような C++ のプログラムでも正解できてしまいますが、論理演算の練習のためできるだけこのようなプログラムは書かないようにしましょう。

#include <iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a >> b;
    if (a == 0 && b == 0) {
        cout << 0 << endl;
    } else if (a == 0 && b == 1) {
        cout << 0 << endl;
    } else if (a == 1 && b == 0) {
        cout << 0 << endl;
    } else if (a == 1 && b == 1) {
        cout << 1 << endl;
    }
}

入力される値

A B

入力値最終行の末尾に改行が1つ入ります。


期待する出力

A AND B の結果を 0 または 1 で出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ A, B は 0 または 1


入力例

0 0

出力例

0

ビット演算の方の論理積、でしょうか。&& だと、片方しか評価されないこともある。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [a,b] = lines[0].split(/\s/).map(Number);
  console.log(a & b);
});
Python
A,B = map(int,input().split())
print(A and B)

論理和( OR )の基本 (paizaランク D 相当)

0 または 1 の整数 A と B が与えられます。 A OR B の結果を出力してください。
ここで、 OR 演算とは、以下の表にしたがって算出する論理演算のことを指します。

入力1入力2出力
000
011
101
111

表を参考にして条件分岐を書くことによってもこの問題は解けますが、なるべく各言語に備わっている論理演算の機能を用いて実装するようにしましょう。たとえば、以下のような C++ のプログラムでも正解できてしまいますが、論理演算の練習のためできるだけこのようなプログラムは書かないようにしましょう。

#include <iostream>
using namespace std;
int main() {
    int a, b;
    cin >> a >> b;
    if (a == 0 && b == 0) {
        cout << 0 << endl;
    } else if (a == 0 && b == 1) {
        cout << 1 << endl;
    } else if (a == 1 && b == 0) {
        cout << 1 << endl;
    } else if (a == 1 && b == 1) {
        cout << 1 << endl;
    }
}

入力される値

A B

入力値最終行の末尾に改行が1つ入ります。


期待する出力

A OR B の結果を 0 または 1 で出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ A, B は 0 または 1


入力例

0 0

出力例

0

論理和は先頭が True であれば後ろを評価する必要がないので、|| ってことでしょうか。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [a,b] = lines[0].split(/\s/).map(Number);
  console.log(a || b);
});
Python
A,B = map(int,input().split())
print(A or B)

否定( NOT )の基本 (paizaランク D 相当)

0 または 1 の整数 A が与えられます。 NOT A の結果を出力してください。
ここで、 NOT 演算とは、以下の表にしたがって算出する論理演算のことを指します。

入力出力
01
10

入力される値

A

入力値最終行の末尾に改行が1つ入ります。


期待する出力

NOT A の結果を 0 または 1 で出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。


入力例

0

出力例

1

Python のときと同様、数値に変換してあげる必要がある。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ!!
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const a = Number(lines[0]);
  console.log(Number(!a));
});
Python
A = int(input())
print(int(not A))

排他的論理和( XOR )の基本 (paizaランク D 相当)

0 または 1 の整数 A と B が与えられます。 A XOR B の結果を出力してください。
ここで、 XOR 演算とは、以下の表にしたがって算出する論理演算のことを指します。

入力1入力2出力
000
011
101
110

入力される値

A B

入力値最終行の末尾に改行が1つ入ります。


期待する出力

A XOR B の結果を 0 または 1 で出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ A, B は 0 または 1


入力例

0 0

出力例

0

排他的論理和は、Python 同様に ^ で求めることができる。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [a,b] = lines[0].split(/\s/).map(Number);
  console.log(a ^ b);
});
Python
A,B = map(int,input().split())
print(A ^ B)

最後に

基本的には、よくある演算子で表現できるので分かりやすかったです。&& と & 、|| と | の違いとか、ちゃんと知っているといいかもしれない。

何で覚えたのかが思い出せないけれど、プログラミングを始めて初期のころにやった記憶があるなぁ、と。

引き続き、よろしくお願いいたします!

Python の第78回はこちら