Urutan ajaib adalah urutan bilangan bulat non-negatif x[0..n-1]
sehingga ada beberapa x[i]
contohi
Misalnya, 6,2,1,0,0,0,0,0,0,0,0 adalah urutan ajaib karena ada 6 0, 2 1, dan seterusnya.
Tulis fungsi yang bila diberikan n, menampilkan semua urutan ajaib panjang n
Program yang dapat menghasilkan output yang benar untuk nilai n tertinggi dalam 10 detik menang. (Namun, semua program dipersilahkan)
Misalnya, program Alice dapat menangani hingga n = 15 dalam 10 detik sementara Bob dapat menangani hingga n = 20 dalam waktu yang sama. Bob menang.
Platform: Linux 2.7GHz @ 4 CPU
number
fastest-code
sequence
Agnishom Chattopadhyay
sumber
sumber
n>5
dengan solusi bukan dari bentuknya[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
? Saya sudah mencarin=20
dan tidak menemukan satu, dan bertanya-tanya apakah saya membuat kesalahan.Jawaban:
Python, n≈10 8
Ini menggunakan fakta, yang akan saya buktikan, bahwa satu-satunya urutan panjang Sihir
n
adalah:[1, 2, 1, 0]
dan[2, 0, 2, 0]
untukn=4
[2, 1, 2, 0, 0]
untukn=5
[n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0]
untukn>=7
Jadi, untuk
n>=7
, seseorang hanya perlu mengembalikan tuple besar. Saya dapat melakukan ini hingga kira-kiran=10^8
di laptop saya, yang kemungkinan dibatasi oleh memori; lagi dan membeku. (Berkat trichoplax untuk gagasan menggunakan tuple daripada daftar.) Atau, jika seseorang dapat mencetak kamus entri bukan nol{0:n-4, 1:2, 2:1, (n-4):1}
,, seseorang dapat melakukan ini untuk ginormousn
.Saya membuktikan keunikan untuk
n>=7
; yang lain dapat diperiksa dengan brute force atau casework.Jumlah entri
l
adalah jumlah total semua angka dalam daftar, yang panjangnyan
. Daftar ini memilikil[0]
nol, dann-l[0]
bukan nol entri. Tetapi menurut definisil[0]
harus bukan nol atau kita mendapatkan kontradiksi, dan masing-masing entri bukan nol lainnya setidaknya 1. Ini sudah merupakan jumlah daril[0] + (n-l[0]-1)*1 = n-1
jumlah keseluruhann
. Jadi tidak menghitungl[0]
, paling tidak ada satu 2 dan tidak ada entri lebih besar dari 2.Tapi itu berarti satu-satunya entri bukan nol
l[0], l[1], l[2], and l[l[0]]
, yang nilainya paling banyakl[0]
dan permutasi1,1,2
, yang memberikan jumlah maksimuml[0]+4
. Karena jumlah ini adalahn
, yang setidaknya 7, kita milikil[0]>=3
, dan seterusnyal[l[0]]=1
. Sekarang, setidaknya ada satu1
, yang artinyal[1]>=1
, tetapi jikal[1]==1
itu yang lain1
, makal[1]>=2
, yang menyiratkanl[1]
adalah satu-satunya2
. Ini memberil[2]=1
, dan semua entri yang tersisa0
, jadil[0]=n-4
, yang menyelesaikan solusi.sumber
Python 3, n≈40
Lakukan pencarian pertama dari daftar yang mungkin, mengisi entri dari kanan ke kiri, menghentikan pencarian pada akhiran jika tidak masuk akal, yang dapat terjadi jika:
n
(jumlah untuk seluruh daftar harusn
)i*l[i]
dalam sufiks melebihin
(jumlah untuk seluruh daftar harusn
)Saya memiliki awalan yang diuji asli dari kiri ke kanan, tetapi itu berjalan lebih lambat.
Output hingga
n=30
adalah:Kecuali untuk tiga daftar pertama
[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
, hanya ada satu daftar dari masing-masing panjangn>6
, dan memiliki bentuk[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
. Pola ini setidaknya bertahan hingga setidaknyan=50
. Saya menduga itu berlaku selamanya, dalam hal ini sepele untuk menghasilkan sejumlah besar ini. Bahkan jika tidak, pemahaman matematis tentang solusi yang mungkin akan sangat mempercepat pencarian.sumber
n=0
. Saya merindukan bahwa kami mengembalikan hasilnya untuk satun
, bukan menghitungn
. Ini membuat saya siapn=40
.Pyth - 15 byte
Menggunakan kekuatan kasar dengan semua urutan kemungkinan len
n
dan kemudian menyaring.Penjelasan lengkap segera hadir.
Coba di sini online .
sumber
K, 26 byte
Seperti pendekatan Maltysen, brute force. Inti dari program ini adalah predikat yang menguji apakah vektor yang diberikan adalah "sihir":
Buat vektor iota selama vektor input (
!#x
), hitung kemunculan setiap digit ((+/x=)'
) dan bandingkan hasilnya dengan vektor input (x~
). Jika ada kecocokan, Anda memiliki urutan ajaib.Sayangnya, tikaman pertama ini tampaknya cukup lambat. Menguji menggunakan Kona di laptop saya butuh sekitar 12 detik untuk menangani n = 7. Saya perlu memikirkan ini lebih banyak.
sumber