第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 の使い方すらあやふやだった。そのくらいのレベルからスタートしています。
用意されている関数が多くて、いろいろなことが便利に出来るなぁ、というのが印象。しかし、「知って」いないと書くことも読むことも出来ないので、猛勉強必須です。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません