The Golffer Adventure
Este é o primeiro desafio ! Mais tarde haverá mais desafios que exigirão dados do desafio anterior :)
Capítulo 1: O Vaso
Vamos imaginar um minuto. Você é um Deus poderoso, seus poderes são ilimitados, mas exigem uma coisa: Almas. Cada alma é aqui representada por um byte, cada byte que você usa sacrifica uma alma. Portanto, o objetivo é obviamente salvar a maior quantidade de pessoas, sacrificando a menor quantidade de almas.
Seu primeiro desafio é salvar uma pequena vila, o diabo está disposto a não destruir a vila inteira se você resolver o desafio dele.
O desafio :
Você tem um vaso vertical que pode conter exatamente 10 itens (incluindo ar). Se você colocar uma coisa nesse vaso, a gravidade fará com que ela caia no fundo. Se o vaso já estiver cheio (e sempre cheio, se você o considerar como "cheio de ar"), a entrada substituirá o elemento na parte superior do vaso.
Aqui está o conjunto de coisas permitidas:
- Ar
0 / - Uma pedra
1 / - - Uma folha
2 / ~ - Uma bomba
3 / x
Se houver uma pedra ou uma folha em cima de "A Bomb", ela explodirá e destruirá a coisa em cima dela.
A entrada é a lista das coisas que você colocará no vaso a cada turno.
Exemplo: 11231: Você colocará 2 pedras, depois uma folha, depois uma bomba e finalmente uma última pedra.
Quando o vaso é estático, você pode começar a contar com a seguinte regra:
- Rock adiciona 1 unidade ao acumulador
- Folha multiplica o acumulador por 2
- Bomba decrementa o acumulador em 1
- O ar não faz nada
(Você precisa começar a contar a partir do topo do vaso)
Aqui está a simulação que obtemos usando "11231" como entrada:
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
E a saída será 2 (calculada como ((0 x 2) + 1) + 1) Não há necessidade de imprimir todos os estados do vaso!
O programa base (Python3)
Você pode executá-lo para entender como funciona.
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)
Versão em golfe (Python3, sem exibição de vaso): 360 bytes = 360 pontos
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)
Se você deseja testar se o seu programa funciona corretamente, você pode testar esta entrada: 12122111131
A resposta correta é 43 :) (Obrigado Emigna)
Agora, para os pontos:
- (x) pontos em que: x é a quantidade de bytes necessários para escrever seu programa. Se você responder após o lançamento do próximo desafio, os pontos desse desafio não serão adicionados à sua quantidade total de pontos.
O objetivo é manter uma quantidade mínima de pontos durante todo o desafio :) Se você pular uma parte do desafio, terá (wx + 1) pontos por padrão para a parte ignorada (onde wx é a pior pontuação para esse desafio).
Dados que serão necessários para o próximo desafio:
Saída quando entrada = 10100000200310310113030200221013111213110130332101
Campeão atual: Emigna
Boa sorte a todos !
333constrói um vaso [0, 0, 0, 0, 0, 0, 0, 3, 3, 3]no seu algoritmo de golfe e, portanto, uma pontuação de -3, mas não deveria ser [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]e então uma pontuação de -1acordo com sua especificação?