第66回【JavaScript】【配列に対しての複雑な処理】集団行動
現在取り組んでいるのは、paiza ラーニング問題集「配列活用メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
JavaScript をゼロから勉強してみよう、のコーナー 66 回目です。
みんな忙しいのはわかるけれど、提出物は期限内に出してくれよ。まぁ、社内のものだから、多少遅れるのは仕方ないけれど。いや、社会人なんだから、社内であろうが社外であろうが、期限は守るものだろう。
それでは、今日も頑張ってみようと思います。
【配列に対しての複雑な処理】集団行動 (paizaランク C 相当)
あなたは集団行動のリーダーです。次のような指示を出すことで様々な列の操作ができます。
・swap A B
先頭から A 番目の人と、先頭から B 番目の人の位置を入れ替える。
・reverse
列の前後を入れ替える。
・resize C
先頭から C 人を列に残し、それ以外の人を全員列から離れさせる。ただし、列が既に C 人以下の場合、何も行わない。
初め、列には番号 1 〜 N の N 人がおり、先頭から番号の昇順に並んでいます。(1, 2 , 3, …, N)
あなたの出した指示の回数 Q とその指示の内容 S_i (1 ≦ i ≦ Q) が順に与えられるので、全ての操作を順に行った後の列を出力してください。
入力される値
N Q
S_1
...
S_Q
・1 行目では、初めの列の人数 N と、指示の回数 Q が半角スペース区切りで与えられます。
・以降の N 行では指示の内容を表す S_i (1 ≦ i ≦ N) が与えられます。
入力値最終行の末尾に改行が1つ入ります。
期待する出力
S_1
...
...
全ての操作を終えた後の列 S の生徒番号を先頭から順に改行区切りで出力してください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ N , Q ≦ 100
・S_i は、swap A B
, reverse
, resize C
のいずれかの形式です。
・1 ≦ C ≦ N
・A, B はその時点で操作可能であるような生徒番号が与えられます。
入力例
10 2
reverse
resize 7
出力例
10
9
8
7
6
5
4
実に面白い。こういう問題はたまらなく好きだ。
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 students = [...Array(N)].map((_,i)=>i+1);
for (let i = 1; i <= Q; i++) {
const S = lines[i].split(/\s/);
if (S[0] == 'swap') {
const [A,B] = S.slice(1).map((i)=>Number(i)-1);
[students[A],students[B]] = [students[B],students[A]];
} else if (S[0] == 'reverse') {
students.reverse();
} else if (S[0] == 'resize') {
const C = Number(S[1]);
students = students.slice(0,C);
}
}
for (let i = 0; i < students.length; i++) {
console.log(students[i]);
}
});
Python
N,Q = map(int,input().split())
students = [int(x) for x in range(1,N+1)]
for _ in range(Q):
S = input().split()
if S[0] == 'swap':
a = int(S[1]) - 1
b = int(S[2]) - 1
students[a], students[b] = students[b], students[a]
elif S[0] == 'resize':
c = int(S[1])
if len(students) > c:
students = students[:c]
else:
students.reverse()
for p in students:
print(p)
最後に
凄く複雑に見えて、やっていることは単純。スプレッド演算子と map で、順列な配列を作成してみたり。インデックスのマイナス 1 を map で一括にやってみたり、その際、slice で配列を指定してみたり。
ここまでやってきたことの集大成というか、まとめというか、綺麗に書けたと思います。プロの方なら、もっと美しく書いてしまうのだろうけれど。うん、わかりやすくは書けていると思う。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません