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 !
333
constró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-1
acordo com sua especificação?Respostas:
Python 2 -
208191 185 180 172 164156 bytesO problema é que ele remove o ar e as bombas, se estiverem na pilha, contam.
EDIT: Eu troquei para Python 2 para salvar um byte, mas agora a entrada deve ser colocada entre chaves como '3312123'
EDIT2: Também estou orgulhoso da contagem do acumulador
EDIT3: Obrigado por todas as suas sugestões, eu nunca teria pensado que poderia obtê-lo tão baixo
fonte
t[:10][::-1]
vez dereverse()
salvar 4 bytes e talvez também use Python 2 para salvar um colchete noprint
? Trata de mais 5 almas salvas para mim :)05AB1E ,
2836 bytes05AB1E usa a codificação CP-1252 .
Experimente online!
fonte
T£ÀRS
->
Lágrimas->
, estou chorando ...Retina ,
5856 bytesExperimente online!
fonte
Python 2,
150146 bytesObrigado a Pâris Douady pela fórmula de pontos e por salvar 4 bytes.
fonte
for c in input()
diretamenteJavascript,
267264249 almas sacrificadasVersão editada, porque a anterior estava incorreta para entradas maiores. Jogou um pouco mais longe ao fazer
string.prototype.replace()
uma chamada de função acessada por matriz. Explicação:f('11231');
retorna2
. Experimente onlinefonte
Haskell,
221 202 181 177166almasbytesExperimente em ideone . Leva itens como lista inteira.
Uso:
(Edit: Old) Explicação:
fonte
f "0000000000" ""
, você simplesmente não precisa de espaços entre elas. Eu adicionei uma explicação para o código.