L'aventure du golfeur
C'est le premier défi! Il y aura plus de défis plus tard qui nécessiteront des données du défi précédent :)
Chapitre 1: Le vase
Imaginons une minute .. Vous êtes un Dieu puissant, vos pouvoirs sont illimités mais nécessitent une chose: les âmes. Chaque âme est ici représentée par un octet, chaque octet que vous utilisez sacrifie une âme. Le but est donc évidemment de sauver le plus de monde possible tout en sacrifiant le moins d'âmes.
Votre premier défi est de sauver un petit village, le diable est prêt à ne pas détruire tout le village si vous résolvez son défi.
Le défi :
Vous avez un vase vertical qui peut contenir exactement 10 choses (Air inclus). Si vous mettez quelque chose dans ce vase, la gravité fera tomber cette chose au fond. Si le vase est déjà plein (et il est toujours plein si vous le considérez comme "plein d'air"), l'entrée remplacera l'élément en haut du vase.
Voici l'ensemble des choses autorisées:
- Air
0 /
- Un rocher
1 / -
- Une feuille
2 / ~
- Une bombe
3 / x
S'il y a un rocher ou une feuille au-dessus de "A Bomb", il explosera et détruira la chose au-dessus.
L'entrée est la liste des choses que vous mettrez dans le vase à chaque tour.
Exemple : 11231: Vous mettrez 2 pierres, puis une feuille, puis une bombe et enfin une dernière pierre.
Lorsque le vase est statique, vous pouvez commencer à compter avec la règle suivante:
- Rock ajoute 1 unité à l'accumulateur
- Leaf multiplie l'accumulateur par 2
- Bombe décrémenter l'accumulateur de 1
- L'air ne fait rien
(Vous devez commencer à compter à partir du haut du vase)
Voici la simulation que nous obtenons en utilisant "11231" en entrée:
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
Et la sortie sera 2 (calculée comme ((0 x 2) + 1) + 1
) Pas besoin d'imprimer tous les états du vase!
Le programme de base (Python3)
Vous pouvez l'exécuter pour comprendre comment cela fonctionne.
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)
Version golfée (Python3, pas d'affichage Vase): 360 octets = 360 points
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)
Si vous voulez tester si votre programme fonctionne correctement, vous pouvez tester cette entrée: 12122111131
La bonne réponse est 43 :) (Merci Emigna)
Maintenant pour les points:
- (x) indique où: x est la quantité d'octets nécessaires pour écrire votre programme. Si vous répondez après la publication du prochain défi, les points de ce défi ne seront pas ajoutés à votre total de points.
Le but est de garder un minimum de points pendant tout le défi :) Si vous sautez l'une des parties du défi, vous aurez (wx + 1) points par défaut pour la partie sautée (où wx est le pire score) pour ce défi).
Données qui seront nécessaires pour le prochain défi:
Sortie lorsque entrée = 10100000200310310113030200221013111213110130332101
Champion actuel: Emigna
Bonne chance à tous !
333
construit un vase[0, 0, 0, 0, 0, 0, 0, 3, 3, 3]
dans votre algorithme de golf et donc un score de-3
, mais ne devrait-il pas en être[0, 0, 0, 0, 0, 0, 0, 0, 0, 3]
ainsi un score de-1
selon vos spécifications?Réponses:
Python 2 -
208191 185 180 172 164156 octetsLa panne est qu'il enlève de l'air et les bombes si elles sont sur la pile comptent alors.
EDIT: je suis passé à Python 2 pour enregistrer un octet, mais maintenant l'entrée doit être mise entre accolades comme '3312123'
EDIT2: Je suis également un peu fier du nombre d'accumulateurs
EDIT3: Merci pour toutes vos suggestions, je n'aurais jamais pensé que je pourrais l'obtenir si bas
la source
t[:10][::-1]
au lieu dereverse()
pour enregistrer 4 octets et utilisez peut-être Python 2 pour enregistrer un support sur leprint
? Vient à 5 âmes de plus sauvées pour moi :)05AB1E ,
2836 octets05AB1E utilise le codage CP-1252 .
Essayez-le en ligne!
la source
T£ÀRS
->
Des larmes->
je pleure bien ...Rétine ,
5856 octetsEssayez-le en ligne!
la source
Python 2,
150146 bytesMerci à Pâris Douady pour la formule des points et pour avoir économisé 4 octets.
la source
for c in input()
directementJavascript,
267264249 âmes sacrifiéesVersion modifiée, car la précédente était incorrecte pour les entrées plus importantes. Il a joué un peu plus loin en faisant
string.prototype.replace()
un appel de fonction accessible par la baie. Explication:f('11231');
retourne2
. Essayez-le en lignela source
Haskell,
221 202 181 177 177166 octets d'âmesEssayez-le sur ideone . Prend les éléments sous forme de liste entière.
Usage:
(Édition: ancienne) Explication:
la source
f "0000000000" ""
, vous n'avez juste pas besoin d'espace entre elles. J'ai ajouté une explication au code.