Tantangan
Diberikan bilangan bulat n ≥ 4 , menghasilkan permutasi bilangan bulat [0, n-1] dengan properti yang tidak memiliki dua bilangan bulat berurutan yang bersebelahan. Nilai permutasi pi
adalah jumlah abs(pi[i] - i)
untuk semua indeks i
.
Contohnya
(1, 3, 0, 2)
memiliki nilai6
(0, 2, 4, 1, 3)
memiliki nilai6
(0, 2, 4, 1, 3, 5)
memiliki nilai6
(0, 2, 4, 1, 5, 3, 6)
memiliki nilai8
Skor jawaban Anda
Skor jawaban Anda adalah jumlah nilai permutasi Anda n = 4 .. 14
ditambah jumlah byte yang digunakan oleh kode Anda. Semakin rendah skor, semakin baik. Kode Anda harus memberikan output yang valid untuk semua nilai tersebut n
.
Anda harus dapat menjalankan pengiriman sampai selesai di mesin Anda.
Dalam hal ikatan, waktu pengeditan terakhir yang menghasilkan skor yang relevan akan menjadi penentu.
Bukankah ini pertanyaan yang sama dengan yang ini ?
Jawaban untuk pertanyaan terkait tidak akan kompetitif untuk pertanyaan ini karena mereka tidak berupaya untuk mengoptimalkan nilai permutasi. Misalnya untuk n=10
, permutasi yang [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
diberikan oleh sebagian besar jawaban di sana memberikan nilai 30
. Anda dapat melakukan jauh lebih baik dari itu.
Untuk bagian permutasi dari pertanyaan, nilai optimal keseluruhan paling banyak 120
. (Terima kasih kepada @Laikoni.) Sedangkan jawaban Dennis untuk pertanyaan sebelumnya skor 222 . (Terima kasih kepada @ user202729.)
sumber
[6,6,6,8,10,12,12,12,14,16,18]
untuk skor 120. Menariknya pola ini dapat ditemukan di A078706 .A078706
dengann=17
, yang dapat memiliki skor20
.Jawaban:
Jelly ,
363433323130 byte, hasil: 120Terima kasih kepada Dennis untuk -1 byte! (secara implisit dengan memperbaiki bug Jelly, meskipun fitur tersebut mendahului tantangan)
Fitur baru: akumulasi jumlah (
Ä
).Cobalah online!
Gunakan pengindeksan 1.
Mengambil waktu linier juga.
Program C ++ ini menghasilkan permutasi terkecil secara leksikografis, dengan asumsi bahwa | i - p i | ≤ lebar (di mana lebar adalah konstanta hardcoded) untuk semua 0 ≤ i <n , dengan kompleksitas waktu sekitar O (lebar 2 × 2 2 × lebar × n) (yang hanya O (n) untuk lebar tetap ): Cobalah online !
Bagaimana?
Amati polanya. Kami mencatat bahwa urutan semua elemen kecuali 4 yang terakhir adalah awalan dari
Menghitung perbedaan inkremental urutan.
Catat periode 5.
Implementasi Jelly:
Untuk 4 elemen terakhir,
cukup paksa semua 24 kemungkinan. O (1) .(catatan: Saya tidak lagi memaksa semua 24 kemungkinan dari versi 32-byte)
sumber
0 2 4 1 3 5 8 6
, dan memiliki faktor percabangan yang lebih besar tetapi tidak memiliki pola sederhana.CJam (60 byte + 120 = 180 skor)
Test suite online dengan skor terintegrasi
Perpanjangan hingga n = 24
Pembedahan
sumber
Haskell , skor 146 + 89 + byte
Pola berulang [1,3,0,2], terakhir
mod i 4
elemen disetel dengan tangan.Algoritma sebelumnya (132 + 116):
Bruteforces jumlah lompatan panjang yang benar ± 2 atau ± 3. Memilih yang terakhir yang memiliki angka yang benar di dalamnya, tampaknya berfungsi dengan baik dan jauh lebih murah daripada menerapkan skor. Tio hanya kehabisan waktu sebelum skor terakhir, yaitu 18.
Cobalah online!
sumber
Japt, 120 + 20 = 140
(Menyalin salah satu solusi saya dari tantangan lain akan memberi saya nilai 227)
Cobalah atau gunakan versi ini untuk memeriksa skor. Kedua versi ini mungkin mulai memberi tahu Anda sekitar 9.
Penjelasan
sumber
Ruby , skor 120 +
112 106 9182 byteCobalah online!
Urutannya pada dasarnya
(a-2)+(a+2)%5
.Jika n mod 5 bukan 0 atau 1, 3 atau 4 elemen terakhir berbeda.
Ini masih setengah-kode, selalu menemukan solusi terbaik, mungkin bisa bermain golf sedikit lagi, tapi saya sudah kehabisan ide.
sumber
JavaScript (Node.js) , skor 148 +
10973 byteCobalah online! Penjelasan:
l
melacak nomor terakhir yang dihasilkan danm
melacak nomor berikutnya dari paritas yang berlawanan denganl
; setelahl
melebihim+2
variabel dipertukarkan. Penyesuaian dilakukan pada awal urutan sehingga urutan yang panjangnya bukan kelipatan 5 tidak melewatkan angka, dan penyesuaian lainnya dibuat untukn=4
.sumber