第80回【JavaScript】半加算器、全加算器、論理演算を用いた計算のまとめ

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

はじめに

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

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

年々、体調管理が難しくなったなぁと感じます。本当にちょっとしたことで体調を崩し、立て直すのに時間がかかってしまいます。昔は 1 日寝ていれば治っていたのに。

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

半加算器 (paizaランク D 相当)

京子ちゃんは 二進数 1 けたの整数 A と B を使って、 A + B を計算したいと思っています。

上記の画像のように、 A と B を足した結果 (2 進表記) の下から 2 けた目の値を C 、下から 1 けた目の値を S とします。 C と S を出力してください。


入力される値

A B

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


期待する出力

C, S をこの順に、半角スペース区切りで出力してください。

C S

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


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

・ A, B は 0 または 1


入力例

0 1

出力例

0 1

半加算は AND と XOR の組み合わせ。真理値表を書いてみればすぐにわかると思う。

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);
  c = a & b;
  s = a ^ b;
  console.log(c,s);
});
Python
A,B = map(int,input().split())
C = A & B
S = A ^ B
print(C,S)

全加算器 (paizaランク C 相当)

京子ちゃんは 二進数 の整数同士で足し算をするプログラムを作成したいと思っています。
二進数の足し算において、下から 1 けた目の計算は半加算器でできることを知り、 2 けた目の計算も同じように足し算ができないかと考えています。

上記の画像のように、 現在下から 2, 3 けた目を計算しようとしています。そこで、入力 A, B と 1 けた目からの繰り上がり C1 が与えられます。 京子ちゃんに変わって C2 と S を計算し、出力してください。

この問題は少し難しいので、ヒントとなる画像を用意しました。 2 つの半加算器と XOR 演算を用いることで計算することができます。


入力される値

A B C1

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


期待する出力

C2, S をこの順に、半角スペース区切りで出力してください。

C2 S

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


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

・ A, B, C1 は 0 または 1


入力例

0 1 1

出力例

1 0

用意してくださった図がわかりやすい。半加算器 2 つとその計算結果を XOR で解ける。

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,c1] = lines[0].split(/\s/).map(Number);
  const [cx, sy] = half(a, b);
  const [cy, s] = half(sy, c1);
  const c2 = cx ^ cy;
  console.log(c2,s);
});

function half(a, b){
    return [a & b, a ^ b];
}
Python
A,B,C1 = map(int,input().split())
def half(a,b):
    c = a & b
    s = a ^ b
    return c,s
Cx,Sy = half(A,B)
Cy,S = half(Sy,C1)
C2 = Cx ^ Cy
print(C2,S)

論理演算を用いた計算のまとめ (paizaランク C 相当)

0 または 1 の整数 A, B, C, D が与えられます。 以下の式を計算した結果を出力してください。


入力される値

A B C D

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


期待する出力

問題文の式の計算結果を 0 または 1 で出力してください。

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


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

・ A, B, C, D は 0 または 1


入力例

0 0 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,c,d] = lines[0].split(/\s/).map(Number);
  console.log(Number(!((!a) & (!b) || !c) ^ d));
});

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,c,d] = lines[0].split(/\s/).map(Number);
  console.log(((a || b) & c) ^ d);
});
Python
A,B,C,D = map(int,input().split())
print(int(not(not(A) and not(B) or not(C)) ^ D))

最後に

論理演算は好きです。面白くないですか? 0 と 1 だけの世界。

Python のときも書きましたが、プログラミングは論理的思考でパズルを解いていくようなものだと考えているので、今回も問題を解きながらしっかり復習出来て面白かったです。

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

Python の第80回はこちら