第3回【JavaScript】数列の和、数列の A 番目から B 番目までの和、数列の値を全部 * 2 して出力

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

はじめに

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

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

調べながらやっているので、とても時間がかかっています。Python は多少の知識があって、既に利用している状態からスタートだったので、序盤はまったく苦労しなかったのだけれど。しかし、楽しい!

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

数列の和 (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の和を計算し、出力してください。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。

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


期待する出力

数列の和を計算し、出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)


入力例

5
1 2 3 4 5

出力例

15

今回調べてみて、JavaScript には、sum がないことを知りました。不便だ。その代わりに、reduce というのがあるらしいので、よくあるパターンと reduce を利用するパターンで挑戦してみます。

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', () => {
  var num = lines[0];
  var input_numbers = lines[1].split(/\s/).map(Number);
  const sum = function(nums) {
      let total = 0;
      for (let i = 0; i < num; i++) total += nums[i];
      return total;
  }
  console.log(sum(input_numbers));
});
JavaScript(reduceを利用してみた)
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', () => {
  var num = lines[0];
  var input_numbers = lines[1].split(/\s/).map(Number);
  let total = input_numbers.reduce((sum,ele) => sum + ele, 0);
  console.log(total);
});
Python
N = int(input())
A = [int(x) for x in input().split()]
ans = 0
for i in range(N):
    ans += A[i]
print(ans)

数列の A 番目から B 番目までの和 (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) と、整数 A, B が与えられます。
この数列の a_A から a_B までの和を計算し、出力してください。


入力される値

N A B
a_1 a_2 ... a_N

・ 1 行目に整数 N, A, B が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。

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


期待する出力

数列の A 番目から B 番目までの和を計算し、出力してください。
出力の末尾には改行を入れてください。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ A ≦ B ≦ N
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)


入力例

5 1 3
1 2 3 4 5

出力例

6

Python だと、スライス記法を使って、sum を使えば、簡単に書けるのだけれど、JavaScript だとどうなるんだろう、といろいろ調べてみて、結構便利な書き方があることを覚えた!

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,a,b] = lines[0].split(/\s/).map(Number);
  const inputNumbers = lines[1].split(/\s/).map(Number);
  const sum = function(nums) {
      let total = 0;
      for (let i = a - 1; i < b; i++) total += nums[i];
      return total;
  }
  console.log(sum(inputNumbers));
});
JavaScript(slice を利用してみた)
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,a,b] = lines[0].split(/\s/).map(Number);
  const inputNumbers = lines[1].split(/\s/).map(Number);
  const inputNumbersSlice = inputNumbers.slice(a-1,b);
  let total = inputNumbersSlice.reduce((sum,ele) => sum + ele, 0);
  console.log(total);
});
Python
N,A,B = map(int,input().split())
a = [int(x) for x in input().split()]
print(sum(a[A-1:B]))

数列の値を全部 * 2 して出力 (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の全ての要素を 2 倍し、改行区切りで出力してください。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。

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


期待する出力

数列の全ての要素を 2 倍し、改行区切りで出力してください。

a_1*2
a_2*2
...
a_N*2

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)


入力例

5
1 2 3 4 5

出力例

2
4
6
8
10

これは、そのままループで書けばいいので、結構簡単だと思う。もっと JavaScript 的な書き方があれば教えてください。

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

最後に

調べれば調べるほど、覚えるべきことが出てきて、なかなか大変です。変数宣言の際の const var let の使い方すらあやふやだった。そのくらいのレベルからスタートしています。

用意されている関数が多くて、いろいろなことが便利に出来るなぁ、というのが印象。しかし、「知って」いないと書くことも読むことも出来ないので、猛勉強必須です。

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

Python の第3回はこちら