Created
September 8, 2022 14:38
-
-
Save DRMacIver/c5703c0733d5d6290c1f40019fb578a5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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