Powershell - 168 131 125 115
Código de golfe:
nal g Random;1..1e4|%{$C=g 3;$P=g 3;$T+=$C-eq(0..2|?{$_-ne$P-and$_-ne(0..2|?{$_-ne$P-and$_-ne$C}|g)})};"$($T/100)%"
Alterações do original:
aparadas 53 caracteres do script original com algumas modificações.
- Espaços e parênteses removidos onde o PowerShell está perdoando.
- Usou um
ForEach-Objectloop, via %alias, em vez de while.
- Intervalos numéricos usados (por exemplo
0..2:) em vez de matrizes definidas explicitamente.
- Removido
writedo último comando - acontece que não preciso disso, afinal.
- Alternou a expressão para a escolha do host em torno de usar a sintaxe de pipelining mais curta.
- 10000 substituído por 1e4.
- Tomou a sugestão de Joey e omitiu
Get-a partir Get-Random. (Nota: essa modificação aumenta significativamente o tempo de execução. No meu sistema, ela saltou de cerca de 20 segundos para quase meia hora por execução!)
- Usado truque de Rynant de fazer
$T+=...em vez de if(...){$T++}.
Algumas notas:
Este script deve ser o mais conciso possível, além de ser o mais simulação possível do cenário de Monty Hall. Não faz suposições sobre onde o carro estará ou qual porta o jogador escolherá primeiro. Nem sequer são feitas suposições para qual porta específica o host escolherá em qualquer cenário. As únicas suposições restantes são aquelas que são realmente declaradas no problema de Monty Hall:
- O anfitrião escolherá uma porta que o jogador não escolheu primeiro, que não contém o carro.
- Se o jogador abriu a porta com o carro primeiro, isso significa que existem duas opções possíveis para o anfitrião.
- A escolha final do jogador não será nem sua escolha inicial nem a escolha do anfitrião.
Ungolfed, com comentários:
# Setup a single-character alias for Random, to save characters later.
# Note: Script will run a lot (about 500 times) faster if you use Get-Random here.
# Seriously, as it currently is, this script will take about a half-hour or more to run.
# With Get-Random, it'll take less than a minute.
nal g Random;
# Run a Monty Hall simulation for each number from 1 to 10,000 (1e4).
1..1e4|%{
# Set car location ($C) and player's first pick ($P) to random picks from a pool of 3.
# Used in this way, Random chooses from 0..2.
$C=g 3;$P=g 3;
# Increment win total ($T) if the car is behind the door the player finally chooses.
# (Player's final choice represented by nested script.)
$T+=$C-eq(
# Filter the doors (0..2) to determine player's final choice.
0..2|?{
# Player's final choice will be neither their original choice, nor the host's pick.
# (Host's pick represented by nested script.)
$_-ne$P-and$_-ne(
# Filter the doors to determine host's pick.
0..2|?{
# Host picks from door(s) which do not contain the car and were not originally picked by the player.
$_-ne$P-and$_-ne$C
# Send filtered doors to Random for host's pick.
}|g
)
}
)
};
# After all simulations are complete, output overall win percentage.
"$($T/100)%"
# Variable & alias cleanup. Not included in golfed script.
rv C,P,T;ri alias:g
Eu executei esse script várias vezes e sempre gera resultados muito próximos da probabilidade de dois terços. Algumas amostras:
(Como acima)
(Usando Get-Randomcomo a definição de alias, em vez de apenas Random)
- 66,92%
- 67,71%
- 66,6%
- 66,88%
- 66,68%
- 66,16%
- 66,96%
- 66,7%
- 65,96%
- 66,87%