第59回【JavaScript】重複要素の削除、【配列への副作用を伴う操作】条件を満たす要素のみの配列作成

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

はじめに

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

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

綺麗に書かれたクラスを見て、羨ましくなります。自分が書いたものは、美しくない。美しく書いているつもりですが、上には上があるわけです。一生懸命真似をして、勉強する毎日です。

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

重複要素の削除 (paizaランク D 相当)

配列 A の要素数 N と配列 A の各要素 A_1, A_2, …, A_N が与えられるので、同じ値の要素が 2 つ以上含まれないように A を加工した新たな配列 B を作成してください。
ただし、 A に同じ値の要素が 2 つ以上あった場合、それらのうち先頭の要素を B に採用するものとします。


入力される値

N
A_1
...
A_N

・ 1 行目では、配列 A の要素数 N が与えられます。
・ 続く N 行では、配列 A の要素が先頭から順に与えられます。

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


期待する出力

B_1
...
...

同じ値の要素が 2 つ以上含まれないように A を加工した新たな配列 B の各要素を改行区切りで出力してください。

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


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

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


入力例

5
1
2
3
5
2

出力例

1
2
3
5

何やら、JavaScript は set も順番を保持している模様。追加した順、らしい。

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 = [];
  const B = new Set();
  for (let i = 1; i <= n; i++) {
      A.push(Number(lines[i]));
  }
  for (let i = 0; i < n; i++) {
      B.add(A[i]);
  }
  for (let val of B) {
      console.log(val);
  }
});
Python
N = int(input())
A = [int(input()) for _ in range(N)]
B = []
for a in A:
    if a not in B:
        B.append(a)
for b in B:
    print(b)

【配列への副作用を伴う操作】条件を満たす要素のみの配列作成 (paizaランク D 相当)

配列 A の要素数 N と整数 K , 配列 A の各要素 A_1 … A_N が与えられるので、K 以上であるような配列 A の要素のみを要素として持つ配列 B を作成し、その要素を出力してください。 B の要素の順は A と同じにしてください。


入力される値

N K
A_1
...
A_N

・ 1 行目では、配列 A の要素数 N と整数 K が与えられます。
・ 続く N 行では、配列 A の要素が先頭から順に与えられます。

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


期待する出力

B_1
...

K 以上であるような配列 A の要素のみを要素として持つ配列 B を作成し、その要素を出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ A_i , K ≦ 100 (1 ≦ i ≦ N)


入力例

5 3
1
2
3
4
5

出力例

3
4
5

どの辺が副作用となるんだろう。ということは、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,k] = lines[0].split(/\s/).map(Number);
  const A = [];
  const B = [];
  for (let i = 1; i <= n; i++) {
      A.push(Number(lines[i]));
  }
  for (let i = 0; i < A.length; i++) {
      if (A[i] >= k) B.push(A[i]);
  }
  for (let i = 0; i < B.length; i++) {
      console.log(B[i]);
  }
});
Python
N,K = map(int,input().split())
A = [int(input()) for _ in range(N)]
B = []
for a in A:
    if a >= K:
        B.append(a)
for b in B:
    print(b)

最後に

多分、Python に慣れ過ぎていて、冗長に見えるだけだな、と思うようにしよう。他の言語と比較すれば、似たような感じのことを書いているわけだし、間違っていない、・・・はず。

set が順番を保持している、というのは驚きました。そうなると、Python ではいちいち先頭から操作していた部分、何も考えずに set に入れるだけで済む。かなりお手軽。

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

Python の第59回はこちら