MontyHallProblemBurster.psm1

Update-FormatData -AppendPath "$PSScriptRoot\MontyHallProblemBurster.ps1xml"

Function Invoke-MasterStart {
    $R = Get-Random -InputObject @(0,0,1) -Count 3; 
    @{'a' = $R[0];'b' = $R[1];'c' = $R[2]}
}

Function Invoke-PlayerStart {Get-Random -InputObject @('a','b','c')}

Function Invoke-MasterRestart {
    param (
        [HashTable]$MasterStart,
        [String]$PlayerStart
    )
    $MasterStart.GetEnumerator().Where({$_.Value -ne 1 -and $_.Name -ne $PlayerStart})[0].Name
}

Function Invoke-PlayerRestart {
    param (
        [String]$MasterRestart,
        [String]$PlayerStart,
        [Parameter(Mandatory=$true)][bool]$Change
    )
    if (!$Change) {$PlayerStart} else {@('a','b','c').Where({$_ -ne $PlayerStart -and $_ -ne $MasterRestart})}
}

Function Start-MontyHallProblemBurster {
    param ($Count = 100)
    $Objects = @()
    
    for ($i = 1 ; $i -le $Count ; $i++) {
        
        # Master
        $MasterStart = Invoke-MasterStart
        
        # Player1
        $Player1Start = Invoke-PlayerStart 
        $Master1Restart = Invoke-MasterRestart -MasterStart $MasterStart -PlayerStart $Player1Start
        $Player1Restart = Invoke-PlayerRestart -MasterRestart $Master1Restart -PlayerStart $Player1Start -Change:$true
        $Player1Result = [bool]$MasterStart[$Player1Restart]
        
        # Player2
        $Player2Start = Invoke-PlayerStart 
        $Master2Restart = Invoke-MasterRestart -MasterStart $MasterStart -PlayerStart $Player2Start
        $Player2Restart = Invoke-PlayerRestart -MasterRestart $Master2Restart -PlayerStart $Player2Start -Change:$false
        $Player2Result = [bool]$MasterStart[$Player2Restart]
        
        # Current Game Result
        $Object = Select-Object -InputObject $i -Property @(
            ,@{Name = 'GameNumber';Expression = {$i}}
            ,@{Name = 'Doors'; Expression = {"A:$($MasterStart['a']),B:$($MasterStart['b']),C:$($MasterStart['c'])"}}
            ,@{Name = 'Player1(change_true)';Expression = {$Player1Result}}
            ,@{Name = 'Player2(change_false)';Expression = {$Player2Result}}
            ,@{Name = 'Player1Steps';Expression    = {"$Player1Start=>$Master1Restart=>$Player1Restart"}}
            ,@{Name = 'Player2Steps';Expression    = {"$Player2Start=>$Master2Restart=>$Player2Restart"}}
        )
        
        $Object.psobject.Typenames.Insert(0,'MontyHall.Stat')
        $Objects += $Object
        $Object
        
    }
    
    # Games Result
    Write-Verbose -Verbose -Message "Win Stat:"
    Write-Verbose -Verbose -Message "Player1(change_true): $($Objects.Where({$_.'Player1(change_true)'}).Count)"
    Write-Verbose -Verbose -Message "Player2(change_false): $($Objects.Where({$_.'Player2(change_false)'}).Count)"
    
}