Terinspirasi oleh ubin domino Fibonacci , masalah ini adalah tentang menghasilkan seni ASCII yang mewakili urutan kombinatorial terkenal lainnya.
Sebuah diagram gunung n-langkah adalah gambar dari pegunungan, menggunakan persis n '/' dan n '\' karakter, sehingga karakter sketsa kurva terus menerus yang tidak pernah dips di bawah "ketinggian" awal. Sebagai contoh,
/\/\
/\/ \
dan
/\
/\/ \/\
keduanya diagram gunung 4 langkah, tetapi
/\ /\/\
\/
tidak.
Memasukkan
Program harus menerima bilangan bulat n dari stdin atau sebagai parameter ke suatu fungsi.
Keluaran
Cetak semua n -langkah diagram gunung ke stdout. Diagram bisa dalam urutan apa pun, tetapi harus dipisahkan oleh semacam spasi putih. Anda dapat memutuskan apakah berbagai diagram akan ditampilkan secara horizontal, vertikal, dll.
Seperti dalam masalah ubin domino, Anda dapat menggunakan spasi putih apa pun yang Anda inginkan. Ini termasuk baris baru tambahan sebelum atau setelah hasil cetak.
Contoh
Beberapa sampel keluaran valid untuk n = 3:
Output yang valid A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Output yang valid B:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Output yang valid C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
Ini adalah kode golf; program terpendek (dalam byte) menang.
sumber
Jawaban:
Python 2: 151 karakter
Wow, ini berantakan.
Ide pertama adalah menggunakan angka-angka
0 to 2**N-1
untuk menyandikan semua urutanN
gerakan naik dan turun dalam bit mereka. Kami membaca bit-bit ini satu per satu dengan mengulangi%2
dan/2
, berulang dalam satuexec
lingkaran.Kami menyimpan deretan pegunungan yang mengalir ke samping dalam daftar string yang dialihkan
L
. Setiap kali, kami menghasilkan baris spasi baru menggantikan satu spasi di baris baru dengan/
atau\
tergantung pada apakah gerakan naik atau turun terjadi.Indeks ruang itu adalah
c
ruang dari ujung, di manac
tinggi lari. Melakukannya dari depan akan membuat gunung-gunung terbalik. Kami selanjutnya menggesernya denganb
menyejajarkan gerakan ke atas dan ke bawah, mendapatkan[b-c]
. Mulaic
dari 1 daripada 0 memperbaiki kesalahan tidak langsung oleh satu.Untuk menghilangkan kasus di mana
c
dips di bawah nilai awal1
, ketika hal ini terjadi, kami menetapkani
untuk0
, yang menyebabkan semua bergerak lebih lanjut untuk menjadi ke bawah, membuatc
menjadi lebih negatif. Kemudian, ketika kami memeriksa apakahc
berakhir pada1
, kami juga memeriksa apakahc
pernah jatuh di bawahnya. Kami hanyaprint
pegunungan jikac
ini1
.Untuk mencetak, kita lakukan
zip(*L)
untuk mengubah rentang dari vertikal ke horizontal, dan mencetak setiap string yang bergabung. Banyak masalah dalam jawaban ini berasal dari Python memperlakukan string sebagai tidak dapat diubah, jadi kami bekerja dengannya sebagai daftar karakter dan hanya menggabungkannya menjadi string untuk dicetak.Terima kasih kepada @florn untuk bantuan dan peningkatan.
sumber
' '
alih-alih" "
jika ingin mengulang menggunakanexec
. :) Btw, Anda tidak perlu melarikan diri dari backslash.' '
dan mencoba mengganti string dengan tanda kutip dengan variabel untuknya. Ini masih memberikan indeks di luar kisaran:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, yaitu kutipan dalam harus berbeda dari kutipan luar.APL (88)
Output untuk
n=3
:Penjelasan:
(N/2)⊤⍳2*N←2×⍵
: dapatkan bitfield untuk setiap nomor dari0
hingga2^⍵
.Z←↓⍉¯1+2×
: kalikan dengan 2 dan kurangi 1, memberi1
untuk naik-1
turun. Menyimpan vektor vektor, masing-masing vektor berisi representasi untuk satu angka, dalamZ
.{
...}¨Z
: untuk setiap elemenZ
:∧/0≤+\⍵
: periksa bahwa jumlah berjalan tidak pernah jatuh di bawah0
(tidak pergi di bawah permukaan tanah),(0=+/⍵)
: dan jumlah totalnya adalah0
(berakhir kembali di permukaan tanah).{
...}¨Z/⍨
: pilih elemen-elemen dariZ
mana itu benar. Untuk masing-masing:K←(⍵≠1)++\⍵
: temukan ketinggian untuk setiap karakter, dan simpan diK
. Angkat masing\
- masing satu, sehingga mereka sejajar dengan/
huruf s dengan benar. Ini membuat ketinggian tanah1
.¯1+2×K=⊂⌽⍳⌈/K
: untuk setiap kolom, buat daftar[1..max(K)]
, dan tandai posisi karakter dalam kolom itu dengan1
dan sisanya sebagai-1
. (Replikasi dengan -1 mengisi posisi itu dengan spasi.)'\/'[1+⍵=1]/⍨¨
: temukan karakter yang benar untuk setiap kolom, dan gandakan dengan daftar untuk kolom itu.⍉↑
: ubah hasilnya menjadi matriks dan letakkan di sebelah kanansumber
Python,
261241236 karakterItu mulai memakan waktu untuk
n=5
dan ke atas ...sumber
JavaScript (ES6) 159
163Sama seperti jawaban saya untuk Fibonacci Domino Tiling, saya memeriksa semua urutan n + n bit, dengan 1 menandai '/' dan 0 menandai '\' (hanya untuk output, '2' kemudian ditambahkan untuk menandai baris baru) . Sambil membangun pola ascii saya memeriksa saldo - angka yang sama 0 dan 1, dan tidak pernah pergi di bawah garis dasar awal - dan menampilkan apa yang mematuhi aturan.
Keluaran dilakukan dengan 'waspada', yaitu standar untuk codegolf JS tetapi cukup menjengkelkan, dan mungkin melanggar aturan. Menggunakan console.log jumlah karakter menjadi 165.
Kurang golf
Tes di konsol FireFox / FireBug.
Keluaran
sumber
-b-b
dan-n-n
bukan-2*b
?2*b+1
->b-~b
)CJam, 84 byte
Perhatikan bahwa program ini mencetak pegunungan dalam loop yang tidak terbatas sehingga penerjemah online tidak akan membantu Anda; aktifkan di baris perintah menggunakan
atau untuk mencoba penggunaan online
dan cukup tekan tombol run beberapa kali berturut-turut dan bayangkan outputnya digabungkan.
Ide dasarnya adalah bahwa kita tahu pegunungan dengan ukuran Q memiliki Q untuk setiap transisi ke atas dan ke bawah.
Kemudian jika itu valid, kita mencetaknya, jika tidak kita keluarkan dari tumpukan agar tidak meluap.
Perutean cetak pada dasarnya membangun setiap kolom sebagai ruang tinggi Q, lalu simbol, lalu cukup banyak ruang untuk mencapai karakter total Q + 1, dan kemudian kami mengubah dan mencetak garis dengan garis baru di antaranya.
sumber
C, 179
tidak termasuk spasi yang tidak perlu.
Strategi yang mirip dengan edc65. Saya menjalankan semua nilai
n*2
biner -bit, dengan mempertimbangkan/
= 1 dan\
= 0.Saya memformat string tunggal yang berisi
n
linebreak setiapn*3
karakter. Seperti ditulis, string berisi 1000 karakter, jadi biasanya ada banyak spasi putih yang dicetak setelah gunung. (Ini dapat diperbaiki dengan menambahkans[n*n*3]=0
sebelumputs
.) Bagaimanapun, ini memungkinkan saya untuk output seluruh gunung dengan satuputs
setelah memeriksa apakah itu sesuai dengan aturan.Saya akan mencoba mengubahnya menjadi suatu fungsi dan mengurangi ke satu
for
loop nanti.Keluaran (catat jumlah besar spasi putih di kanan)
sumber
Haskell, 140 byte
Setelah beberapa upaya gagal menjadi golf, saya berakhir dengan implementasi Haskell ini. Saya senang hanya berada dalam faktor 2 dari solusi APL!
Solusi golf:
Tidak dikumpulkan dan berkomentar:
Program ini membangun himpunan diagram gunung n-langkah secara rekursif. Setiap diagram diwakili oleh daftar string yang panjangnya tak terhingga, mewakili gunung yang ditarik ke samping diikuti oleh ruang yang memanjang hingga tak terbatas. Ini memastikan bahwa semua diagram memiliki ketinggian yang sama, yang membuat rekursi lebih mudah. Printer gunung menerima parameter yang memotong ketinggian hingga nilai yang terbatas.
Penggunaan sampel:
sumber
GolfScript 103 ( demo )
Program ini mengambil parameter integer yang akan di-render karena mem-mount semua representasi biner dari angka dari 0 menjadi 2 ^ (n-1). Itu tidak membuat kombinasi yang tidak valid (mis: yang masuk di bawah level 0).
sumber