Penolakan
Meskipun saya tahu ada pertanyaan terkait khusus ini , saya menggunakan dua pintu garasi, komponen acak, dan saya juga mendasarkan ini pada peristiwa kehidupan nyata, melihat anak saya secara tidak sengaja menurunkan salah satu pintu garasi tersebut sementara saya berjalan keluar dari garasi minggu lalu ... Tidak ada yang seperti pukulan di kepala untuk membuat jus kreatif mengalir! ;)
Latar belakang
Lucas (putra saya yang berumur 15 bulan) suka bermain dengan remote garasi. Ada dua tombol pada remote ini, satu untuk pintu garasi kiri, dan satu untuk pintu garasi kanan. Kedua tombol bekerja dengan cara yang sama; tekan sekali untuk mendapatkan pintu untuk mulai membuka, tekan lagi untuk berhenti, tekan lagi untuk mulai menutup, tekan lagi untuk berhenti lagi, dan seterusnya.
Lucas menyukai remote ini, dia akan secara acak menekan salah satu tombol, atau keduanya, atau tidak sama sekali. Jika keduanya ditekan, tidak ada sinyal yang dikirim, tetapi menekan satu tombol akan mengirimkan sinyal.
Jadi, tantangan kode-golf dibagi menjadi dua bagian:
Bagian satu
Hasilkan string 60 karakter panjang yang mewakili tombol Lucas acak ditekan lebih dari satu menit. "Acak" dalam hal ini berarti "dengan peluang yang sama untuk setiap input pada setiap centang". Karakternya adalah sebagai berikut:
- 0: Lucas menekan tombol no, atau menekan kedua tombol. Bagaimanapun, tidak ada sinyal yang dikirim.
- 1: Tombol untuk pintu garasi kiri telah ditekan oleh Lucas
- 2: Tombol untuk pintu garasi kanan telah ditekan oleh Lucas
Bagian kedua
Menggunakan string yang dihasilkan di Bagian Satu, mensimulasikan pembukaan dan penutupan garasi dua mobil menggunakan angka sebagai pemicu untuk membuka, menghentikan dan menutup pintu-pintu ini.
Pintu garasi saya cukup cepat (lihat Penafian di atas tentang alasannya). Setelah Anda menekan tombol, dibutuhkan empat detik untuk sepenuhnya terbuka atau tertutup.
Jadi, jika ditutup:
- 0 dtk: 0% terbuka (tertutup); ketika tombol ditekan, pintu mulai terbuka
- 1 dtk: 25% terbuka
- 2 detik: 50% terbuka
- 3 detik: 75% terbuka
- 4 detik: 100% terbuka, pintu berhenti
Dan karena itu, jika terbuka:
- 0 dtk: 100% terbuka; ketika tombol ditekan, pintu mulai menutup
- 1 dtk: 75% terbuka
- 2 detik: 50% terbuka
- 3 detik: 25% terbuka
- 4 detik: 0% terbuka (tertutup), pintu berhenti
Jika pintu tertentu sedang bergerak, sinyal ke pintu yang sama akan menghentikannya. Sinyal selanjutnya dikirim ke pintu yang sama setelah itu akan mengirimnya bergerak ke arah yang berlawanan. Jika pintu berhenti ketika sebelumnya telah bergerak dan sekarang terbuka penuh atau tertutup sepenuhnya ketika sinyal "berhenti" diterima, pintu akan mendaftar sebagai "berhenti" dalam keadaan terbuka atau tertutup sepenuhnya, siap untuk bergerak ke arah yang berlawanan ketika menerima sinyal baru.
Dengan simulasi ini, kedua pintu garasi pada awalnya akan berada dalam posisi tertutup. Jadi, mari kita lihat daftar perintah 10 detik dan lihat apa yang terjadi jika Lucas melakukannya di remote:
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Keluaran
Bagian pertama dari output membutuhkan tampilan string panjang 60 karakter acak "0", "1" dan "2" karakter yang dihasilkan dari Bagian Satu. misalnya.
212022112021202211202120221120212022112021202211202120221120
Di bawah string ini, adalah pemrosesan "sinyal" ini sesuai dengan aturan yang disebutkan di atas tentang bagaimana pintu garasi akan berperilaku dengan masing-masing karakter masing-masing (berdasarkan detik ke detik). Anda harus berakhir dengan 60 baris sebagai hasilnya di bawah string tampilan awal.
Masing-masing jalur yang diproses ini akan dalam bentuk: di
N: (L:X% XXXXXXX, R:Y% YYYYYYY)
mana:
- N adalah karakter ke-n dari string acak masing-masing, yang akan dalam bentuk 0, 1, atau 2.
- X% adalah persentase keterbukaan pintu kiri (tidak ada bantalan nol)
- XXXXXXX adalah status pintu kiri. Jika pintu tidak bergerak (yaitu tidak membuka atau menutup) status "berhenti" diberlakukan, artinya telah berhenti bergerak (hanya mungkin pada 25%, 50% atau 75%) atau dihentikan ketika terbuka penuh (100% ) atau tertutup sepenuhnya (0%). Kalau tidak, pintu akan menjadi "membuka" atau "menutup".
- Y% adalah persentase keterbukaan pintu kanan (tidak ada bantalan nol)
- YYYYYYY adalah status pintu kanan. Jika pintu tidak bergerak (yaitu tidak membuka atau menutup) status "berhenti" diberlakukan, artinya telah berhenti bergerak (hanya mungkin pada 25%, 50% atau 75%) atau dihentikan ketika terbuka penuh (100% ) atau tertutup sepenuhnya (0%). Kalau tidak, pintu akan menjadi "membuka" atau "menutup".
Contoh yang ditunjukkan di bawah ini menggunakan 10 "sinyal" dan 10 jalur yang diproses
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Ini adalah kode-golf, jadi kode terpendek akan menjadi pemenang yang jelas. Saya membuat ini sedikit mudah dengan menggunakan frasa seperti "pembukaan", "berhenti" dan "penutupan", yang semuanya adalah tujuh huruf ... jadi Anda mungkin ingin memasukkannya ke dalam strategi Anda.
Semoga berhasil!
1
perintah terakhir tidak menghentikan pintu kiri 75% pada contoh Anda?Jawaban:
Pyth,
156149145 byteTerjemahan langsung dari jawaban Python saya .
Cobalah online!
Penjelasan:
sumber
Javascript (ES6),
277275263253250247234 byteTidak diikat dan dikomentari
Demo
sumber
112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ]
(baris baru setelah koma dan kurung)v^=(c-i-1?0:v&8||24)
untuk menghemat dua byte.Python 2,
377370361357345335326316312306304 byteLevel indentasi kedua adalah tab mentah (
\t
), yang bermain sangat buruk dengan Markdown, sehingga telah diganti oleh dua spasi.Saya hampir yakin ini bisa golf lebih lanjut.
Tidak disatukan, dengan komentar:
Disimpan
41415 byte berkat @TheBikingViking!Disimpan 6 byte berkat @NilaiInk!
sumber
range(60)
menjadi[0]*60
.'p'[1::3]
(mengganti apostrof dengan backticks) sebagai gantinya''.join(map(str,p))
.(4,0)[q<0]==c[i]and q
->((4,0)[q<0]==c[i])*q
n
ke string itu.n
digunakan pada baris akhir untuk mengekstrakclosing
,stopped
,opening
dari string itu.Ruby,
263261260254 byteBagaimana jawaban JavaScript menjadi sangat singkat ??? Itu mengambil alih milikku saat aku pergi dan masih menang saat ini ...
sumber
C,
420433424374 byteTidak menyemai generator acak tetapi menggunakan acak untuk distribusi yang lebih baik. Harus ada cara yang lebih baik untuk golf logika ini ...
Versi yang lebih lama 1:
Versi lebih lama 2:
sumber
PHP,
254247246245235230226 bytemengalahkan ES lagi!
bermain golf dari 311 ini (versi lengkap pertama, sudah bermain golf):
kerusakan
sumber
Java 8 lambda, 500 karakter
Saya melakukan yang terbaik, inilah yang saya hasilkan:
Tidak tergabung dalam kelas lengkap:
Cukup lurus ke depan. Variabel stepLeft / stepRight lingkaran dari 0-3. Melakukan beberapa matematika sederhana changeLeft / changeRight tahan perubahan relatif masing-masing per langkah, yang akan ditambahkan ke leftDoor / rightDoor. Banyak jika pernyataan untuk menangkap ketika pintu harus berhenti sendiri.
Jangan ragu untuk membantu saya mempersingkat ini, saya pikir ada banyak yang harus dilakukan.
sumber
Haskell (lambdabot) - 409 byte
sumber
imports
, misalnya untukrandoms
kode Anda (dan jumlah byte). Jika ada penerjemah yang mengimpor secara default, rujuklah dalam nama bahasa.