Intro
Pertimbangkan kisi-kisi karakter f A\/
seperti
f f f
A
A / \
\ / A
A \/
/
\/
dimana:
f
mewakili faucet yang menuangkan aliran air ke bawahA
membagi dua aliran air di atas sehingga tepat setengah ke kiri dan tepat setengah ke kanan\
menggeser aliran air di atas ke kanan dengan satu unit/
menggeser aliran air di atas ke kiri oleh satu unit- kombinasi
\/
menciptakan palung dengan kapasitas tak terbatas yang mengumpulkan aliran air di atasnya [space]
adalah ruang kosong yang bisa dilewati air
Dari sini kita dapat membayangkan jalan yang *
akan diambil oleh air ( ) yang keluar dari faucet dan jatuh ke dalam bak atau keluar dari area grid:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
Dengan asumsi 3 faucet menghasilkan jumlah air yang sama satu per satu kita bisa melihatnya
- Semua air keran pertama mengalir ke bak bawah.
- Setengah dari air keran kedua mengalir ke palung yang lebih rendah dan separuh lainnya terbelah antara palung yang lebih rendah dan jatuh dari kisi.
- Seperempat air keran ketiga mengalir ke palung yang lebih rendah, seperempat jatuh dari dasar grid, seperempat masuk ke palung atas, dan seperempat jatuh dari grid ke kanan.
Dari sini kita dapat mengatakan bahwa (1 + 3/4 + 1/4 + 1/4) / 3 = 75%
air ditangkap oleh bak dan (1/4 + 1/4 + 1/4) / 3 = 25%
jatuh dari grid.
Tantangan
Anda dapat menyelesaikan salah satu atau semua tantangan ini terkait dengan pengaturan aliran air ASCII ini. Semuanya adalah kode-golf, jawaban terpendek untuk setiap tantangan adalah pemenangnya. Jawaban yang diterima adalah orang yang paling menyelesaikan tantangan, dengan panjang kode total sebagai tie-breaker.
Tantangan 1
Tulis program yang menampilkan sebagian kecil air yang mengalir ke palung untuk kisi-kisi yang diberikan. Keluaran dari contoh di atas adalah sederhana 0.75
.
Tantangan 2
Tulis sebuah program yang, dengan grid, menggambar *
's di tempat-tempat air mengalir seperti yang saya lakukan di atas. Anda tidak boleh menimpa apa pun selain karakter spasi dan kisi tidak boleh mengubah ukuran. Jadi untuk sesuatu seperti
f
/A
tidak ada yang perlu dilakukan karena, meskipun air mengalir di kedua sisi A, itu tidak dapat ditarik ke kiri tanpa melepas /
dan tidak dapat ditarik ke kanan tanpa membuat grid 2 × 2 lebih besar.
Tantangan 3 (Diperbarui)
Tulis program yang menggunakan dua bilangan bulat non-negatif, total T dan jumlah untuk menjaga K (T> = K). Hasilkan dan gambarkan kisi-kisi dengan tepat f
sehingga ketika faucet itu mencurahkan T unit air, tepatnya K akan mengalir ke bak. Jika tidak mungkin untuk melakukan ini dalam grid terbatas untuk pasangan (T, K) tertentu, maka output 'Mustahil'.
Klarifikasi (berlaku untuk semua tantangan)
- Input dapat melalui stdin, atau file, atau bahkan panggilan fungsi pada representasi string dari grid. Cukup jelaskan bagaimana menjalankan input yang berbeda.
- Output harus menuju stdout.
\A
danA/
danAA
juga palung seperti yang Anda harapkan.- Grid w oleh h akan selalu berupa persegi panjang yang diformat dengan karakter w * h tanpa menghitung baris baru. Tidak akan ada spasi tambahan dan tidak ada kejadian
*
. - Dimensi grid bisa sekecil 1 × 1 dan besar sewenang-wenang. (Cukup besar untuk alasan, int.maxValue atau sejenisnya adalah batas yang dapat diterima. Hal yang sama berlaku untuk T dan K.)
- Aliran di atas
f
mengalir tepat melaluinya. - Keran bisa di mana saja, tidak hanya di baris atas.
A
selalu membagi jumlah air yang dituangkan tepat di setengahnya.
Catatan: Hal-hal seperti /A
dan //
sangat valid. Air tidak bebas mengalir antara karakter (meskipun untuk tantangan 2 tidak ada cukup ruang untuk menggambar).
Jadi, dalam pengaturan
ff
/A
Aliran kiri f
mengalir turun, mengenai /
dan bergeser ke kiri. Aliran kanan f
mengalir ke bawah, mengenai A
, setengah ke kanan dan setengah ke kiri antara A
dan /
.
misalnya
ff
**
*/A*
** *
** *
f
s/A
jika air jatuh ke atasA
. Untuk semua tantangan, akan baik untuk mengklarifikasi apakah\A
palung. Untuk tantangan ketiga, haruskah 3 unit jatuh padaA
diasumsikan terbelah1.5 / 1.5
(jadi input benar-benar bilangan rasional tunggal) atau itu2 / 1
, dalam hal mana pihak yang menerima2
?A
maka kedua belah pihak mendapatkan 1,5. Terserah koder untuk memastikan presisi float tidak menjadi masalah.)Jawaban:
Semua Tantangan C # 690bytes (416bytes + 274bytes)
Tantangan 1 & 2 C #
579446416 byteIni adalah program lengkap yang harus mengerjakan Tantangan 1 & 2, hanya tentang. Bunyinya baris input dari stdin sampai menerima baris kosong. Mencetak hasil untuk Tantangan 2, dan kemudian hasil untuk Tantangan 1. Menggunakan kelas desimal .NET untuk menghindari kesalahan pembulatan.
Kurang bermain golf:
Uji coba (dengan kurangnya ruang tambahan yang saya janjikan ada di sana):
Tantang 3 C # 274bytes
Ini adalah program lengkap yang harus menyelesaikan Tantangan 3. Saya seorang berhasil menyelamatkan 6bytes dengan menulis parser bilangan bulat saya sendiri untuk membaca masukan daripada
Split
ingReadLine
dan menggunakanlong.Parse
;Kurang bermain golf:
Uji coba (lagi-lagi dengan kurangnya ruang tambahan yang saya janjikan ada di sana):
sumber
Pertama-tama, saya punya pertanyaan tentang tantangan. Karena saya tidak memiliki reputasi yang cukup untuk mengomentari pertanyaan itu, saya menulisnya di sini:
/A
(air yang mengalir di A),//
(air yang mengalir di sisi kanan) dan variasi prinsip ini? Apakah air mengalir ke "tempat bebas" pertama di samping atau apakah mengalir "di bawah" tetangganya?Hanya dengan mencoba yang sederhana, ini dapat disederhanakan waaaaay (yang akan saya lakukan nanti dengan mengedit posting ini).
Sunting: Versi kedua, sedikit lebih kecil. Saya melakukan pendekatan yang berbeda: alih-alih mencari setiap sel untuk memeriksa apa yang datang dari atas dan samping, saya mulai dari keran dan "mengalir" ke bawah dengan rekursi.
Javascript, 226 byte (Tantangan 1)
Javascript, 204 byte (Tantangan 2)
Javascript, 238 byte (Tantangan 1 + 2)
Cara Penggunaan
Berikan representasi dua dimensi dari peta. Berikut adalah contoh yang diberikan dalam pertanyaan:
Keluaran
Tantangan 1: Ini hanya akan membuat kotak dialog (peringatan) dengan hasilnya (0,75 untuk contoh di atas).
Tantangan 2: Ini akan langsung mengubah peta. Haruskah saya mencetaknya? Jika demikian, apakah console.log diterima? sebagai output yang valid?
Tantangan 1 + 2: Keduanya digabungkan, jelas ...
sumber
A
atau garis miring. Saya sudah mengklarifikasi itu dalam pertanyaan.Output must go to stdout.
str[0]
ke string. Itu akan menjadi array string, bukan array array karakter.Python 3, 186 byte (Tantangan 3)
Saya mengambil ide untuk grid dari jawaban VisualMelon . Fungsi harus mencetak kisi yang valid ke stdout untuk T dan K besar yang sewenang-wenang, asalkan dimungkinkan (kisi ukuran terbatas) tentu saja.
Cara Penggunaan
Panggil
c
fungsi dengan jumlah dan jumlah total untuk disimpan sebagai argumen.sumber