Powershell - 168 131 125 115
Kode 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)%"
Perubahan dari Asli:
Memotong 53 karakter dari skrip asli dengan beberapa modifikasi.
- Ruang dan kurung yang dihapus di mana PowerShell memaafkannya.
- Menggunakan
ForEach-Objectperulangan, melalui %alias, alih-alih while.
- Kisaran angka yang digunakan (misalnya:)
0..2alih-alih array yang didefinisikan secara eksplisit.
- Dihapus
writedari perintah terakhir - ternyata saya tidak membutuhkannya sama sekali.
- Membalik ekspresi untuk pilihan host sekitar untuk menggunakan sintaks pipelining yang lebih pendek.
- Digantikan 10000 dengan 1e4.
- Mengambil saran Joey dan dihilangkan
Get-dari Get-Random. (Catatan: Modifikasi ini secara signifikan menggembungkan run time. Pada sistem saya, itu melonjak dari sekitar 20 detik menjadi hampir setengah jam per run!)
- Menggunakan trik Rynant untuk melakukan
$T+=...alih - alih if(...){$T++}.
Beberapa catatan:
Script ini dimaksudkan untuk menjadi sesingkat mungkin, sambil juga simulasi skenario Monty Hall sebaik mungkin. Tidak ada asumsi di mana mobil akan berada, atau pintu mana yang akan dipilih pemain terlebih dahulu. Asumsi bahkan tidak dibuat untuk pintu tertentu tuan rumah akan memilih dalam skenario apa pun. Satu-satunya asumsi yang tersisa adalah yang sebenarnya dinyatakan dalam masalah Monty Hall:
- Tuan rumah akan memilih pintu yang pemain tidak memilihnya terlebih dahulu, yang tidak mengandung mobil.
- Jika pemain memilih pintu dengan mobil terlebih dahulu, itu berarti ada dua pilihan yang mungkin untuk tuan rumah.
- Pilihan akhir pemain tidak akan menjadi pilihan awal maupun pilihan tuan rumah.
Tidak disatukan, dengan komentar:
# 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
Saya telah menjalankan skrip ini beberapa kali dan secara konsisten menampilkan hasil yang sangat dekat dengan probabilitas dua pertiga. Beberapa sampel:
(Seperti di atas)
(Menggunakan Get-Randomsebagai definisi alias, bukan hanya Random)
- 66,92%
- 67,71%
- 66,6%
- 66,88%
- 66,68%
- 66,16%
- 66,96%
- 66,7%
- 65,96%
- 66,87%