Гольфист приключение
Это первый вызов! Позже будет больше испытаний, которые потребуют данных из предыдущего испытания :)
Глава 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
согласно вашей спецификации?Ответы:
Python 2 -
208191 185 180 172 164156 байтСбой в том, что он удаляет воздух и бомбы, если он находится в стеке, а затем считается.
РЕДАКТИРОВАТЬ: я перешел на Python 2, чтобы сохранить байт, но теперь ввод должен быть заключен в фигурные скобки, как «3312123»
EDIT2: я также горжусь счетчиком аккумуляторов
РЕДАКТИРОВАТЬ 3: Спасибо за все ваши предложения, я никогда бы не подумал, что я мог бы получить это так низко
источник
t[:10][::-1]
вместо того,reverse()
чтобы сохранить 4 байта, а также, возможно, используйте Python 2, чтобы сохранить скобку наprint
? Приходит еще 5 душ, спасенных для меня :)05AB1E ,
2836 байт05AB1E использует кодировку CP-1252 .
Попробуйте онлайн!
источник
T£ÀRS
->
Слезы,->
я плачу хорошо ...Сетчатка ,
5856 байтПопробуйте онлайн!
источник
Python 2,
150146 байтСпасибо Pâris Douady за формулу очков и за сохранение 4 байтов.
источник
for c in input()
прямое действиеJavascript,
267264249 душ пожертвованоОтредактированная версия, потому что предыдущая была неправильной для больших входов. Гольф это немного дальше, сделав
string.prototype.replace()
вызов функции доступа к массиву. Объяснение:f('11231');
возвращается2
. Попробуйте онлайнисточник
Haskell,
221 202 181 177166душбайтовПопробуйте это на Ideone . Принимает элементы в виде целого списка.
Использование:
(Изменить: Старый) Объяснение:
источник
f "0000000000" ""
, между ними просто не должно быть пробелов. Я добавил объяснение к коду.