第75回【JavaScript】同値判定、終了判定、終了判定 2

現在取り組んでいるのは、paiza ラーニング問題集「条件分岐メニュー」になります。

はじめに

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

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

アプリで今までやったことないことに挑戦していると、時間ばかりが過ぎていきます。それでも、以前に比べるとネット情報が充実しているし、AI もあるし、かなり短縮出来てきていると思います。

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

同値判定 (paizaランク C 相当)

整数N, 2 つの数列A, B が与えられます。 1 ≦ i ≦ N を満たす整数 i のうち、A_i と B_i が等しくなるような i の個数を求めてください。


入力される値

N
A_1 A_2 ... A_N
B_1 B_2 ... B_N

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


期待する出力

A_i == B_iである要素の個数Cを求めてください。

C

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


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

・ N は 1 以上 100 以下の整数
・ A, B の各要素の値は 0 以上 100 未満


入力例

5
1 2 3 4 5
1 20 30 4 5

出力例

3

Python のときに「配列の要素数がそもそも N より少ない場合はエラーが発生するような気がする。」って書いちゃったけれど、入力される値の末尾が「A_N、B_N」ってなっているので、気にする必要はなかったっぽい。

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 n = Number(lines[0]);
  const A = lines[1].split(/\s/).map(Number);
  const B = lines[2].split(/\s/).map(Number);
  let cnt = 0;
  for (let i = 0; i < n; i++) {
      if (A[i] === B[i]) cnt++;
  }
  console.log(cnt);
});
Python
N = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
cnt = 0
for i in range(N):
    if A[i] == B[i]:
        cnt += 1
print(cnt)

終了判定 (paizaランク C 相当)

長さ N の数列Aが与えられます。 1 つ目の要素から最も左にある奇数の要素の手前までの値の和を求めてください。
形式的には、A_iが奇数かつ、区間 [A_1, A_{i – 1}] がすべて偶数であるとき、

\sum_{j=1}^{i-1}{A_j}

を求めてください。


入力される値

N
A_1 A_2 ... A_N

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


期待する出力

答えとなる数値Sを 1 行で出力してください。

S

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


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

・ N は 1 以上 100 以下の整数
・ A の各要素の値は 0 以上 100 未満
・ A には奇数が 1 つ以上含まれます


入力例

5
2 4 6 8 1

出力例

20

奇数だったら抜ける。という終了判定をしろ、という問題。

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 n = Number(lines[0]);
  const A = lines[1].split(/\s/).map(Number);
  let sum = 0;
  for (let i = 0; i < n; i++) {
      if (A[i] % 2 == 1) break;
      sum += A[i];
  }
  console.log(sum);
});
Python
N = int(input())
A = list(map(int,input().split()))
ans = 0
for a in A:
    if a % 2 == 1:
        break
    ans += a
print(ans)

終了判定 2 (paizaランク C 相当)

2 以上の整数N, Kが与えられます。
「Nを 2 倍した数でNを更新する」という操作を何度か繰り返すことを考えます。
このとき, ちょうどある回数 M で N の値は K 以上になります。この時点で操作の繰り返しを終了することにします。

この繰り返しの回数Mを求めてください。(Mは 0 でも構いません)

例えば、Nを 2 、Kを 18 とします。
上記の操作を 3 回繰り返すと、N = 16 となります。
4 回くりかえすと、N = 32 となり、N >= K が成立します。ここで操作を終了し、最終的な操作の回数Mは 4 となります。


入力される値

N K

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


期待する出力

答えとなる数値Sを 1 行で出力してください。

S

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


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

・ N は 2 以上 100 以下の整数
・ K は N 以上 10,000 以下の整数


入力例

2 18

出力例

4

片方は更新によって値が変わり、片方は定数の場合、const は使えないし・・・、こういう書き方でいいのか謎だ。

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', () => {
  let [n,k] = lines[0].split(/\s/).map(Number);
  let m = 0;
  while (n < k) {
      n *= 2;
      m++;
  }
  console.log(m);
});
Python
N,K = map(int,input().split())
M = 0
while N < K:
    N *= 2
    M += 1
print(M)

最後に

多分、再帰的に書く方法はあるんだろうなぁ、と思いながら、やっています。それが JavaScript 的な書き方な気もするし。

const なのか let なのか、どのような書き方が正解なのかもよくわからないです。まだまだ勉強しなければいけないことがたくさんあります。

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

Python の第75回はこちら