Advent Challenge 6: Transport Dock Relabeling!


9

<< Sebelumnya Berikutnya >>

Berkat komunitas PPCG, Santa berhasil menyortir hadiahnya ke dalam urutan yang benar untuk pindah ke dermaga transportasi. Sayangnya, tanda-tanda dermaga transportasi rusak sehingga dia tidak tahu di mana harus meletakkan semua hadiah! Hadiah-hadiah tersebut semuanya dikelompokkan bersama dan bukan berdasarkan kisarannya, yang diakui Santa akan merupakan ide yang lebih baik.

Sekarang, mengingat hadiah dalam urutan yang diurutkan, tentukan semua konfigurasi rentang minimal yang mungkin yang akan menghasilkan saat ini berada dalam urutan yang benar. Artinya, temukan semua konfigurasi rentang minimal sedemikian rupa sehingga pengurutan hadiah menurut algoritma di Tantangan # 5 tidak akan mengubah urutan.

Tantangan

Konfigurasi rentang minimal adalah daftar rentang sehingga rentang masing-masing sekecil mungkin. Yaitu, jika rentang ditetapkan untuk mencakup subset tertentu dari hadiah, maka minimum dan maksimum kisaran harus sama dengan rentang dari subset tersebut. Dengan kata lain, mengecilkan kisaran di penutup akan menyebabkannya tidak lagi menjadi penutup.

Tantangannya adalah menemukan semua konfigurasi rentang minimal yang mungkin yang berlaku untuk ukuran saat ini. Mari kita ambil contoh:[3, 1, 2, 5, 4, 7, 6]

Ada kasus sepele, yaitu mengambil kisaran seluruh konfigurasi yang ada. Dalam hal ini, [[1, 7]]akan menjadi solusi.

Untuk contoh dengan elemen unik, case sepele lainnya adalah [[3], [1], [2], [5], [4], [7], [6]](karena rentang tidak perlu dipesan).

Untuk contoh ini, kita juga melihat itu [[1, 3], [4, 7]]dan [[1, 3], [4, 5], [6, 7]]akan berhasil, juga [[1, 3], [5], [4], [6, 7]]dan [[1, 3], [4, 5], [7], [6]].

Jawaban [3, 1, 2, 5, 4, 7, 6]akhirnya adalah [[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]].

Spesifikasi Format

Input akan diberikan sebagai daftar datar bilangan bulat positif dalam rentang angka yang didukung bahasa Anda yang wajar dalam format apa pun yang masuk akal. Input mungkin mengandung elemen duplikat. Output harus diberikan sebagai daftar 3D bilangan bulat positif dalam format apa pun yang masuk akal.

Setiap rentang dalam output Anda (yang berada di lapisan kedua) dapat direpresentasikan sebagai [min, max], [num]jika rentang nilai tunggal, atau sebagai seluruh rentang itu sendiri, tetapi format output Anda harus konsisten. Silakan tentukan jika Anda ingin menggunakan format output masuk akal yang sedikit berbeda.

Nilai duplikat harus dicakup oleh rentang tunggal dalam output; artinya, tidak ada dua rentang dalam output mungkin memiliki tumpang tindih.

Solusi Anda dapat mengembalikan rentang dalam urutan apa pun dan ini tidak harus bersifat deterministik.

Aturan

  • Celah Standar Berlaku
  • Ini adalah sehingga jawaban tersingkat dalam byte menang
  • Tidak ada jawaban yang akan diterima

Test Case untuk daftar dengan elemen duplikat:

2 3 2 4 -> [[[2, 3], [4]], [[2, 4]]]

Implementasi Referensi

Header adalah tautannya.

Catatan: Saya mendapat inspirasi untuk seri tantangan ini dari Advent Of Code . Saya tidak memiliki afiliasi dengan situs ini

Anda dapat melihat daftar semua tantangan dalam seri ini dengan melihat bagian 'Tertaut' dari tantangan pertama di sini .

Selamat bermain golf!

Jawaban:


3

Mathematica, 106 byte

sSelect[MinMax/@s~TakeList~#&/@Join@@Permutations/@IntegerPartitions@Tr[1^s],Unequal@@Join@@Range@@@#&]


Cobalah online!

Martin menyimpan 16 byte


3

Brachylog , 17 16 byte

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

Bekerja pada daftar dengan duplikat juga. Kisaran diwakili oleh daftar elemen yang dikandungnya. Cobalah online!

Penjelasan

Idenya adalah memecah daftar menjadi blok dan mengubah blok menjadi rentang, lalu verifikasi bahwa mereka tidak tumpang tindih.

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

JavaScript (ES6), 166 164 byte

Edit: versi terbaru yang sekarang mendukung duplikat

Mencetak hasilnya langsung ke konsol dalam format [min, maks] .

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

Uji kasus


0

Python 2 , 179 byte

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

Cobalah online!

Menghasilkan daftar rentang penuh.

Sangat terinspirasi oleh implementasi referensi.

Membangun semua partisi, lalu rentang min / maks untuk setiap partisi. Daftar rentang valid jika tidak ada nilai yang muncul lebih dari satu kali dalam daftar.


sum(l,[]) meratakan daftar daftar, dan memungkinkan saya memeriksa duplikat:

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Pyth , 17 byte

f{IsTmm}hSkeSkd./

Coba di sini!

Nah, itu jauh lebih baik. Menghasilkan seluruh rentang. Lihat riwayat revisi untuk versi sebelumnya (dengan 31 byte yang mengejutkan).

Bagaimana itu bekerja

f {IsTmm} hSkeSkd./ ~> Program lengkap.

               ./ ~> Daftar partisi.
     m ~> Peta menggunakan variabel d.
      md ~> Map over d menggunakan variabel k.
        hSk ~> Minimum k.
           eSk ~> Maksimal k.
       } ~> Kisaran integer inklusif.
f ~> Saring mereka ...
   sT ~> Yang, ketika diratakan,
 {I ~> Tidak berbeda dengan deduplikasi.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.