第81回【JavaScript】ランダムアクセス、複数回のランダムアクセス、最大値と最小値、動的配列

現在取り組んでいるのは、paiza ラーニング問題集「データセット選択メニュー」になります。

はじめに

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

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

ルナちゃんの甘えん坊スキルがいまだにレベルアップしている模様。よく肩の上に乗ってくるのですが、時々爪が刺さって痛いです。ルナちゃんもレオくんもしっかり爪切りしています。それでも、めり込むときの痛みは慣れません。

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

ランダムアクセス (paizaランク D 相当)

要素数 N の数列 A と数値 M が与えられます。A の M 番目の値を出力してください。


入力される値

N M
A_1 ... A_N

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


期待する出力

A の M 番目の値を出力してください。

A_M

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ M ≦ N
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)


入力例

5 2
1 2 3 4 5

出力例

5 2
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,m] = lines[0].split(/\s/).map(Number);
  const a = lines[1].split(/\s/);
  console.log(a[m-1]);
});
Python
N,M = map(int,input().split())
A = [int(x) for x in input().split()]
print(A[M-1])

複数回のランダムアクセス (paizaランク D 相当)

要素数 N の数列 A と要素数 Q の数列 B が与えられます。 1 ≦ i ≦ Q の各 i について、i 行目に A の B_i 番目の値を出力してください。


入力される値

N
A_1 A_2 ... A_N
Q
B_1 B_2 ... B_Q

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


期待する出力

Q 行出力してください。
i 行目には、A の B_i 番目の値を出力してください。

A_{B_1}
...
A_{B_Q}

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ Q ≦ 100
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)
・ 1 ≦ B_i ≦ N (1 ≦ i ≦ Q)


入力例

5
10 20 30 40 50
3
2 4 1

出力例

20
40
10

こちらも、前問同様にインデックスを間違えなければ簡単。

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/);
  const q = Number(lines[2]);
  const b = lines[3].split(/\s/).map(Number);
  for (let i = 0; i < q; i++) {
      console.log(a[b[i] - 1]);
  }
});
Python
N = int(input())
A = [int(x) for x in input().split()]
Q = int(input())
B = [int(x) for x in input().split()]
for b in B:
    print(A[b-1])

最大値と最小値 (paizaランク D 相当)

自然数 A, B, C が与えられます。(A, B, C の最大値) – (A, B, C の最小値)を答えてください。


入力される値

A B C

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


期待する出力

答えを1行に出力してください。

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


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

・ 1 ≦ A, B, C ≦ 100


入力例

30 50 10

出力例

40

max と min を使う方法と、並べ替えを利用する方法が思いつく。

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 abc = lines[0].split(/\s/).map(Number);
  console.log(Math.max(...abc) - Math.min(...abc));
});

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 abc = lines[0].split(/\s/).map(Number);
  abc.sort((first, second) => first - second);
  console.log(abc[2] - abc[0]);
});
Python
ABC = [int(x) for x in input().split()]
print(max(ABC) - min(ABC))

動的配列 (paizaランク D 相当)

N 個の要素からなる数列 A が与えられます。数列 A に対し、次の 3 つの操作を行うプログラムを作成してください。

・ push_back x : A の末尾に x を追加する
・ pop_back : A の末尾を削除する
・ print : A を半角スペース区切りで1行に出力する

例えば、入力例 1 において、数列 A は最初「1 2 3」です。最初の操作は「push_back 10」なので、末尾に 10 を追加して「1 2 3 10」となります。 2 つ目の操作は「push_back 12」なので、「1 2 3 10 12」となります。 3 つ目の操作は「print」なので「1 2 3 10 12」を出力します。 4 つ目の操作は「pop_back」なので末尾の「12」を削除して、「1 2 3 10」となります。最後の操作は「print」なので「1 2 3 10」を出力します。


入力される値

N Q
A_1 A_2 A_3 ... A_N
query_1
query_2
...
query_Q

1 行目に A の要素数 N と、A に対する操作回数 Q が与えられます。2 行目に A の 各要素の値が与えられます。続くQ行のうち i 行目に、各操作の情報 query_i が与えられます。query_i は

0 x

または

1

または

2

の形式で与えられ、最初の数値が 0 x は push_back x を、 1 は pop_back を、 2 は print をそれぞれ表します。

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


期待する出力

各 query の指示に従って適切な出力を行ってください。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ Q ≦ 100
・ 1 ≦ A_i ≦ 100 (1 ≦ i ≦ N)
・ query_i は 0 x または 1 または 2
・ 1 ≦ x ≦ 100
・ pop_back 操作が指定される際、Aの要素数は 1 以上


入力例

3 5
1 2 3
0 10
0 12
2
1
2

出力例

1 2 3 10 12
1 2 3 10

Python と同様に、末尾に追加、削除はちゃんと用意されている。

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,q] = lines[0].split(/\s/).map(Number);
  let a = lines[1].split(/\s/);
  for (let i = 2; i < 2 + q; i++) {
      query = lines[i].split(/\s/);
      if (query[0] == '0') {
          a.push(query[1]);
      } else if (query[0] == '1') {
          a.pop();
      } else if (query[0] == '2') {
          console.log(...a);
      }
  }
});
Python
N,Q = map(int,input().split())
A = [int(x) for x in input().split()]
for _ in range(Q):
    q = input().split()
    if q[0] == '0':
        A.append(q[1])
    elif q[0] == '1':
        A.pop()
    else:
        print(" ".join(map(str,A)))

最後に

何気なくスプレッド構文で console.log() を書いたらいけました。知りませんでした。お恥ずかしい。

もっとちゃんと極めて行けば、もっともっと面白くなるんだろうなぁという予感がします。メンバーの子に面白いからやってみよう、と声を掛けましたが、「面白さが分からない」と言われました。こっち方面で大成するのは難しいと思うゾ・・・。

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

Python の第81回はこちら