第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 に入れるだけで済む。かなりお手軽。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません