第18回【JavaScript】さまざまな長さの配列の和、階段の出力、二重ループ:基本編

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

はじめに

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

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

よく、事務所で若い子がゲームの話をしているのですが、さっぱり付いて行けません。昔は結構ゲームをしていたし、LunaSaki(嫁)と知り合ったのも元々はゲームだったんですが。今は、スマホで「つなキャン」をやっているくらいです。ゲームする時間があるなら、勉強しなくちゃ。

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

さまざまな長さの配列の和 (paizaランク D 相当)

整数 N が与えられるので、次の処理を N 回してください。

・ 配列のサイズ K とその要素 A1 … AK が与えられるので、全ての要素の和を求めて出力してください。


入力される値

N
K1 A1_1 A1_2 ... A1_K1
...
KN AN_1 AN_2 ... AN_KN

・ 1 行目では整数 N が与えられます。
・ 続く N 行では、初めの各行の配列のサイズ Ki (1 ≦ i ≦ N) と各要素 Ai_j (1 ≦ j ≦ Ki) が半角スペース区切りで与えられます。

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


期待する出力

N 回の処理の結果 S_1 … S_N を次の形式で出力してください。

S_1
...
S_N

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


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

・ 1 ≦ N , Ki ≦ 100 (1 ≦ i ≦ N)
・ 0 ≦ Ai_j ≦ 100 (1 ≦ i ≦ N , 1 ≦ j ≦ Ki)


入力例

10
12 17 11 44 41 18 12 70 82 72 19 20 97
8 22 36 93 80 28 59 96 57
10 90 27 95 66 57 48 86 43 81 31
13 22 2 52 51 41 28 83 71 52 10 78 9 19
14 11 96 37 0 50 65 3 4 81 64 47 32 46 53
5 73 22 40 29 69
1 35
3 32 4 41
1 73
1 46

出力例

503
471
624
518
589
233
35
77
73
46

問題文をしっかり読んで噛み砕かないと、何を問われているのかが分かりづらい。うーん、日本語をもっと勉強しなさい、ということでしょうか。

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]);
  let a = [];
  for (let i = 1; i <= n; i++) {
      let temp = lines[i].split(/\s/).map(Number);
      const k = temp[0];
      let ans = 0;
      for (let j = 1; j <= k; j++) {
          ans += temp[j];
      }
      console.log(ans);
  }
});

せっかく reduce() を覚えたので、reduce() を使って書いてみる。その際、Python の pop(0) みたいなものがないか調べていたら、shift() というのを見つけたので、使ってみる。

JavaScript(reduce() と shift() を利用)
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]);
  let a = [];
  for (let i = 1; i <= n; i++) {
      let temp = lines[i].split(/\s/).map(Number);
      const k = temp.shift();
      const total = temp.reduce((sum,e) => sum + e, 0);
      console.log(total);
  }
});
Python
N = int(input())
for _ in range(N):
    X = list(map(int,input().split()))
    K = X[0]
    ans = 0
    for i in range(1,K + 1):
        ans += X[i]
    print(ans)

階段の出力 (paizaランク D 相当)

整数 N が与えられるので、次の規則に従って N 行の出力をしてください。

・ N 行のうち、 i 行目では、1 から i までの数字を半角スペース区切りで出力してください。

例として、 N = 3 のとき、出力は次の通りになります。

1
1 2
1 2 3

入力される値

N

・ 出力する行数 N が 1 行で与えられます。

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


期待する出力

規則に従って N 行の出力をしてください。
出力の末尾には改行を入れてください。

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


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

・ 1 ≦ N ≦ 100


入力例

5

出力例

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

どこで使うかいまいちわからないけれど、いろんな言語で書かされるパターンのやつ。

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]);
  for (let i = 1; i <= n; i++) {
      for (let j = 1; j <= i; j++) {
          if (j == i) {
            console.log(j);
            break;
          }
          process.stdout.write(j + ' ');
      }
  }
});
Python
N = int(input())
for i in range(1,N + 1):
    for j in range(1,i + 1):
        if j == i:
            print(j)
            break
        print(j,end=" ")

二重ループ:基本編 積の最大 (paizaランク D 相当)

配列 A と B についての情報が与えられるので、(A の 1 つの要素) × (B の 1 つの要素) の最大値を求めてください。


入力される値

N K
A_1 A_2 ... A_N
B_1 B_2 ... B_K

・ 1 行目では、配列 A の要素数を表す整数 N と配列 B の要素数を表す整数 K が半角スペース区切りで与えられます。
・ 2 行目では、配列 A の各要素が半角スペース区切りで与えられます。
・ 3 行目では、配列 B の各要素が半角スペース区切りで与えられます。

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


期待する出力

(A の 1 つの要素) × (B の 1 つの要素) の最大値を 1 行で出力してください。
出力の末尾には改行を入れてください。

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


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

・ 1 ≦ N , K ≦ 100
・ -100 ≦ A_i , B_j ≦ 100 (1 ≦ i ≦ N, 1 ≦ j ≦ K)


入力例

10 10
85 -46 93 44 -40 -75 -75 -18 -54 95
1 95 -92 -90 32 -25 36 55 22 86

出力例

9025

条件としてマイナスがあることに注意。-100 と 100 の組しか存在していなかったら、最大値は -10000 になってしまう。

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,k] = lines[0].split(/\s/).map(Number);
  const a = lines[1].split(/\s/).map(Number);
  const b = lines[2].split(/\s/).map(Number);
  let maxNum = -10000;
  for (let i = 0; i < n; i++) {
      for (let j = 0; j < k; j++) {
          const ab = a[i] * b[j];
          if (maxNum < ab) maxNum = ab;
      }
  }
  console.log(maxNum);
});
Python
N,K = map(int,input().split())
A = [int(x) for x in input().split()]
B = [int(x) for x in input().split()]
max_ans = -10000
for i in range(N):
    for j in range(K):
        ab = A[i] * B[j]
        if max_ans < ab:
            max_ans = ab
print(max_ans)

最後に

もっと素敵な書き方があるんだろうなぁ、と思いながら、基本に忠実に書きました。条件が巨大な数字になったときとか、新たな方法を探る必要がある気はしています。

まだまだ勉強を始めたばかり。さすがにこのくらいはスラスラと書くことが出来ていますが、もっと他に便利な方法があるはずだ、と調べ始めると止まりません。

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

Python の第18回はこちら