Tantangan hari ini adalah menggambar pohon biner yang ascii-art seindah ini:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/ \ / \ / \ / \
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/ \ / \ / \ / \ / \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Anda akan diberikan bilangan bulat positif sebagai input. Input ini adalah ketinggian pohon . Contoh di atas memiliki tinggi enam.
Anda dapat mengirimkan program penuh atau fungsi, dan Anda bebas menggunakan salah satu metode IO default kami . Misalnya, mencetak pohon, mengembalikan string dengan baris baru, mengembalikan array char 2d, menyimpan pohon ke file, dll. Semua akan diizinkan.
Ruang tambahan di setiap baris diizinkan.
Berikut adalah beberapa contoh input dan output yang sesuai:
1:
/\
2:
/\
/\/\
3:
/\
/ \
/\ /\
/\/\/\/\
4:
/\
/ \
/ \
/ \
/\ /\
/ \ / \
/\ /\ /\ /\
/\/\/\/\/\/\/\/\
5:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Sayangnya, output tumbuh secara eksponensial, sehingga sulit untuk menunjukkan contoh yang lebih besar. Berikut ini tautan ke keluaran untuk 8.
Seperti biasa, ini adalah tantangan kode-golf , jadi celah standar berlaku, dan cobalah menulis program sesingkat mungkin dalam bahasa apa pun yang Anda pilih.
Selamat bermain golf!
Jawaban:
Python 2, 77 byte
Mencetak dengan spasi tambahan, diakhiri dengan kesalahan.
Saya mengambil kode ini dari pengajuan saya ke tantangan yang saya ajukan di Anarchy Golf , ditambah perbaikan satu byte yang ditemukan oleh xsot. Nilai hardcoded dari 128 diubah menjadi
2**input()
.Idenya adalah bahwa setiap baris output adalah segmen yang disalin satu atau lebih kali. Setengah setelah input split memiliki satu salinan dari setiap segmen, kuartal setelah split berikutnya memiliki dua salinan, dan seterusnya, hingga baris terakhir dengan banyak segmen
/\
.Setiap segmen memiliki a
/
dan\
, dengan ruang di antaranya, serta di luar untuk menyangga dengan panjang yang tepat. Padding luar dilakukan dengancenter
.Variabel
s
melacak arus dengan setiap segmen, dan jumlah segmen adalahS/s
sehingga total lebar adalah lebar pohonS
. Nomor barisi
dihitung mundur oleh 2, dan setiap kali nilainyas
setengah, perpecahan terjadi, dan lebar segmen menjadi dua. Ini dilakukan melalui ekspresis/=s/i
. Ketikai
sampai0
, ini memberikan kesalahan yang menghentikan program.Karena anagolf hanya memungkinkan pengiriman program, saya tidak menjelajahi kemungkinan fungsi rekursif, yang saya pikir kemungkinan lebih pendek.
sumber
V , 32 byte
Cobalah online!
Hexdump:
sumber
Kanvas , 11 byte
Coba di sini!
Penjelasan:
sumber
Haskell ,
140 138135 byteCobalah online! Panggil dengan
b 5
, mengembalikan daftar string.Penggunaan cetak cantik:
(beberapa) Penjelasan:
e n
menghasilkan serangkaiann
spasin!f
bantalan setiap string dalam daftar stringf
dengann
spasi kiri dan kananf n
menggambar "puncak" dalamn
oleh2n
persegi panjangb n
menggambar pohon biner dengan menggabungkan dua pohon kecil dan pusatkan puncak baru di atasnyaEdit: -3 byte terima kasih kepada Zgarb!
sumber
1!f(n-1)
danm!f m
harus menyimpan beberapa byte.J ,
49 4342 byteIni mengevaluasi ke kata kerja yang mengambil angka dan mengembalikan array karakter 2D. Cobalah online!
Penjelasan
Saya pertama-tama membangun sebuah matriks dari nilai -1, 0 dan 1 dengan iterasi verba bantu, dan kemudian ganti angka dengan karakter. Kata kerja bantu membangun setengah bagian kanan dari iterasi berikutnya, kemudian mencerminkannya secara horizontal untuk menghasilkan sisanya. Dalam penjelasan berikut,
,
gabungkan array 2D secara vertikal dan array 1D secara horizontal.sumber
JavaScript (ES6), 105 byte
Bekerja dengan membangun hasilnya secara rekursif dari kasus dasar
/\
. Setengah bagian bawah hanyalah kasus sebelumnya dengan setiap baris diduplikasi. Setengah bagian atas agak rumit; sepertinya Anda ingin mengambil kasus sebelumnya dan hanya menjaga kedua sisi tetapi Anda juga harus khawatir tentang melapisi string untuk menggandakan lebar, jadi alih-alih saya melakukan sihir regex. Dengan mengambil spasi awal dari case sebelumnya dan membelah pada setiap titik, saya dapat mempertimbangkan spasi sebelum dan sesudah titik itu. Pada setiap pertandingan spasi sebelum meningkat sebesar 1 dan ruang setelah dikurangi sebesar 1; ini dapat digunakan untuk memposisikan/
dan\
di tempat yang benar. Baris baru dan padding juga ditambahkan di sini; ini menangani semua padding kecuali ruang tambahan di setiap baris dan ruang terkemuka di baris pertama yang harus saya tambahkan secara manual. (Ruang utama pada baris berikutnya berasal dari string yang cocok).sumber
Arang , 12 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Panjang garis adalah 1, 1, 2, 4, 8 ... 2 ^ (N-2), sehingga perhitungannya canggung.
sumber
Stax ,
2019 byteJalankan dan debug itu
sumber
Batch, 218 byte
Catatan: Baris 6 berakhir di spasi. Bekerja dengan menggerakkan cabang ke kiri dan kanan secara tepat setiap kali, kecuali pada baris yang 2 n dari ujung, dalam hal ini cabang-cabang tersebut malah bercabang dua.
sumber
Haxe, 181 byte
Atau, dengan spasi putih opsional:
Saya sedang bekerja untuk sementara waktu pada solusi yang menciptakan array karakter ruang dengan ukuran yang tepat terlebih dahulu, kemudian iteratif menempatkan jalur bercabang lebih rendah dan lebih rendah (dan lebih padat di setiap iterasi). Tetap 230+ byte, meskipun. Pendekatan di sini hampir sama dengan pendekatan Haskell @ Laikoni. Saya tidak bisa lolos dengan tidak memiliki
:String
, karena Haxe tidak cukup pintar untuk mengidentifikasi bahwa tipe pengembalian akan selalu menjadi String.Ini hanya fungsi, inilah program lengkap untuk mengujinya:
Masukkan di atas
Main.hx
, kompilasi denganhaxe -main Main.hx -neko frac.n
dan uji denganneko frac.n 4
(ganti4
dengan urutan yang diinginkan).sumber
PHP, 188 Bytes
Versi Online
Diperluas
sumber