CATATAN
Masalah ini diambil dari utas reddit ini (peringatan spoiler!), Dan saya telah menyesuaikannya agar sesuai dengan format situs ini. Semua kredit diberikan kepada pengguna reddit "Coder_d00d".
Dalam masalah ini, kami akan mensimulasikan hutan.
Untuk hutan yang disimulasikan ini kita akan membahas 3 aspek.
- Pohon yang bisa berupa Pohon Sapling, Pohon atau Penatua.
- Lumberjacks (Dia menebang pohon, dia makan siang dan pergi ke Lava-try)
- Beruang (Ia menyerang para penebang pohon yang berbau seperti panekuk)
Peringatan kedepan: aturan-aturan ini kemungkinan besar tidak sempurna. Lihatlah mereka sebagai pedoman, dan jika Anda perlu mengubah sedikit pun hal itu baik-baik saja (tingkat pemijahan telah ditunjukkan sebagai masalah, lihat jawaban kuroi neko sebagai contohnya.
Siklus waktu:
Simulasi akan disimulasikan oleh bulan. Anda akan maju ke depan tepat waktu dengan tanda centang. Setiap "centang" mewakili satu bulan. Setiap 12 "ticks" mewakili satu tahun. Hutan kita akan berubah dan terus berubah. Kami akan mencatat kemajuan hutan kami dan menganalisis apa yang terjadi padanya.
Hutan:
Hutan itu akan menjadi hutan dua dimensi. Kami akan membutuhkan input N untuk mewakili ukuran hutan dalam kisi yang berukuran N x N. Di setiap lokasi Anda dapat memegang Pohon, Beruang atau Penebang. Mereka dapat menempati tempat yang sama tetapi seringkali peristiwa terjadi ketika mereka menempati tempat yang sama.
Hutan kami akan ditelurkan secara acak berdasarkan ukuran. Misalnya jika nilai Anda N = 10. Anda akan memiliki hutan 10 per 10 dan 100 spot.
- 10% dari Hutan akan mengadakan Lumberjack di 10 tempat acak. (Menggunakan 100 spot forest kami, ini seharusnya 10 penebang pohon)
- 50% dari Hutan akan menahan Pohon (Pohon dapat menjadi salah satu dari 3 jenis dan akan memulai sebagai yang tengah dari "Pohon") di tempat-tempat acak.
- 2% dari Hutan akan memiliki Beruang.
Bagaimana Anda menerima ukuran hutan terserah Anda (baca dari stdin, file, atau hardcode di dalamnya). Saya akan merekomendasikan menjaga N seperti 5 atau lebih tinggi. Hutan Kecil tidak terlalu menyenangkan.
Acara:
Selama simulasi akan ada acara. Peristiwa terjadi berdasarkan beberapa logika yang akan saya jelaskan di bawah ini. Saya akan menggambarkan peristiwa di bawah ini dalam setiap deskripsi 3 elemen hutan kita.
Peristiwa mengikuti urutan pohon pertama, penebang pohon kedua dan beruang terakhir.
Pohon:
Setiap bulan, Pohon memiliki peluang 10% untuk menghasilkan "Sapling" baru. Di ruang terbuka acak yang bersebelahan dengan Pohon, Anda memiliki peluang 10% untuk membuat "Sapling".
Sebagai contoh, Pohon di tengah hutan memiliki 8 titik lain di sekitarnya. Salah satunya (jika kosong) akan menjadi "Sapling".
Setelah 12 bulan keberadaannya, "Sapling" akan ditingkatkan ke "Tree". "Sapling" tidak dapat memunculkan pohon lain sampai jatuh tempo menjadi "Pohon".
Setelah "Sapling" menjadi pohon, ia dapat menelurkan "Sapling" baru lainnya.
Ketika "Pohon" telah ada selama 120 bulan (10 tahun), ia akan menjadi "Pohon Tua".
Penatua Pohon memiliki peluang 20% โโuntuk menelurkan "Sapling" baru, bukan 10%.
Jika tidak ada tempat berdekatan yang berdekatan dengan Pohon atau Pohon Tua, pohon itu tidak akan muncul.
Penebang:
Penebang memotong pohon, mereka melompat dan melompat mereka suka menekan bunga liar.
Setiap bulan penebang pohon akan berkeliaran. Mereka akan bergerak hingga 3 kali ke tempat yang dipilih secara acak yang berdekatan ke segala arah. Jadi misalnya Penebang pohon di tengah-tengah grid Anda memiliki 8 tempat untuk pindah. Dia akan berjalan ke tempat yang acak. Kemudian lagi. Dan akhirnya untuk ketiga kalinya. NB: Ini bisa berupa sembarang tempat (sehingga mereka bisa berjalan menjadi beruang, menghasilkan maul).
Ketika penebang pohon bergerak, jika ia menemukan Pohon (bukan pohon muda), ia akan berhenti dan pengembaraannya untuk bulan itu berakhir. Dia kemudian akan memanen pohon untuk kayu. Hapus pohonnya. Dapatkan 1 potong kayu.
Penebang pohon tidak akan memanen "Anak pohon".
Penebang pohon juga memanen Pohon Penatua. Pohon Elder bernilai 2 potong kayu.
Pelacakan Kayu:
Setiap 12 bulan jumlah kayu yang dipanen dibandingkan dengan jumlah kayu yang ada di hutan.
Jika kayu yang dikumpulkan sama atau melebihi jumlah penebang pohon di hutan, sejumlah penebang pohon baru dipekerjakan dan secara acak muncul di hutan.
Cari tahu jumlah penebang pohon untuk disewa dengan:
floor(lumber_collected / number_of_lumberjacks)
Namun jika setelah jangka waktu 12 bulan jumlah kayu yang dikumpulkan di bawah jumlah penebang maka penebang dilepaskan untuk menghemat uang dan 1 penebang kayu acak dikeluarkan dari hutan. Perhatikan bahwa Anda tidak akan pernah mengurangi tenaga kerja Penebang Anda di bawah 0.
Beruang:
Beruang mengembara di hutan seperti penebang pohon. Namun, bukannya 3 spasi, Beruang akan berkeliaran hingga 5 ruang.
Jika beruang menemukan Lumberjack, ia akan berhenti berkeliaran di bulan itu. (Misalnya setelah 2 bergerak beruang mendarat di ruang dengan penebang pohon dia tidak akan melakukan gerakan lagi untuk bulan ini)
Penebang berbau seperti panekuk. Beruang suka pancake. Karenanya Beruang sayangnya akan menganiaya dan melukai penebang pohon. Penebang kayu akan dihapus dari hutan (Dia akan pulang dan berbelanja pada hari Rabu dan telah mentega scone untuk teh).
Kami akan melacak ini sebagai kecelakaan "Maul".
Perhatikan bahwa populasi penebang pohon tidak pernah bisa turun di bawah 1 - jadi jika penebang pohon terakhir dianiaya hanya menelurkan satu lagi di.
Pelacakan Maul:
Selama 12 bulan jika ada 0 kecelakaan "Maul" maka populasi Beruang akan meningkat 1. Jika ada kecelakaan "Maul", Lumberjack akan menyewa Kebun Binatang untuk menjebak dan mengambil beruang. Hapus 1 Beruang acak. Perhatikan bahwa jika populasi Beruang Anda mencapai 0 beruang maka tidak akan ada kecelakaan "Maul" di tahun berikutnya dan karenanya Anda akan menelurkan 1 Beruang baru tahun depan.
Jika hanya ada 1 penebang pohon di hutan dan dia mendapat Mauled, dia akan dikirim pulang, tetapi yang baru akan dipekerjakan segera dan respawned di tempat lain di hutan. Populasi penebang pohon tidak pernah bisa turun di bawah 1.
Waktu:
Simulasi terjadi selama 4800 bulan (400 tahun), atau sampai tidak ada Pohon, Pohon, atau Pohon Tua.
Keluaran:
Setiap bulan Anda akan mencetak peta hutan - mungkin menggunakan peta ASCII, atau menggunakan grafik dan warna.
Ekstra opsional
- Anda bisa menampilkan populasi pohon, penebang pohon dan beruang setiap kutu.
- Anda dapat menampilkan kapan saja suatu peristiwa terjadi (misalnya: "Seekor beruang membuat penebang pohon.")
Mencetak gol
Ini adalah kontes popularitas, jadi kebanyakan orang yang menang menang!
EDIT - Orang-orang telah menunjukkan sejumlah kesalahan dalam aturan saya, dan sementara Anda bisa merasa bebas untuk bertanya kepada saya, itu juga oke untuk sedikit mengubah aturan agar sesuai dengan program Anda sendiri, atau interpretasi dari program.
sumber
Note that you will never reduce your Lumberjack labor force below 0
di item daftar bagian penebang pohon 3. mungkin mengubahnya menjadi 1 agar sesuai dengan apa yang Anda sebutkan di bagian beruang?Jawaban:
Javascript + HTML - coba
Diperbarui sesuai permintaan populer
Perilaku umum
Program ini sekarang agak interaktif.
Kode sumber sepenuhnya parametrized, sehingga Anda dapat mengubah beberapa parameter internal dengan editor teks favorit Anda.
Anda dapat mengubah ukuran hutan.
Minimal 2 diperlukan untuk memiliki ruang yang cukup untuk menempatkan pohon, penebang pohon dan beruang di 3 tempat yang berbeda, dan maks ditetapkan secara sewenang-wenang menjadi 100 (yang akan membuat komputer Anda merangkak rata-rata).
Anda juga dapat mengubah kecepatan simulasi.
Tampilan diperbarui setiap 20 ms, jadi langkah waktu yang lebih besar akan menghasilkan animasi yang lebih baik.
Tombol memungkinkan untuk menghentikan / memulai simulasi, atau menjalankannya selama satu bulan atau satu tahun.
Pergerakan penghuni hutan sekarang agak beranimasi. Acara Mauling dan penebangan pohon juga dilakukan.
Log beberapa acara juga ditampilkan. Beberapa pesan lain tersedia jika Anda mengubah level verbositas, tetapi itu akan membanjiri Anda dengan notifikasi "Bob cut yet another tree".
Aku lebih suka tidak melakukannya jika aku jadi kamu, tapi aku tidak, jadi ...
Di samping taman bermain, serangkaian gambar skala otomatis diambil:
Legenda juga menampilkan jumlah saat ini dari setiap item.
Stabilitas sistem
Grafik menunjukkan bahwa kondisi awal tidak skala yang anggun. Jika hutan terlalu besar, terlalu banyak beruang memusnahkan populasi penebang pohon sampai cukup banyak pecinta pancake telah ditempatkan di balik jeruji besi. Ini menyebabkan ledakan awal pohon-pohon tua, yang pada gilirannya membantu populasi penebang pohon pulih.
Tampaknya 15 adalah ukuran minimal bagi hutan untuk bertahan hidup. Hutan ukuran 10 biasanya akan dihancurkan setelah beberapa ratus tahun. Setiap ukuran di atas 30 akan menghasilkan peta yang hampir penuh dengan pohon. Antara 15 dan 30, Anda dapat melihat populasi pohon berosilasi secara signifikan.
Beberapa poin aturan yang bisa diperdebatkan
Dalam komentar dari posting asli, sepertinya berbagai biped tidak seharusnya menempati tempat yang sama. Ini bertentangan entah bagaimana aturan tentang redneck berkeliaran di amatir pancake.
Bagaimanapun, saya tidak mengikuti pedoman itu. Setiap sel hutan dapat menampung sejumlah inhyabants (dan persis nol atau satu pohon). Ini mungkin memiliki beberapa konsekuensi pada efisiensi penebang pohon: Saya kira itu memungkinkan mereka untuk menggali rumpun pohon yang lebih tua dengan lebih mudah. Sedangkan untuk beruang, saya tidak berharap ini membuat banyak perbedaan.
Saya juga memilih untuk selalu memiliki setidaknya satu penebang pohon di hutan, meskipun pada titik yang menyatakan bahwa populasi redneck bisa mencapai nol (menembaki penebang pohon terakhir di peta jika panen benar-benar buruk, yang tidak akan pernah terjadi lagi kecuali jika hutan telah dicincang hingga punah).
Tweaking
Untuk mencapai stabilitas, saya menambahkan dua parameter penyesuaian:
1) tingkat pertumbuhan penebang pohon
koefisien yang diterapkan pada formula yang memberikan jumlah penebang kayu tambahan yang disewa ketika ada cukup kayu. Setel ke 1 untuk kembali ke definisi asli, tetapi saya menemukan nilai sekitar 0,5 memungkinkan hutan (terutama pohon-pohon tua) berkembang lebih baik.
2) menanggung kriteria penghapusan
koefisien yang mendefinisikan persentase minimal penebang pohon yang dianiaya untuk mengirim beruang ke kebun binatang. Set ke 0 untuk kembali ke definisi asli, tetapi penghapusan beruang drastis ini pada dasarnya akan membatasi populasi pada siklus osilasi 0-1. Saya mengaturnya ke 0,15 (yaitu beruang dihapus hanya jika 15% atau lebih dari penebang kayu telah dianiaya tahun ini). Hal ini memungkinkan populasi beruang yang moderat, cukup untuk mencegah redneck membersihkan area tersebut tetapi masih memungkinkan bagian hutan yang cukup besar dipotong.
Sebagai catatan, simulasi tidak pernah berhenti (bahkan melewati 400 tahun yang diperlukan). Bisa dengan mudah melakukannya, tetapi tidak.
Kode
Kode sepenuhnya terkandung dalam satu halaman HTML.
Itu harus dikodekan UTF-8 untuk menampilkan simbol unicode yang tepat untuk beruang dan penebang pohon.
Untuk sistem dengan gangguan Unicode (mis. Ubuntu): cari baris berikut:
dan mengubah Piktogram untuk karakter lebih mudah untuk display (
#
,*
, apa pun)Apa selanjutnya?
Masih banyak sambutan.
NB: Saya sadar jumlah pohon muda / dewasa / tua masih sedikit berantakan, tapi persetan dengan itu.
Juga, saya menemukan document.getElementById lebih mudah dibaca daripada $, jadi tidak perlu mengeluh tentang kurangnya jQueryisms. Sengaja gratis jQuery. Untuk Masing-masing miliknya, bukan?
sumber
AngularJS
Ini versi saya , yang masih merupakan Work In Progress: kodenya agak ... yah ... jelek. Dan cukup lambat. Saya juga berencana untuk menambahkan lebih banyak opsi untuk menentukan evolusi dan menganalisis keadaan hutan. Komentar dan proposal perbaikan dipersilakan!
Demonstrasi
sumber
getEntitiesAt
tampaknya menjadi babi CPU! menjalankan sistem dengan kisi 50x50 membutuhkan lebih dari satu detik per bulan di PC saya. Juga ada kasus ketika semua pohon ditebang, maka semua penebang pohon dipecat dan peta perlahan diisi dengan beruang :). Coba ukuran kecil (10 atau kurang) untuk melihatnya terjadi.Forest.tick()
, jikaForest.lumberjackList.length == 0
, laluLumberjack.create(<number>, <number>)
.Javascript
Saya pikir ini kebanyakan berhasil. Ada beberapa perilaku aneh di mana saya menelurkan semua beruang / penebang pohon baru dalam sinkronisasi dan tepat di samping satu sama lain karena kemalasan dalam penyisipan.
Implementasi ini tidak memungkinkan penebang pohon berdiri di atas anakan, karena Anda tahu, menginjak-injak anakan adalah buruk. Seni biola menggunakan persegi panjang berwarna secara default, ubah baris kedua menjadi false untuk menggunakan huruf untuk menggambar.
biola
HTML:
Js:
sumber
n = 50
, misalnya).Python
Tidak ada yang mewah. Saya terus menambahkan barang, jadi refactoring mungkin sudah beres. (Dan saya tidak melakukan unitest sehingga bug mungkin masih ada).
Saya memberi nama acak untuk penebang pohon dan beruang. Pohon
i
, laluI
, lalu#
, Penebangx
, Beruango
Beberapa output:
Akhir tahun
Akhir permainan
sumber