Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@DRMacIver
Created September 8, 2022 14:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DRMacIver/c5703c0733d5d6290c1f40019fb578a5 to your computer and use it in GitHub Desktop.
Save DRMacIver/c5703c0733d5d6290c1f40019fb578a5 to your computer and use it in GitHub Desktop.
import attr
from random import randint
@attr.s()
class World:
potatoes = attr.ib(default=0)
orcs = attr.ib(default=0)
destiny = attr.ib(default=0)
potato_cost = attr.ib(default=1)
@property
def ongoing(self):
return max(self.potatoes, self.orcs, self.destiny) < 10
@property
def won(self):
return self.potatoes == 10
def roll():
return randint(1, 6)
def sim(should_yeet=lambda x: False):
world = World()
while world.ongoing:
gam = roll()
world.potatoes = max(world.potatoes, 0)
world.orcs = max(world.orcs, 0)
world.destiny = max(world.destiny, 0)
while should_yeet(world) and world.potatoes >= world.potato_cost:
world.orcs -= 1
world.potatoes -= world.potato_cost
if gam in (1, 2):
# In the garden
garden = roll()
if garden == 1:
world.potatoes += 1
elif garden == 2:
world.potatoes += 1
world.destiny += 1
elif garden == 3:
world.destiny += 1
world.orcs += 1
elif garden == 4:
world.orcs += 1
world.potatoes -= 1
elif garden == 5:
world.potatoes -= 1
else:
assert garden == 6
world.potatoes += 2
elif gam in (3, 4):
# A knock at the door
door = roll()
if door == 1:
world.orcs += 1
elif door == 2:
world.destiny += 1
elif door == 3:
world.orcs += 1
world.destiny += 1
elif door == 4:
world.potatoes -= 1
world.orcs += 2
elif door == 5:
world.destiny += 1
elif door == 6:
world.potatoes += 2
else:
# World becomes darker
world.potato_cost += 1
return world
def p_win(sample=1000, should_yeet=lambda world: False):
victories = 0
for _ in range(sample):
if sim(should_yeet).won:
victories += 1
return victories / sample
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment