第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 Breverseresize 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 で配列を指定してみたり。

ここまでやってきたことの集大成というか、まとめというか、綺麗に書けたと思います。プロの方なら、もっと美しく書いてしまうのだろうけれど。うん、わかりやすくは書けていると思う。

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

Python の第66回はこちら