Пригода гольфіста
Це перший виклик! Пізніше буде більше викликів, які потребуватимуть даних попереднього виклику :)
Глава 1: Ваза
Давайте уявимо хвилинку .. Ви - потужний Бог, ваші сили безмежні, але потребуєте одного: Душі. Кожна душа тут представлена байтом, кожен байт, який ви використовуєте, приносить в жертву душу. Отже, мета, очевидно, врятувати найбільшу кількість людей, при цьому жертвуючи найменшою кількістю душ.
Ваше перше завдання - врятувати маленьке село, чорт готовий не знищити все село, якщо ви вирішите його виклик.
Змагання :
У вас є вертикальна ваза, яка може містити рівно 10 речей (включено повітря). Якщо ви покладете річ у цю вазу, гравітація змусить цю річ впасти на дно. Якщо ваза вже заповнена (і вона завжди повна, якщо ви вважаєте її "повною повітря"), введення замінить елемент у верхній частині вази.
Ось набір дозволених речей:
- Повітря
0 / - Скеля
1 / - - Листок
2 / ~ - Бомба
3 / x
Якщо на вершині "Бомби" є скеля або лист, вона вибухне і знищить річ на її вершині.
Вхід - це список речей, які ви будете ставити у вазу щоразу.
Приклад: 11231: Ви покладете 2 скелі, потім листок, потім бомбу і нарешті останню скелю.
Коли ваза статична, ви можете почати рахувати за наступним правилом:
- Рок додає 1 одиницю до акумулятора
- Лист помножує акумулятор на 2
- Зниження бомби акумулятора на 1
- Повітря нічого не робить
(Почати рахувати потрібно з верхньої частини вази)
Ось моделювання, яке ми отримуємо, використовуючи "11231" як вхід:
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
А вихід буде 2 (розраховано як ((0 x 2) + 1) + 1) Не потрібно друкувати всі стани вази!
Базова програма (Python3)
Ви можете виконати його, щоб зрозуміти, як це працює.
def printVase(vase):
for i in vase:
if i == 1:
print("|-|")
elif i == 2:
print("|~|")
elif i == 3:
print("|x|")
else:
print("| |")
def updateVase(vase):
changed = False
for i in range(len(vase), -1, -1):
if i < len(vase) - 1:
if vase[i+1] == 3 and vase[i] in [1,2]:
vase[i], vase[i+1] = 0, 0
changed = True
if not vase[i+1] and vase[i] in [1, 2, 3]:
vase[i], vase[i+1] = vase[i+1], vase[i]
changed = True
return changed
userInput = input("Vase : ")
vase = [0 for i in range(0, 10)]
oldVase = vase
while updateVase(vase) or userInput != "":
if userInput != "":
vase[0] = int(userInput[0])
userInput = userInput[1::]
printVase(vase)
input()
accumulator = 0
for i in vase:
if i == 1:
accumulator += 1
if i == 2:
accumulator *= 2
if i == 3:
accumulator -= 1
print(accumulator)
Версія для гольфу (Python3, без відображення вази): 360 байт = 360 балів
def u(v):
c=0
for i in range(len(v),-1,-1):
if i<len(v)-1:
if v[i+1]==3 and v[i]in[1,2]:v[i],v[i+1],c=0,0,1
if not v[i+1]and v[i]in[1,2,3]:v[i],v[i+1],c=v[i+1],v[i],1
return c
l,v=input(),[0 for i in range(0, 10)]
while u(v)or l!="":
if l!="":v[0],l=int(l[0]),l[1::]
a=0
for i in v:
if i==1:a+=1
if i==2:a*=2
if i==3:a-=1
print(a)
Якщо ви хочете перевірити, чи правильно працює ваша програма, ви можете перевірити цей вхід: 12122111131
Правильна відповідь - 43 :) (Спасибі Емінья)
Тепер для балів:
- (x) точки, де: x - кількість байтів, необхідних для написання вашої програми. Якщо ви відповісте після наступного виклику, бали за цей виклик не додаватимуться до вашої загальної суми балів.
Мета - зберегти мінімальну кількість балів протягом усього виклику :) Якщо ви пропустите одну з частин виклику, у вас буде (wx + 1) балів за промовчанням за пропущену частину (де wx - найгірший бал для цього виклику).
Дані, необхідні для наступного виклику:
Вихід при вході = 10100000200310310113030200221013111213110130332101
Поточний чемпіон: Емінья
Успіхів усім!
333будує вазу [0, 0, 0, 0, 0, 0, 0, 3, 3, 3]в алгоритмі гольфу і, отже, бал -3, але чи не повинен бути, [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]а потім оцінка -1відповідно до вашої специфікації?