'''
This is an interpreter for the Pancake Stack esolang. To use it, paste your program into the
stdin, followed by any number of ~s on one line. Regular stdin is after the ~s.
The difference between this and the last version is that this version removed all the
unnecessary `global` statements.
'''
import re
import sys
def push(match):
stack.append(len(match.group(1)))
def eat():
stack.pop()
def combine_pancakes():
a, b = stack.pop(), stack.pop()
stack.append(a + b)
def give_pancake():
stack.append(int(input()))
def give_hotcake():
stack.append(ord(sys.stdin.read(1)))
def show_pancake():
print(chr(stack[-1]), end='')
def take_from_pancakes():
a, b = stack.pop(), stack.pop()
stack.append(a - b)
def flip_pancakes():
stack[-1], stack[-2] = stack[-2], stack[-1]
def put_another_pancake():
stack.append(stack[-1])
def label(match):
label = match.group(1)
if label in labels:
return
labels[label] = stack[-1] - 2
def not_tasty(match):
if not stack[-1]:
line = labels[match.group(1)]
def is_tasty():
if stack[-1]:
line = labels[match.group(1)]
def put_syrup():
for i in range(len(stack)): stack[i] += 1
def put_butter():
stack[-1] += 1
def remove_syrup():
for i in range(len(stack)): stack[i] -= 1
def remove_butter():
stack[-1] -= 1
def eat_all():
sys.exit(0)
program = []
line = input()
while '~' not in line:
program.append(line)
line = input()
commands = {
r'Put this ([^ ]*?) pancake on top!': push,
r'Eat the pancake on top!': eat,
r'Put the top pancakes together!': combine_pancakes,
r'Give me a pancake!': give_pancake,
r'How about a hotcake?': give_hotcake,
r'Show me a pancake!': show_pancake,
r'Take from the top pancakes!': take_from_pancakes,
r'Flip the pancakes on top!': flip_pancakes,
r'Put another pancake on top!': put_another_pancake,
r'\[(.*)\]': label,
r'If the pancake isn\'t tasty, go over to "(.*)".': not_tasty,
r'If the pancake is tasty, go over to "(.*)".': is_tasty,
r'Put syrup on the pancakes!': put_syrup,
r'Put butter on the pancakes': put_butter,
r'Take off the syrup!': remove_syrup,
r'Take off the butter!': remove_butter,
r'Eat all of the pancakes!': eat_all
}
labels = dict()
line = 0
stack = []
while program[line] != 'Eat all of the pancakes!':
#print("%i:%s:%s"%(line,program[line],stack)) #for debug purposes
for command in commands.keys():
match = re.match(command, program[line])
if match:
try: commands[command](match)
except TypeError: commands[command]()
break
else:
print('Line %i is not a valid command'%line, file=sys.stderr)
sys.exit(1)
line += 1
JycnClRoaXMgaXMgYW4gaW50ZXJwcmV0ZXIgZm9yIHRoZSBQYW5jYWtlIFN0YWNrIGVzb2xhbmcuIFRvIHVzZSBpdCwgcGFzdGUgeW91ciBwcm9ncmFtIGludG8gdGhlCnN0ZGluLCBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIH5zIG9uIG9uZSBsaW5lLiBSZWd1bGFyIHN0ZGluIGlzIGFmdGVyIHRoZSB+cy4KClRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIGxhc3QgdmVyc2lvbiBpcyB0aGF0IHRoaXMgdmVyc2lvbiByZW1vdmVkIGFsbCB0aGUKdW5uZWNlc3NhcnkgYGdsb2JhbGAgc3RhdGVtZW50cy4KJycnCmltcG9ydCByZQppbXBvcnQgc3lzCgpkZWYgcHVzaChtYXRjaCk6CiAgICBzdGFjay5hcHBlbmQobGVuKG1hdGNoLmdyb3VwKDEpKSkKZGVmIGVhdCgpOgogICAgc3RhY2sucG9wKCkKZGVmIGNvbWJpbmVfcGFuY2FrZXMoKToKICAgIGEsIGIgPSBzdGFjay5wb3AoKSwgc3RhY2sucG9wKCkKICAgIHN0YWNrLmFwcGVuZChhICsgYikKZGVmIGdpdmVfcGFuY2FrZSgpOgogICAgc3RhY2suYXBwZW5kKGludChpbnB1dCgpKSkKZGVmIGdpdmVfaG90Y2FrZSgpOgogICAgc3RhY2suYXBwZW5kKG9yZChzeXMuc3RkaW4ucmVhZCgxKSkpCmRlZiBzaG93X3BhbmNha2UoKToKICAgIHByaW50KGNocihzdGFja1stMV0pLCBlbmQ9JycpCmRlZiB0YWtlX2Zyb21fcGFuY2FrZXMoKToKICAgIGEsIGIgPSBzdGFjay5wb3AoKSwgc3RhY2sucG9wKCkKICAgIHN0YWNrLmFwcGVuZChhIC0gYikKZGVmIGZsaXBfcGFuY2FrZXMoKToKICAgIHN0YWNrWy0xXSwgc3RhY2tbLTJdID0gc3RhY2tbLTJdLCBzdGFja1stMV0KZGVmIHB1dF9hbm90aGVyX3BhbmNha2UoKToKICAgIHN0YWNrLmFwcGVuZChzdGFja1stMV0pCmRlZiBsYWJlbChtYXRjaCk6CiAgICBsYWJlbCA9IG1hdGNoLmdyb3VwKDEpCiAgICBpZiBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgcmV0dXJuCiAgICBsYWJlbHNbbGFiZWxdID0gc3RhY2tbLTFdIC0gMgpkZWYgbm90X3Rhc3R5KG1hdGNoKToKICAgIGlmIG5vdCBzdGFja1stMV06CiAgICAgICAgbGluZSA9IGxhYmVsc1ttYXRjaC5ncm91cCgxKV0KZGVmIGlzX3Rhc3R5KCk6CiAgICBpZiBzdGFja1stMV06CiAgICAgICAgbGluZSA9IGxhYmVsc1ttYXRjaC5ncm91cCgxKV0KZGVmIHB1dF9zeXJ1cCgpOgogICAgZm9yIGkgaW4gcmFuZ2UobGVuKHN0YWNrKSk6IHN0YWNrW2ldICs9IDEKZGVmIHB1dF9idXR0ZXIoKToKICAgIHN0YWNrWy0xXSArPSAxCmRlZiByZW1vdmVfc3lydXAoKToKICAgIGZvciBpIGluIHJhbmdlKGxlbihzdGFjaykpOiBzdGFja1tpXSAtPSAxCmRlZiByZW1vdmVfYnV0dGVyKCk6CiAgICBzdGFja1stMV0gLT0gMQpkZWYgZWF0X2FsbCgpOgogICAgc3lzLmV4aXQoMCkKCnByb2dyYW0gPSBbXQpsaW5lID0gaW5wdXQoKQp3aGlsZSAnficgbm90IGluIGxpbmU6CiAgICBwcm9ncmFtLmFwcGVuZChsaW5lKQogICAgbGluZSA9IGlucHV0KCkKCmNvbW1hbmRzID0gewogICAgcidQdXQgdGhpcyAoW14gXSo/KSBwYW5jYWtlIG9uIHRvcCEnOiBwdXNoLAogICAgcidFYXQgdGhlIHBhbmNha2Ugb24gdG9wISc6IGVhdCwKICAgIHInUHV0IHRoZSB0b3AgcGFuY2FrZXMgdG9nZXRoZXIhJzogY29tYmluZV9wYW5jYWtlcywKICAgIHInR2l2ZSBtZSBhIHBhbmNha2UhJzogZ2l2ZV9wYW5jYWtlLAogICAgcidIb3cgYWJvdXQgYSBob3RjYWtlPyc6IGdpdmVfaG90Y2FrZSwKICAgIHInU2hvdyBtZSBhIHBhbmNha2UhJzogc2hvd19wYW5jYWtlLAogICAgcidUYWtlIGZyb20gdGhlIHRvcCBwYW5jYWtlcyEnOiB0YWtlX2Zyb21fcGFuY2FrZXMsCiAgICByJ0ZsaXAgdGhlIHBhbmNha2VzIG9uIHRvcCEnOiBmbGlwX3BhbmNha2VzLAogICAgcidQdXQgYW5vdGhlciBwYW5jYWtlIG9uIHRvcCEnOiBwdXRfYW5vdGhlcl9wYW5jYWtlLAogICAgcidcWyguKilcXSc6IGxhYmVsLAogICAgcidJZiB0aGUgcGFuY2FrZSBpc25cJ3QgdGFzdHksIGdvIG92ZXIgdG8gIiguKikiLic6IG5vdF90YXN0eSwKICAgIHInSWYgdGhlIHBhbmNha2UgaXMgdGFzdHksIGdvIG92ZXIgdG8gIiguKikiLic6IGlzX3Rhc3R5LAogICAgcidQdXQgc3lydXAgb24gdGhlIHBhbmNha2VzISc6IHB1dF9zeXJ1cCwKICAgIHInUHV0IGJ1dHRlciBvbiB0aGUgcGFuY2FrZXMnOiBwdXRfYnV0dGVyLAogICAgcidUYWtlIG9mZiB0aGUgc3lydXAhJzogcmVtb3ZlX3N5cnVwLAogICAgcidUYWtlIG9mZiB0aGUgYnV0dGVyISc6IHJlbW92ZV9idXR0ZXIsCiAgICByJ0VhdCBhbGwgb2YgdGhlIHBhbmNha2VzISc6IGVhdF9hbGwKfQpsYWJlbHMgPSBkaWN0KCkKbGluZSA9IDAKc3RhY2sgPSBbXQp3aGlsZSBwcm9ncmFtW2xpbmVdICE9ICdFYXQgYWxsIG9mIHRoZSBwYW5jYWtlcyEnOgogICAgI3ByaW50KCIlaTolczolcyIlKGxpbmUscHJvZ3JhbVtsaW5lXSxzdGFjaykpICNmb3IgZGVidWcgcHVycG9zZXMKICAgIGZvciBjb21tYW5kIGluIGNvbW1hbmRzLmtleXMoKToKICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKGNvbW1hbmQsIHByb2dyYW1bbGluZV0pCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIHRyeTogY29tbWFuZHNbY29tbWFuZF0obWF0Y2gpCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IGNvbW1hbmRzW2NvbW1hbmRdKCkKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoJ0xpbmUgJWkgaXMgbm90IGEgdmFsaWQgY29tbWFuZCclbGluZSwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIHN5cy5leGl0KDEpCiAgICBsaW5lICs9IDE=