# coding: utf-8
import random
from random import randint
from sys import argv

NUMBER_OF_DOORS = int(argv[1]) if len(argv) >=2 and argv[1].isdecimal() else 3
VERBOSE = "--verbose" in argv or "-v" in argv
if VERBOSE: print(f"going with {NUMBER_OF_DOORS} doors")

def make_doors(): 
    doors = NUMBER_OF_DOORS * [False]
    doors[randint(0, NUMBER_OF_DOORS - 1)] = True
    return doors

def pick(doors): 
    """
    Pick a door, return its index
    """
    return random.randint(0, NUMBER_OF_DOORS - 1)

def non_winning_indices(doors):
    return [i for i in range(0, NUMBER_OF_DOORS) if i != doors.index(True)]
    
def open_door(doors, picked): 
    """
    Opens the only door that:
    - isn't winning
    - hasn't been chosen by the player
    """
    return [i for i in non_winning_indices(doors) if i != picked][0]

def change_pick(old_pick, opened): 
    return (
            old_pick if random.choice([True, False]) 
            else [i for i in range(0, NUMBER_OF_DOORS) if i not in (opened, old_pick)][0]
    )

def experiment(verbose=False):
    """
    Returns (player_won, player_switched) booleans.
    """
    doors = make_doors()
    # if verbose: print(f"doors are       {doors!r}\n\t(winning is {doors.index(True)+1})")
    old_pick = pick(doors)
    # if verbose: print(f"player picked   {old_pick+1}")
    opened = open_door(doors, old_pick)
    # if verbose: print(f"opened door     {opened+1}")
    new_pick = change_pick(old_pick, opened)
    # if verbose: print(f"player chose to {'switch' if new_pick != old_pick else 'stay'}")
    if verbose:
        print(f"- {'won ' if doors[new_pick] else 'lost'} by {'switching' if new_pick != old_pick else 'staying'}")
    return doors[new_pick], new_pick != old_pick
    
def do_experiments(verbose=False): 
    won_by_switching = won_by_staying = 0
    for _ in range(100_000):
        won, switched = experiment(verbose)
        if won and switched:
            won_by_switching += 1
        elif won: 
            won_by_staying += 1
    return won_by_switching, won_by_staying

if __name__ == "__main__":
    won_by_switching, won_by_staying = do_experiments(VERBOSE)
    def chance(won):
        return won/100_000
    if won_by_switching > won_by_staying:
        print(f"Oui: {won_by_switching} ({chance(won_by_switching)*100:2f}% de chance) contre {won_by_staying} ({chance(won_by_staying)*100:2f}% de chance)")
    elif won_by_switching == won_by_staying:
        print("Je sais pas")
    else:
        print(f"Non: {won_by_switching} ({chance(won_by_switching)*100:2f}% de chance) contre {won_by_staying} ({chance(won_by_staying)*100:2f}% de chance)")

