Tugas
Tulis fungsi / program yang mengambil
n
parameter / input dan mencetak / mengembalikan jumlah topologi (yang diperlihatkan di bawah) pada set{1,2,...,n}
.
Definisi Topologi
Misalkan X adalah himpunan terbatas apa pun, dan asumsikan bahwa T, yang merupakan himpunan bagian dari himpunan X (yaitu himpunan yang berisi himpunan bagian X), memenuhi persyaratan ini :
X dan set kosong di T.
Jika dua himpunan U dan V berada di T, maka penyatuan kedua himpunan tersebut berada di T.
Jika dua himpunan U dan V berada di T, maka perpotongan kedua himpunan tersebut berada di T.
... maka T disebut topologi pada X.
Spesifikasi
Program Anda adalah:
- sebuah fungsi yang diambil
n
sebagai parameter - atau program yang menginput
n
dan mencetak atau mengembalikan jumlah topologi (berbeda) pada set
{1,2,...,n}
.- sebuah fungsi yang diambil
n
adalah bilangan bulat non-negatif yang kurang dari 11 (tentu saja tidak ada masalah jika program Anda menangani n lebih besar dari 11), dan hasilnya adalah bilangan bulat positif.Program Anda tidak boleh menggunakan segala jenis fungsi perpustakaan atau fungsi asli yang menghitung jumlah topologi secara langsung.
Input contoh (nilai n): 7
Contoh output / pengembalian: 9535241
Anda dapat memeriksa nilai pengembalian di sini atau di sini .
Tentu saja, kode terpendek menang.
Pemenangnya diputuskan, namun, saya dapat mengubah pemenang jika kode yang lebih pendek muncul ..
sumber
Jawaban:
Haskell, 144 karakter
Hampir implementasi langsung dari spesifikasi, modulo beberapa monad magic.
Sangat lambat untuk
n > 4
.sumber
Python, 147 karakter
Cepat untuk N <= 6, lambat untuk N = 7, tidak mungkin N> = 8 akan pernah selesai.
Set individual diwakili oleh bitmask integer, dan topologi oleh set bitmask.
S(i,K)
menghitung jumlah topologi berbeda yang dapat Anda bentuk dengan memulaiK
dan menambahkan set dengan bitmasks> =i
.sumber
Zsh, 83 karakter
Solusi ini cocok dengan surat persyaratan Anda (tetapi tidak, tentu saja, semangat). Tidak diragukan lagi ada cara untuk menekan angka lebih banyak lagi.
sumber
Python, 131 karakter
lambda n:sum(x&(x>>2**n-1)&all((~(x>>i&x>>j)|x>>(i|j)&x>>(i&j))&1 for i in range(2**n)for j in range(2**n))for x in range(2**2**n))
Versi yang diperluas:
Sebagai contoh, misalkan n = 3. Himpunan bagian yang mungkin dari [n] adalah
di mana bit ih menunjukkan apakah saya berada di subset. Untuk menyandikan himpunan bagian himpunan bagian, kami melihat bahwa masing-masing himpunan bagian ini milik atau tidak termasuk kelompok yang dimaksud. Jadi, misalnya,
menunjukkan bahwa x mengandung {}, {2}, dan {1,2,3}.
sumber