Artan alt bölümlere ayrılma


16

Şartname

Bu zorluğu belirtmek kolaydır: girdiniz boş olmayan bir negatif tamsayı dizisidir ve göreviniz bunu olabildiğince az artan alt dizilere bölmektir. Daha resmi olarak, girdi dizisi ise A, çıktı şu şekilde diziler dizisidir B:

  • Her diziler ayrık (mutlaka bitişik olmayan) alt dizilere Bbir bölüm oluşturur A. Endüktif olarak, bu, ya Btekli dizi içeren Aya da ilk elemanının bir alt dizisi Bolduğu Ave geri kalanının Ada bu alt dizinin kaldırıldığı bir bölümü oluşturduğu anlamına gelir.
  • İçindeki her dizi Bartıyor (kesinlikle değil).
  • İçindeki dizi sayısı Bminimumdur.

Hem giriş hem de çıkış, dilinizin yerel dizi biçiminde alınabilir. Birkaç doğru çıkış olabileceğini unutmayın.

Misal

Giriş dizisini düşünün A = [1,2,1,2,5,4,7,1]. Bir olası çıktı B = [[1],[1,2,4,7],[1,2,5]]. Bölüm durumu bu şemadan açıkça görülmektedir:

A    1 2 1 2 5 4 7 1
B[0]               1
B[1] 1 2       4 7
B[2]     1 2 5

Ayrıca, her dizi Bartıyor. Son olarak, Aartan iki alt diziye bölünemez, bu nedenle uzunluğu Bda minimumdur. Böylece geçerli bir çıktıdır.

Kurallar ve puanlama

Bir işlev veya tam bir program yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez. Zaman sınırlaması yoktur, ancak göndermeden önce çözümünüzü tüm test senaryolarında değerlendirmelisiniz.

Test senaryoları

Yalnızca bir olası çıktı gösterilir, ancak birkaç geçerli seçenek olabilir. Özellikle, sonuçtaki dizilerin sırası önemli değildir (ancak her bir dizi artan sırada olmalıdır).

[0] -> [[0]]
[3,5,8] -> [[3,5,8]]
[2,2,2,2] -> [[2,2,2,2]]
[1154,1012,976,845] -> [[845],[976],[1012],[1154]]
[6,32,1,2,34,8] -> [[1,2,8],[6,32,34]]
[1,12,1,12,1,13] -> [[1,1,1,13],[12,12]]
[6,4,6,13,18,0,3] -> [[0,3],[4,6,13,18],[6]]
[1,2,3,2,3,4,7,1] -> [[1,1],[2,2,3,4,7],[3]]
[0,9,2,7,4,5,6,3,8] -> [[0,2,3,8],[4,5,6],[7],[9]]
[7,1,17,15,17,2,15,1,6] -> [[1,1,6],[2,15],[7,15,17],[17]]
[4,12,2,10,15,2,2,19,16,12] -> [[2,2,2,12],[4,10,15,16],[12,19]]
[10,13,9,2,11,1,10,17,19,1] -> [[1,1],[2,10,17,19],[9,11],[10,13]]
[3,7,3,8,14,16,19,15,16,2] -> [[2],[3,3,8,14,15,16],[7,16,19]]
[15,5,13,13,15,9,4,2,2,17] -> [[2,2,17],[4],[5,9],[13,13,15],[15]]

3
Kurallar [0,5,2,0] -> [[0,5],[0,2]], (ör. Her birini bir kez kullanmak yerine ilk sıfırı geri dönüştürme) gibi çözümlere izin veriyor gibi görünüyor . Bu kasıtlı mı?
feersum

@feersum Bu kasıtlı değildi, iyi yakalandı. Koşulları yeniden yazdım B, umarım şimdi daha açıktırlar.
Zgarb

Yanıtlar:


3

Haskell, 54 bayt

n#[]=[[n]]
n#(l:c)|[n]<=l=(n:l):c|1<2=l:n#c
foldr(#)[]

Kullanım örneği: foldr(#)[] [4,12,2,10,15,2,2,19,16,12]->[[2,2,2,12],[4,10,15,16],[12,19]]

Nasıl çalışır: sağ uçtan başlayarak giriş listesini gözden geçirin. Mevcut elemanı prepending ile (listelerinin) çıkış listesi oluşturmak nbirinci alt liste için lburada ndaha az ya da baş eşittir l. Eğer yoksa n, çıktı listesinin sonunda yeni bir singleton listesi oluşturun .


1

Pyth, 20 bayt

fTu&ahfSI+THGHGQm[)Q

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açgözlü yaklaşım. len(input)Boş listeler oluşturuyorum . Daha sonra, inputan listesindeki her sayıyı yineleyerek , numarayı ekledikten sonra sıralanan ilk listeyi seçin.

Açıklama:

fTu&ahfSI+THGHGQm[)Q   implicit: Q = input list
                m[)Q   create a list of empty lists and assign to G
  u            Q       iterate over all numbers H in input:
      f     G             filter for lists T in G, which satisfy:
         +TH                 create a new list out of T and H
       SI                    and check if it is sorted
     h                    take the first such list T
    a        H            and append H
   &          G           logical and with G (so that u doesn't overwrite G)
fT                     remove all empty lists

@ThomasKwa Şimdi oldukça fazla sayıda ek test durumunu test ettik. Yanlış sonuç veren tek bir tane bulunamadı. Eminim, Greedy her zaman doğru sonucu döndürür.
Jakube

@ThomasKwa Oh, bu karşı örnek farklı bir açgözlü stratejiydi (en uzun artan alt diziyi bulun, kaldırın ve tekrarlayın). Ayrıca bu gönderimin başarısız olduğu bir test vakası bulamıyorum ...
Zgarb

Bence yükün işe yaradığını kanıtlamak için cevap verenin üzerinde olduğunu düşünüyorum. Bunun geçerli olduğu kanıtlanırsa oylarım.
lirtosiast
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.