Sebagai bagian dari proyek perencanaan kota, Anda mendapat tugas membuat program atau fungsi yang akan menampilkan cakrawala kota, diberikan beberapa masukan dari arsitek. Proyek ini hanya dalam tahap startup, sehingga sketsa yang sangat kasar sudah cukup. Pendekatan termudah tentu saja dengan hanya menggambar cakrawala dalam ASCII-art.
Semua bangunan akan berada di tepi sungai, sehingga semuanya disejajarkan. Arsitek akan memberikan ketinggian setiap bangunan sebagai input, dan kode Anda harus menampilkan garis langit.
Input dari arsitek akan berupa bilangan bulat atau setengah bilangan bulat. Jika angka tersebut bilangan bulat, bangunan akan memiliki atap yang datar, sedangkan setengah bilangan bulat akan menghasilkan atap yang melengkung. Nol hanya akan menjadi tanah datar. Dinding bangunan terpisah 3 karakter, sedangkan nol akan menjadi lebar satu karakter. Bangunan-bangunan yang berdekatan berbagi tembok.
Untuk detail dan klarifikasi tentang output, silakan lihat contoh-contoh di bawah ini:
N = 3
___
| |
| |
|___|
N = 3.5
_
/ \
| |
| |
|___|
N = 6
___
| |
| |
| |
| |
| |
|___|
n = 0
_
Contoh input: 3 3.5 0 2
_
___ / \
| | | ___
| | | | |
|___|___|_|___|
Contoh input: 0 0 2.5 3 0 4 1
___
_ ___ | |
/ \| | | |
| | | | |___
__|___|___|_|___|___|
Louisville ,0 2 1 3.5 0 4 2 4 2 4 6 1 6 0 5 1
___ ___
| | | | ___
_ ___ ___ ___| | | | | |
/ \ | | | | | | | | | | |
___ | | | |___| |___| | | | | | |
| |___| | | | | | | | |___| | | |___
_|___|___|___|_|___|___|___|___|___|___|___|___|_|___|___|
Karakter ASCII yang digunakan adalah: baris baru, spasi, dan /\_|
(titik kode 10, 32, 47, 92, 95, 124).
Aturan:
- Ini opsional untuk membuat program yang hanya mengambil bilangan bulat sebagai input, dengan mengalikan semua angka dengan dua. Jadi, alih-alih mengambil
3 3.5 2
, program Anda mungkin mengambil6 7 4
. Jika format input kedua dipilih, input 6 harus menghasilkan bangunan 3 lantai, 7 harus berupa bangunan 3 lantai dengan atap bernada dll. - Outputnya harus persis seperti yang dijelaskan di atas, tetapi spasi tambahan dan baris baru OK.
- Format input yang tepat adalah opsional. Apapun yang terbaik dalam bahasa Anda.
- Hasilnya harus ditampilkan di layar, sehingga arsitek dapat melihatnya.
- Anda dapat mengasumsikan akan ada setidaknya satu bilangan bulat yang diberikan, dan hanya input yang valid yang akan diberikan.
Ini codegolf, jadi kode terpendek dalam byte menang.
Jawaban:
Python 2,
199193188185 byteIni adalah program lengkap yang menerima bilangan bulat sebagai input. Contoh input .
sumber
MATLAB,
219 209203 byteSayangnya ini tidak berfungsi pada Oktaf . Tidak sepenuhnya yakin mengapa, tampaknya ada hubungannya dengan bit disp / flipud yang rusak.
Juga, saat ini tidak ada definisi seperti apa bentuk bangunan setinggi 0,5, atau tidak menyebutkannya, jadi dalam kode ini saya berasumsi bahwa mereka tidak diizinkan.
Berikut ini adalah kode dengan cara yang sedikit lebih mudah dibaca:
Pertama kita mengambil input sebagai array, dan melakukan beberapa inisialisasi variabel.
Karena bangunan tinggi nol itu menyusahkan - mereka pada dasarnya berakhir dengan lebar yang bergantung pada apa yang ada di sebelahnya (meskipun apa yang dicetak tidak berubah), kami menyederhanakan berbagai hal dengan menggambar tanah yang cukup untuk semua bangunan. Kami menganggap setiap bangunan memiliki lebar 4 karakter (karena bangunan yang berdekatan bergabung bersama) - nol tingginya tidak, tetapi kelebihannya akan dipangkas nanti.
Sekarang kita menggambar setiap bangunan secara bergantian.
Pertama kita mendapatkan bagian integer dari ketinggian karena ini akan menentukan berapa banyak '|' kita butuh.
Sekarang gambar dinding untuk bangunan ini - jika ada dua bangunan yang berdekatan, dinding untuk yang baru ini akan berada di kolom yang sama dengan dinding dari yang terakhir.
Periksa untuk melihat apakah ini bangunan setengah tinggi. Jika ya, maka atapnya akan berbeda. Untuk setengah ketinggian, atap akan menjadi yang
/ \
tinggi penuh___
(Matlab akan secara implisit mereplikasi ini dari satu garis bawah, jadi simpan beberapa byte di sana). Ada sedikit atap tambahan satu baris lebih tinggi untuk bangunan setengah tinggi, sehingga ditambahkan juga.Gambarlah di atap
Sekarang pindah ke awal bangunan berikutnya dan menggambar di dinding bersama (jika dinding terlalu pendek pada titik ini, itu akan dibuat lebih besar ketika bangunan berikutnya ditarik). Perhatikan bahwa nol tinggi bangunan adalah 1 lebar, bangunan normal adalah 4 lebar, jadi kami menyederhanakan apa yang akan menjadi if-else dengan memperlakukan (a> 0) sebagai angka desimal bukan Boolean.
Selanjutnya muncul sedikit peretasan untuk bekerja dengan bangunan tinggi nol. Pada dasarnya apa yang dikatakan adalah jika bangunan ini tingginya nol, dan yang sebelumnya tidak, itu berarti tempat bangunan berikutnya perlu bertambah 1 karena bangunan nol tinggi yang terjepit di antara dua bangunan lain secara efektif dua kali lebarnya - ini menyumbang tembok ekstra yang biasanya dibagi dengan bangunan yang berdekatan. Kami juga melacak ketinggian gedung ini untuk melakukan pemeriksaan ini lain kali.
Setelah selesai, balikkan matriks bangunan menjadi jalan yang benar, dan tampilkan. Perhatikan bahwa kami juga memotong kelebihan tanah di sini juga.
Jadi, ketika kita menjalankan skrip ini, kita diminta masukan kita, misalnya:
Kemudian menghasilkan bangunan dan menampilkan hasilnya. Untuk input di atas, berikut ini dihasilkan:
sumber
Kotlin,
447442 byteVersi tidak disatukan:
sumber
Python 2,
357306299294287281276 byteIni menggunakan pengkodean "dua kali lipat", untuk diteruskan ke fungsi sebagai daftar. Sunting: Dicukur byte dengan mengulangi bagian dari kondisional besar sebagai pemilih array, dan beralih ke pengkodean berlipat ganda. Mencukur lebih banyak byte dengan menata ulang kondisi bersyarat lebih banyak dan mengubah lebih banyak logika ke aritmatika.
EDIT: xsot lebih baik
Penjelasan:
d
adalah 1 lebih dari panjang array, karena kita akan menambahkan nol di setiap ujung daftar dari elemen kedua hingga nol yang kita tambahkan di akhir.h
adalah ketinggian gambar. (Kita harus membaginya dengan 2 dalam perhitungan ini karena kita menggunakan representasi dua kali lipat, yang kita gunakan secara khusus untuk menghindari keharusan melemparkan pelampung ke int di semua tempat. Kami juga menambahkan 1 sebelum membagi ketinggian yang sangat aneh - bangunan runcing - dapatkan sedikit lebih banyak clearance daripada yang biasa.)o
adalah string keluaran.Trik standar untuk menciutkan loop ganda untuk menjadi loop tunggal. Setelah kami melakukannya:
kita sekarang telah mencapai hal yang sama seperti:
tetapi dengan cara yang menjaring kami sepuluh byte disimpan (termasuk spasi pada baris berikut).
Tempelkan dinding kapan saja ketinggian bangunan saat ini atau bangunan sebelumnya lebih tinggi dari garis saat ini, selama setidaknya ada satu batas bangunan di sini. Ini sama dengan persyaratan berikut:
di mana b adalah tinggi pindai saat ini, a adalah tinggi bangunan saat ini, dan c adalah tinggi bangunan sebelumnya. Bagian terakhir dari kondisi mencegah penempatan dinding di antara ruang-ruang tanah.
Ini adalah bagian yang menggambar atap yang benar, memilih bagian-bagian atap dengan membandingkan ketinggian bangunan dengan ketinggian pindai saat ini. Jika atap tidak masuk ke sini, ia mencetak jumlah ruang yang sesuai (3 ketika itu adalah bangunan sebenarnya, misalnya a> 0, jika tidak 1). Perhatikan bahwa ketika kita berada di permukaan tanah, itu tidak pernah mencoba untuk menggambar atap, yang berarti bangunan berukuran 0,5 tidak mendapatkan atap runcing. Baiklah.
Ketika kita berada di permukaan tanah, kita ingin menggarisbawahi bukan spasi. Kami hanya mengganti semuanya sekaligus di sini.
Tepat sebelum kita mulai memproses baris berikutnya, cetak baris saat ini dan hapus jalur output. Kami memangkas karakter terakhir karena itu adalah "_" yang sesuai dengan ruang dasar yang kita tambahkan dengan menambahkan nol di awal fungsi. (Kami menambahkan nol sehingga kami tidak perlu menambahkan case khusus untuk memasukkan dinding kanan, jika ada, yang akan menambahkan kode jauh lebih banyak daripada yang kami tambahkan dengan menambahkan 0 dan memotong "_".)
sumber
Python 3
725 byte608 byte
Kode golf:
Ini kode yang tidak disunat. Ada beberapa komentar tetapi ide dasarnya adalah membuat bangunan dengan dinding ganda, jadi intinya terlihat seperti:
Kemudian untuk mendapatkan indeks dinding ganda itu dan menghapus kolom-kolom itu sehingga kita mendapatkan:
Kode:
Waktunya bermain golf!
sumber
ru(n):return math.ceil(n)
hitungan sebagai golf, tapi tetap saja ... Tolong jangan menganggap ini dengan cara negatif, saya bukan seorang pegolf yang baik, dan tentu saja bukan programmer yang baik. Saya sarankan Anda mencoba untuk memperbaikinya ... Ini benar-benar menyenangkan setelah Anda menyadari bahwa Anda berhasil mempersingkatnya. Saya beralih dari banyak ke 120 menjadi 55 beberapa hari yang lalu. Jadi itu mungkin bahkan jika Anda baru dalam hal itu.PHP,
307297293 byteMembawa argumen * 2 dari baris perintah. simpan ke file, jalankan dengan
php <filename> <parameters>
.kerusakan
sumber
C ++, tidak diserang
(atau mungkin ungolfable)
Dengan asumsi ada kurang dari 100 elemen dan setiap elemen kurang dari 100.
s
adalah jumlah bangunan (diperlukan dalam input).sumber