例1
from collections import deque
_ = input()
A = deque(map(int, input().split()))
balls = [A.popleft()]
balls_len = 1
while A:
balls.append(A.popleft())
balls_len += 1
while balls_len > 1 and balls[-1] == balls[-2]:
balls[-2] *= 2
balls.pop()
balls_len -= 1
print(*balls[::-1], sep='\n')
例2
_ = input()
A = map(int, input().split())
balls = []
balls_len = 0
for ball in A:
balls.append(ball)
balls_len += 1
while balls_len > 1 and balls[-1] == balls[-2]:
balls[-2] *= 2
balls.pop()
balls_len -= 1
print(*balls[::-1], sep='\n')
例1は、リアルっぽく A にあるボールを取り出して箱の中に移動しています。ボールを取り出すたびに A の要素が減っていきます。そのため、deque A が空になるとループを処理を終えます。
例2は A を参照しているだけです。文を使ってボールを取り出して(はいないけど)います。
「スタック・キューメニュー」の最終問題に相応しいのは例1でしょう。しかし注目すべきはそこではありません。
問題文にある絵図では上から入れて上から取り出しています。PUSH & POP です。横にすると後方から入れて後方から取り出しています。
ボールを入れるとそこの要素番号は -1 です。1つ前は -2 です。その2つのボールを比較して、数が同じなら要素番号 -2 の数を2倍にして、今入れた要素番号 -1 のボールを削除すると「結合」した形になります。
しかしこれで終わりではありません。結合した数とその前の数がまた同じになった場合は再び結合します。これを箱の底のボールに到達するまで全て調べていきます。
balls = [4, 2] ← 2 を入れる
↓
balls = [4, 2, 2]
↓
balls = [4, 4]
↓
balls = [8]
落ちゲーみたいですね。😊
ではここで私から課題を差し上げます。
プログラム例では後方から入れて後方から取り出す方式ですが、これを前方から入れて前方から取り出す方式に書き換えてください。
そうすると、最後は逆順にしないでそのまま画面に出力できるようになります。出来上がったらそれも提出してみましょう。