Advent Challenge 6: Taşıma Rıhtımı Yeniden Etiketleme!


9

<< Önceki Sonraki >>

PPCG topluluğu sayesinde, Santa hediyelerini ulaşım iskelesine geçmek için doğru sıraya koymayı başardı. Ne yazık ki, ulaşım rıhtımı işaretleri kırıldı, bu yüzden tüm hediyeleri nereye koyacağını bilmiyor! Hediyelerin hepsi Noel Baba'nın daha iyi bir fikir olacağını itiraf ettiği aralıklarına göre değil, birlikte gruplandırılmıştır.

Şimdi, sıralı düzende verilen hediyeler göz önüne alındığında, şimdiki zamanın doğru sırada olmasını sağlayacak olası tüm minimum aralık konfigürasyonlarını belirleyin. Yani, Challenge # 5'teki algoritmaya göre hediyeleri sıralamanın sıralamayı değiştirmeyeceği şekilde tüm minimum aralık yapılandırmalarını bulun.

Meydan okuma

Minimum aralık yapılandırması, aralıkların her biri mümkün olduğunca küçük olacak şekilde aralık listesidir. Diğer bir deyişle, bir aralık belirli bir hediye alt kümesini kapsayacak şekilde belirlenmişse, aralığın minimum ve maksimum değerleri alt kümeninkiyle aynı olmalıdır. Başka bir deyişle, kapaktaki herhangi bir aralığı daraltmak artık kapak olmamasına neden olur.

Buradaki zorluk, mevcut boyutlar için geçerli olabilecek tüm olası minimum aralık konfigürasyonlarını bulmaktır. Bir örnek verelim:[3, 1, 2, 5, 4, 7, 6]

Mevcut yapılandırmanın tamamını almak için önemsiz bir durum var. Bu durumda, [[1, 7]]bir çözüm olurdu.

Benzersiz unsurlara sahip örnekler için, başka bir önemsiz durum olacaktır [[3], [1], [2], [5], [4], [7], [6]](çünkü aralıkların sipariş edilmesine gerek yoktur).

Bu örnek için, biz de görmek [[1, 3], [4, 7]]ve [[1, 3], [4, 5], [6, 7]]hem de, çalışacak [[1, 3], [5], [4], [6, 7]]ve [[1, 3], [4, 5], [7], [6]].

İçin son cevap [3, 1, 2, 5, 4, 7, 6]olurdu [[[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]]].

Biçimlendirme Spesifikasyonları

Giriş, dilinizin makul desteklenen sayı aralığında makul bir tamsayıların düz bir listesi olarak verilecektir. Giriş yinelenen öğeler içerebilir. Çıktı, makul herhangi bir formatta pozitif tamsayıların 3D listesi olarak verilmelidir.

(İkinci tabakanın altındadır) çıktınıza Her aralık olarak da temsil edilebilir [min, max], [num]bu tek değer aralığı, ya da tüm aralığı kendisi, ancak çıkış biçimi olarak tutarlı olmalıdır eğer. Lütfen biraz farklı bir çıktı biçimi kullanmak isteyip istemediğinizi belirtin.

Yinelenen değerler çıktıdaki tek bir aralıkta yer almalıdır; yani, çıkıştaki hiçbir iki aralıkta çakışma olamaz.

Çözümünüz aralıkları herhangi bir sırayla döndürebilir ve bunun deterministik olması gerekmez.

kurallar

  • Standart Loopholes Uygula
  • Bu yani bayttaki en kısa cevap kazanır
  • Hiçbir cevap kabul edilmeyecek

Yinelenen öğeleri içeren bir liste için Test Durumu:

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

Referans uygulaması

Üstbilgi bağlantıdır.

Not: Advent Of Code'dan bu meydan okuma serisi için ilham aldım . Bu siteyle hiçbir bağlantım yok

Buradaki ilk zorluğun 'Bağlantılı' bölümüne bakarak dizideki tüm zorlukların bir listesini görebilirsiniz .

Mutlu golf!

Yanıtlar:


3

Mathematica, 106 bayt

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


Çevrimiçi deneyin!

Martin 16 bayt kurtardı


3

Brachylog , 17 16 bayt

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

Yinelenen listelerde de çalışır. Aralıklar, içerdikleri öğelerin listesiyle temsil edilir. Çevrimiçi deneyin!

açıklama

Fikir, listeyi bloklara ayırmak ve blokları aralıklara dönüştürmek, ardından üst üste gelmediklerini doğrulamaktır.

{~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 bayt

Düzenle: artık kopyaları destekleyen güncellenmiş sürüm

Sonuçları doğrudan konsola [min, maks] formatında yazdırır .

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)

Test senaryoları


0

Python 2 , 179 bayt

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]]

Çevrimiçi deneyin!

Tam aralıkların bir listesini çıkarır.

Referans uygulamasından büyük ölçüde ilham aldı.

Tüm bölümleri ve ardından her bölüm için min / maks aralıkları oluşturur. Listede birden fazla değer görünmüyorsa, aralık listesi geçerlidir.


sum(l,[]) bir liste listesini düzleştirir ve kopyaları kontrol etmeme izin verir:

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 bayt

f{IsTmm}hSkeSkd./

Burada deneyin!

Şimdi bu çok daha iyi. Tüm aralıkları çıktılar. Önceki sürüm için düzeltme geçmişine bakın (31 baytlık şaşırtıcı bir şekilde).

Nasıl çalışır

f {IsTmm} hSkeSkd./ ~> Tam program.

               ./ ~> Bölümü listele.
     m ~> d değişkeni ile eşleme.
      md ~> k değişkeni kullanarak d üzerinden eşleme yapın.
        hSk ~> Minimum k.
           eSk ~> Maksimum k.
       } ~> Kapsayıcı tam sayı aralığı.
f ~> Bunları filtrele ...
   sT ~> Düzleştirildiğinde,
 Tekilleştirme konusunda değişmezler.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.