Ada hasil kombinasi klasik bahwa jumlah cara untuk memasang 2*n
strip oleh 1*2
domino adalah angka Fibonacci ke- n . Tujuan Anda adalah untuk mencetak semua kemiringan untuk yang diberikan n
, digambar dengan garis dan garis vertikal seperti ini 8 kemiringan untuk n=5
:
|————
|————
——|——
——|——
|||——
|||——
————|
————|
||——|
||——|
|——||
|——||
——|||
——|||
|||||
|||||
Anda harus menyediakan program atau fungsi bernama yang mengambil n
input dan mencetak output yang diperlukan. Bytes paling sedikit menang.
Memasukkan
Sejumlah n
antara 1
dan 10
inklusif melalui STDIN atau input fungsi.
Keluaran
Cetak setiap kemungkinan dominasi 2*n
strip, yang digambar secara horizontal. Miring mungkin dalam urutan apa pun, tetapi masing-masing harus muncul tepat satu kali. Mereka harus dipisahkan oleh garis kosong.
Domino vertikal terbuat dari dua batang vertikal ( |
) dan domino horizontal dibuat dari dua garis putus-putus ( —
). Anda dapat menggunakan tanda hubung ( -
) sebagai ganti tanda hubung untuk tetap di ASCII.
Anda dapat melakukan apa saja dengan spasi putih selama hasil cetak terlihat sama.
——
dan|
panjangnya seperti milik Dennis, bukann
string—
dan|
disaring dengan—
muncul berpasangan. Dan untuk yang terakhir, saya mengharapkannya melalui regex atau operasi string pada string yang dihasilkan, sepertis.split('——
) `, bukan dengan pendekatan aritmatika seperti milik Anda.Jawaban:
C, 106
Versi golf
Versi asli
Bagaimana itu bekerja
Variabel
i
berjalan dari1<<n-1
bawah hingga 0, menghasilkan semua angka biner yang mungkin dengann
digit. 0 encode untuk|
dan 1 encode untuk-
. Kami tertarik pada angka yang berisi 1 berpasangan. Jelas angka seperti itu dapat dibagi 3.Ketika suatu angka dibagi dengan 3, angka asli dapat dipulihkan dengan mengalikan hasilnya dengan 2 dan menambahkannya ke dirinya sendiri (secara efektif saling-campur dengan 3.) Sebagian besar angka akan membutuhkan carry, tetapi ketika proses dilakukan pada jumlah menarik, tidak perlu membawa, jadi dalam kasus ini saja, ATAU dapat digunakan sebagai pengganti. Ini digunakan untuk menguji jumlah bunga, karena mereka adalah satu-satunya di mana ekspresi
i/3|i/3*2
mengembalikan nilai aslii
. Lihat contoh di bawah ini.1111
= 15 --->0101
= 5 --->1111
= 15 (valid,0101|1010
==0101+1010
)1001
= 9 --->0011
= 3 --->0111
= 7 (tidak valid,!0011|0110
=0011+0110
)Nilai tes selalu sama atau kurang dari nilai aslinya. Karena angka-angka yang bukan kelipatan 3 juga menghasilkan angka kurang dari aslinya ketika dibagi dengan 3 kemudian dikalikan dengan 3, tes memberikan FALSE yang diinginkan pada angka-angka ini juga.
Dalam versi asli, beberapa loop
j
digunakan untuk memindai biti
dan menghasilkan output. Dalam versi golf, satufor
loop digunakan, di manah
berjalan melalui semua angka dari(n*2)*(1<<n)-1
bawah hingga 0. Nilaii
dihasilkan olehh/2/n
. Variabelj
tidak lagi digunakan, karena kuantitas yang setara diperoleh darih%n
. Penggunaann*2
memungkinkan kedua garis untuk dicetak dari loop yang sama, dengan beberapa multiplexing yang bagus dalamputs
pernyataan untuk mencetak satu atau dua baris baru di akhir baris.Perhatikan bahwa daging ini berada di posisi kenaikan dari
for()
braket dan karena itu dijalankan setelah itui=h/2/h
.Output sampel n = 6:
sumber
i/3|i/3*2
Caranya adalah cerdik! Saya tidak mengharapkan ekspresi aritmatika untuk tata bahasa.CJam,
3327 byteTerima kasih kepada @ jimmy23013 untuk bermain golf 6 byte!
Cobalah online!
Latar Belakang
Ini adalah implementasi berulang dari algoritma rekursif:
Kemungkinan tilings untuk n dapat diperoleh dengan menambahkan domino vertikal ke kemungkinan tilings untuk n - 1 dan dua domino horizontal ke kemungkinan tilings untuk n - 2 .
Dengan cara ini, jumlah tilings untuk n adalah jumlah dari jumlah tilings untuk n - 1 dan n - 2 , yaitu, n th nomor Fibonacci.
Bagaimana itu bekerja
Contoh dijalankan
sumber
LNli{_'|f\@"——"f\+2/}*\;{_N}/
.f\
belum diimplementasikan pada 0.6.2, tapi saya bisa menggabungkan pendekatan kami. Terima kasih!Haskell, 89 byte
f
adalah fungsi yang diberikan nomor mengembalikan daftar satu baris dari semua kemungkinan Fibonacci tilings panjang n mungkin. tidak masalah bahwa ia mengembalikan satu baris, karena kedua baris dari semua tilings adalah sama.f
bekerja dengan memanggil secara berulangn-1
dann-2
dan menambahkan"|"
dan"--"
(masing-masing) ke string.g
adalah fungsi yang menjawab pertanyaan. pada dasarnya memanggilf
input, menggandakan setiap string sehingga akan menampilkan dua baris dan menggabungkan mereka semua dengan baris baru.contoh output:
sumber
CJam,
4237 byteSaya telah menghitung tanda hubung sebagai satu byte masing-masing karena pertanyaan memungkinkan untuk menggantinya dengan tanda hubung ASCII.
Cobalah online.
Bagaimana itu bekerja
Untuk mendapatkan semua kemiringan 2 × L , kami mengulangi semua bilangan bulat non-negatif I <3 L , membuat angka genap pada basis 3 sesuai dengan domino horizontal dan angka ganjil ke yang vertikal.
Karena setiap saya memiliki L atau kurang digit dalam basis 3, ini menghasilkan semua cara yang mungkin dari meliputi 2 × L Strip. Yang tersisa adalah menyaring penutup yang lebih besar atau lebih kecil dari 2 × L dan mencetak penutup yang tersisa.
Contoh dijalankan
sumber
3b
. Apakah itu benar?JavaScript (E6) 102
Hasilkan konfigurasi dari urutan bit, 0 -> '-' dan 1 -> '|'.
Uji di konsol firefox / firebug
Keluaran
sumber
Haskell: 109 byte
Ini adalah terjemahan dari Haskell one-liner yang terkenal untuk dengan malas menghitung urutan angka Fibonacci:
Urutan utama dari string ubin, tidak diserang:
Dan Fibonacci one-liner untuk perbandingan:
Contoh penggunaan:
sumber
Cobra - 176
Tidak bisa menunggu sampai saya menyelesaikan paket golf Cobra.
sumber
J - 54 char
Berfungsi
n
sebagai argumen di sebelah kanan.Akar utama golf ini adalah
(];'--'&,"1@[,'|',"1])&>/
. Ini mengambil daftar tilings of length (N-2) dan (N-1), dan mengembalikan daftar tilings of length (N-1) dan N. Ini adalah pengulangan Fibonacci standar, à la aljabar linier.];
mengembalikan daftar kanan sebagai kiri baru (karena tidak ada perubahan).'--'&,"1@[
menambahkan--
ubin ke daftar kiri, sementara'|',"1]
menambahkan|
ubin ke daftar kanan, dan mereka bersama-sama adalah daftar kanan baru.Kami mengulanginya berulang
n
kali (itu adalah@[&0
) dan mulai dengan ubin kosong dan satu ubin panjang 1. Lalu kita kembalikan pasangan pertama dengan0{::
. Artinya, jika kita menjalankannya nol kali, kita hanya mengembalikan yang pertama yaitu ubin kosong. Jika kami menjalankannyan
kali, kami menghitung hinggan
dan (n
+1) pasangan, tetapi membuang yang terakhir. Ini pekerjaan ekstra tetapi lebih sedikit karakter.Ini
(1 2$,:)
adalah sesuatu yang harus dilakukan J agar tilings dalam daftar mudah diperpanjang. Kami membuat daftar awal kiri menjadi daftar 1-item dari matriks 2-baris karakter, setiap baris memiliki panjang 0. Daftar awal kanan adalah sama, tetapi memiliki baris dengan panjang 1, diisi|
. Kemudian, kami menambahkan ubin baru ke setiap baris, dan menambahkan daftar matriks saat kami menggabungkan dua set ubin bersama. Ini adalah aplikasi sederhana dari sebuah konsep yang disebut peringkat J: pada dasarnya memanipulasi dimensi argumennya, dan secara implisit mengulang jika perlu.Cobalah sendiri di tryj.tk .
sumber
Python 3: 70 byte
Secara rekursif membangun semua string yang mungkin
s
mewakili satu baris domino, yang digandakan dan dicetak. Mulais
sebagai karakter baris baru membuat garis kosong terjadi secara otomatis.The
==
antara dua panggilan untukf
hanya untuk melakukan kedua fungsi panggilan. Ini biasanya kembaliNone
karena mereka baru saja mencetak, dan==
merupakan salah satu dari sedikit operator yang ditentukanNone
.The
and
s danor
s adalah untuk menghasilkan perilaku hubungan arus pendek hak untuk mereproduksiif
danelse
s kode ungolfed.Tidak Disatukan:
sumber
Retina , 44 byte
Catatan: Retina lebih muda dari tantangan ini.
Mengambil input di unary dengan baris baru tambahan.
Setiap baris harus menuju ke file sendiri dan
#
harus diubah ke baris baru di file. Ini tidak praktis tetapi Anda dapat menjalankan kode seperti halnya satu file dengan-s
flag, menjaga#
markers (dan mengubah baris baru ke#
dalam input juga). Anda dapat mengubah#
kembali ke baris baru di output agar mudah dibaca jika diinginkan. Misalnya:Metode:
1
perubahan pertama ke|
dan satu dengan dua yang pertama1
diubah ke--
. Kami melakukan ini sampai kami memiliki garis dengan setidaknya dua1
.1
tersisa, kami mengubahnya menjadi|
.sumber