Urutan bilangan bulat adalah urutan satu jika perbedaan antara dua angka berurutan dalam urutan ini adalah -1 atau 1 dan elemen pertamanya adalah 0.
Lebih tepatnya: a1, a2, ..., an adalah satu urutan jika:
For any k (1 ≤ k < n): |a[k] - a[k+1]|=1,
a[1]=0
Memasukkan
n
- jumlah elemen dalam urutans
- jumlah elemen dalam urutan
Keluaran
- satu set urutan / daftar / array / etc panjang
n
dengan jumlah elemens
, jika memungkinkan - set / list / array / etc kosong jika tidak memungkinkan
Contohnya
Untuk input 8 4
, output bisa [0 1 2 1 0 -1 0 1]
atau [0 -1 0 1 0 1 2 1]
. Mungkin ada kemungkinan lain.
Untuk input 3 5
, output kosong []
, karena tidak dapat dilakukan.
Aturan
Ini adalah kode golf, jawaban terpendek dalam byte yang menang. Pengajuan harus berupa program atau fungsi. Input / output dapat diberikan dengan salah satu cara standar .
(l-1)*l/2
dan-(l-1)*l/2
yang memiliki paritas yang sama dengan(l-1)*l/2
.Jawaban:
CJam,
56 47 4434 byteBanyak ruang untuk perbaikan di sini, tetapi inilah upaya pertama untuk ini:
Penghargaan kepada Dennis untuk cara yang efisien dalam melakukan
{ ... }%
bagian itu.Mencetak representasi array jika memungkinkan, jika tidak
""
Cobalah online di sini
sumber
{}%
dari kode Anda tidak seperti milik saya (yang hanya kode @ PeterTaylor, mengganti titik-titik dengan garis bawah). Jika saya menyumbangkan sesuatu untuk kode Anda, itu{}=
operator ..._{_W=)+}%\{_W=(+}%+
yang pertama membuat dua salinan, tambahkan 1 ke yang pertama, kurangi 1 dari yang lain. Contoh Anda membuat saya mencari cara melakukannya dalam satu{ ... }%
blok. Mengenai itu{ ... }=
, saya sudah mengurangi sebanyak itu dalam eksperimen saya, meskipun belum diposting.3 5
output seharusnya[]
dan tidak""
[]p
di CJam hanya keluaran ke""
. Jadi begitulah bahasa mewakili array kosong.JavaScript (E6) 79
82Tidak perlu kekerasan atau enumerasi semua tuple.
Lihat urutan panjang n sebagai n -1 langkah, setiap langkah menjadi kenaikan atau penurunan.
Catatan, Anda hanya bisa menukar kenaikan dengan penurunan, jumlah bervariasi 2, sehingga untuk panjang tertentu jumlahnya selalu genap atau selalu ganjil.
Setelah semua kenaikan, urutannya adalah 0, 1, 2, 3, ..., n-1 dan kita tahu jumlahnya adalah (n-1) * n / 2
Mengubah langkah terakhir, jumlah berubah 2, sehingga langkah terakhir berbobot 2.
Mengubah langkah berikutnya ke langkah terakhir, jumlah berubah dengan 4, jadi langkah terakhir berbobot 4. Itu karena langkah berturut-turut dibangun berdasarkan jumlah parsial sejauh ini.
Mengubah langkah sebelumnya, jumlah berubah dengan 6, jadi langkah terakhir beratnya 6 (bukan 8, itu bukan angka biner).
...
Mengubah langkah pertama berbobot (n-1) * 2
Algoritma
Kode tidak dikunci
Uji di Firefox / konsol FireBug
Keluaran
sumber
GolfScript (
4139 byte)Demo online
Terima kasih kepada Dennis untuk 41-> 39.
sumber
,0=
menjadi?
. Port langsung ke CJam akan menjadi 5 byte lebih pendek:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
{ ... }%
blok. Dalam kode saya, saya punya dua, mencoba menguranginya menjadi 1. Seperti halnya algoritma nyata, saya pikir Peter dan saya memposting algoritma yang sama hampir pada waktu yang sama.Mathematica, 73 byte
Solusi brute force sederhana.
Saya menghasilkan semua pilihan langkah. Lalu saya mengubahnya menjadi daftar terakumulasi untuk mendapatkan urutan satu. Dan kemudian saya mencari yang pertama yang jumlahnya sama dengan parameter kedua. Jika tidak ada, nilai standarnya adalah
{}
.sumber
Haskell, 56 byte
Penjelasan:
1,-1
dan panjang n-1:replicateM n-1[-1,1]
Contoh:
replicateM 2 [-1,1]
==[[-1,-1],[-1,1],[1,-1],[1,1]]
scanl
memiliki kinerja yang buruk, tetapi melakukan pekerjaan yang benar di sini.n
mana jumlahnyas
sumber
Control.Monad
hanya untuk menggunakanreplicateM
yang sudah terlalu lama. apa fungsi monadik lain yang dapat Anda gunakan untuk mensimulasikanreplicateM
?head$
ke solusi Anda.head
tidak kembali[]
untuk[] :: [[a]]
- dan saya benci kesalahan.mapM(\x->[1,-1])[2..n]
alih-alihsequence
danreplicate
.Python, 138
sumber
CJam,
655854 byteNyaris lebih pendek dari solusi Mathematica saya, tapi itu sebagian besar kesalahan saya karena masih tidak menggunakan CJam dengan benar:
Secara harfiah algoritma yang sama: dapatkan semua
n-1
-dari{1, -1}
. Temukan yang pertama yang akumulasinya sama dengans
, prepend a0
. Cetak array kosong jika tidak ada yang ditemukan.sumber
CJam, 40
Pendekatan lain dalam CJam.
sumber
Ruby (136)
sumber
J, 47 karakter
Periksa setiap urutan seperti banyak jawaban lainnya. Akan mencoba membuat solusi O (n) yang lebih pendek.
sumber
APL 38
Contoh:
Yang ini seperti yang lainnya hanya memaksa dengan kasar melalui setiap kombinasi untuk menemukan yang cocok, jika tidak ditemukan tidak menghasilkan apa-apa. Sebenarnya ia mencoba beberapa kombinasi lebih dari satu kali untuk membuat kode lebih pendek.
sumber