Powershell - 168 131 125 115
Código de golf:
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)%"
Cambios del original: se
recortaron 53 caracteres del guión original con algunas modificaciones.
- Se eliminaron espacios y paréntesis donde PowerShell lo perdona.
- Usó un
ForEach-Object
bucle, a través del %
alias, en lugar de while
.
- Se utilizaron rangos de números (por ejemplo:) en
0..2
lugar de matrices definidas explícitamente.
- Eliminado
write
del último comando: resulta que no lo necesito después de todo.
- Volteó la expresión de la elección del host para usar la sintaxis de canalización más corta.
- Reemplazado 10000 con 1e4.
- Tomó la sugerencia de Joey y omitido
Get-
de Get-Random
. (Nota: esta modificación aumenta significativamente el tiempo de ejecución. ¡En mi sistema saltó de unos 20 segundos a casi media hora por ejecución!)
- Se utiliza el truco de Rynant de hacer
$T+=...
en lugar de if(...){$T++}
.
Algunas notas:
Este guión pretende ser lo más conciso posible, a la vez que es una simulación tan completa del escenario de Monty Hall como sea posible. No hace suposiciones sobre dónde estará el auto o qué puerta elegirá el jugador primero. Ni siquiera se hacen suposiciones sobre qué puerta específica elegirá el host en un escenario dado. Las únicas suposiciones restantes son las que realmente se mencionan en el problema de Monty Hall:
- El anfitrión elegirá una puerta que el jugador no eligió primero, que no contenga el automóvil.
- Si el jugador abrió la puerta con el auto primero, eso significa que hay dos opciones posibles para el anfitrión.
- La elección final del jugador no será ni su elección inicial ni la elección del anfitrión.
Sin golf, con comentarios:
# 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
He ejecutado este script varias veces y produce resultados consistentemente muy cercanos a dos tercios de probabilidad. Algunas muestras:
(Como anteriormente)
(Utilizando Get-Random
como la definición de alias, en lugar de solo Random
)
- 66,92%
- 67,71%
- 66,6%
- 66,88%
- 66,68%
- 66,16%
- 66,96%
- 66,7%
- 65,96%
- 66,87%