Sebelumnya saya mendefinisikan proses penghancuran array
Dalam naksir kita membaca array kiri ke kanan. Jika pada suatu titik kita menemukan dua elemen yang sama dalam satu baris, kita menghapus yang pertama dan menggandakan yang kedua.
Sebagai contoh di sini adalah proses menghancurkan array berikut
[5,2,2,4]
^
[5,2,2,4]
^
[5,2,2,4]
^
[5,4,4]
^
[5,4,4]
^
[5,8]
^
Perhatikan bahwa elemen yang sama dapat diciutkan beberapa kali. Dalam contoh 2,2,4
itu runtuh menjadi 8
dalam satu pass.
Sekarang menghancurkan array itu mudah, yang sulit adalah menghancurkannya. Tugas Anda adalah mengambil array bilangan bulat positif sebagai input dan output array terbesar yang dapat membentuk input ketika dihancurkan berulang kali. Misalnya array [4]
dibentuk dengan menghancurkan [2,2]
yang pada gilirannya dibentuk oleh menghancurkan [1,1,1,1]
. Karena kita tidak dapat memiliki nilai [1,1,1,1]
- nilai non integer tidak dapat dihapus lebih lanjut dan dengan demikian adalah jawaban kami.
Anda tidak akan pernah menerima 0
dalam array input Anda karena array tersebut dapat diperluas tanpa batas waktu. Anda juga tidak akan pernah menerima kasing dengan dua nomor ganjil yang sama di sebelah satu sama lain, kasing seperti itu tidak bisa merupakan hasil penghancuran.
Ini adalah kode-golf sehingga jawaban akan dinilai dengan ukuran sumbernya yang diukur dalam byte dengan lebih sedikit byte yang lebih baik.
Sebelum Anda mulai menjawab, saya hanya ingin mengatakan bahwa tantangan ini jauh lebih sulit daripada yang terlihat. Periksa intuisi Anda saat Anda melanjutkan dan pastikan jawaban Anda melewati semua kasus uji.
Uji Kasus
[] -> []
[5] -> [5]
[6] -> [3,3]
[8] -> [1,1,1,1,1,1,1,1]
[4,8] -> [1,1,1,1,1,1,1,1,1,1,2]
[2,8] -> [1, 1, 1, 1, 2, 1, 1, 1, 1]
[4,4] -> [1,1,1,1,1,1,1,1]
sumber
[1,1,1,1,1,1,1,1,1,1,2]
menghasilkan[4, 8]
bukan[8, 4]
? hal ini harus[1,>1,1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,>2,1,1,1,1,1,1,2]
,[4,1,>1,1,1,1,1,2]
,[4,2,1,>1,1,1,2]
,[4,2,>2,1,1,2]
,[4,>4,1,1,2]
,[8,1,>1,2]
,[8,2,>2]
,[8,4]
?[1,>1,1,1,1,1,1,1,1,1,2]
,[2,>1,1,1,1,1,1,1,1,2]
,[2,1,>1,1,1,1,1,1,1,2]
,[2,2,>1,1,1,1,1,1,2]
,[2,2,1,>1,1,1,1,1,2]
,[2,2,2,>1,1,1,1,2]
,[2,2,2,1,>1,1,1,2]
,[2,2,2,2,>1,1,2]
,[2,2,2,2,1,>1,2]
,[2,2,2,2,2,>2]
,[2,2,2,2,4>]
, kedua pass:[2,>2,2,2,4]
,[4,>2,2,4]
,[4,2,>2,4]
,[4,4,>4]
,[4,8>]
. Semoga itu jelas. Jika Anda ingin beberapa kode untuk melihat pertanyaan sebelumnya memiliki jawaban yang mengimplementasikan fungsi penghancuran.[4, 4]
harus dilepas, karena kita tidak akan pernah mendapatkan array setelah urutan stretch => crush, karena ini akan berakhir dengan[8]
Jawaban:
JavaScript (Node.js) ,
237221213186 byteCobalah online!
Algoritma ini menghitung susunan regangan optimal, dengan merentangkan setiap angka ke max, dan kemudian, jika perlu, itu meremukkan kembali sepasang angka di tempat yang tepat, secara efektif menciptakan "penghancur blokir", mengganggu urutan naksir dari angka sebelumnya.
Contohnya:
[1, 1, 1, 1, 1, 1]
memberi[4,2]
setelah dihancurkan, tetapi[1, 1, 1, 1, 2]
menghasilkan[2, 4]
Tantangannya adalah menentukan di mana tepatnya penghancur blokir harus ditempatkan sehingga penghancuran array yang dihasilkan memberikan hasil yang tepat:
[2, 4]
membutuhkan penghancur blokir (angka yang diregangkan adalah1
, diulang, dan[1, 1]
lebih pendek dari[1,1,1,1]
), tetapi[4, 2]
dan[2, 6]
tidak memerlukan satun
urutan sebelumnya, dan jika kondisi di atas diverifikasi, maka urutan saat ini adalah pengulangann
urutan. Untuk menghentikan urutan himpitan angka sebelumnya, kita perlu menempatkan penghancur blokir di akhirn
urutan kedua dari angka saat ini untuk meregangkan. Contoh:,[2, 8] => [(1, 1)=n, (1, 1) + (2) + (1, 1) + ...]
atau[4, 8] => [(1, 1, 1, 1)=n, (1, 1, 1, 1) + (1, 1, 2) + ...]
sumber
Jelly , 42 byte
Cobalah online!
Program lengkap. Sangat tidak efisien, tetapi berhasil.
sumber
Python 2 ,
230228226 byteBekerja dengan mengulangi semua daftar yang mungkin dengan jumlah yang sama dengan yang dimasukkan. Menghapus yang tidak sama dengan array input dalam keadaan hancur, memilih yang terpanjang.
Edit: -2 byte dengan menghapus
if
fungsi utamaEdit: -2 byte dengan menghapus dua tanda kurung yang tidak perlu
Cobalah online!
Penjelasan
Fungsi utama, bertanggung jawab untuk menemukan semua solusi yang mungkin dan memilih yang terpanjang
Fungsi hancurkan, yang memeriksa apakah y sama dengan salah satu crush.
Hasilkan semua kemungkinan permutasi dengan jumlah yang diberikan
sumber
05AB1E ,
4137 byteCobalah online!
Port solusi Javascript saya.
Penjelasan:
sumber