第66回【Python】【配列に対しての複雑な処理】集団行動
現在取り組んでいるのは、paiza ラーニング問題集「配列活用メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 66 回目です。
「配列活用メニュー」のラストです。終盤は、かなり応用力が問われる問題が続き楽しかったです。少しは成長したでしょうか。と、もう終わりの雰囲気を出していますが、まだまだ続く予定です。
それでは、今日も頑張ってみようと思います。
【配列に対しての複雑な処理】集団行動
あなたは集団行動のリーダーです。次のような指示を出すことで様々な列の操作ができます。
・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 ≦ N , Q ≦ 100
・S_i は、swap A B
, reverse
, resize C
のいずれかの形式です。
・1 ≦ C ≦ N
・A, B はその時点で操作可能であるような生徒番号が与えられます。
100 5
resize 29
reverse
swap 18 24
resize 47
reverse
なかなかに横暴なリーダーが指示を出しているようです。
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)
VBA
NQ = Split(Cells(1, 1), " ")
N = Val(NQ(0))
Q = Val(NQ(1))
Dim students() As Integer
ReDim students(N - 1)
For i = 0 To N - 1
students(i) = i + 1
Next
For i = 1 To Q
S = Split(Cells(i + 1, 1), " ")
If S(0) = "swap" Then
A = Val(S(1)) - 1
B = Val(S(2)) - 1
temp = students(A)
students(A) = students(B)
students(B) = temp
ElseIf S(0) = "resize" Then
C = Val(S(1))
If UBound(students) > C Then
ReDim Preserve students(C - 1)
End If
Else
Dim arrTemp() As Integer
ReDim arrTemp(UBound(students))
k = 0
For j = UBound(students) To LBound(students) Step -1
arrTemp(j) = students(k)
k = k + 1
Next
students = arrTemp
End If
Next
For Each p In students
Debug.Print p
Next
最後に
Python では簡単に書くことができたけれど、VBA で書ききれたことに喜びもひとしお。普段だったら、さっさとワークシートに逃げていた気がします。勉強になったと思う。
これにて、「配列活用メニュー」は終了です。次からは、「条件分岐メニュー」に挑戦してみようと思っています。正直、素通りできるくらい簡単な問題でも、じっくり 1 問ずつ取り組んでいると、いろいろな気づきがあります。だからまだ辞めない。頑張る。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません