Listeyi Birleştir


14

Giriş

Çoğunuz, bir sayı listesini sıralamak için birleştirme sıralama algoritmasını biliyorsunuzdur . Algoritmanın bir parçası olarak, mergeiki sıralı listeyi bir sıralı listede birleştiren bir yardımcı işlev yazılır . Python benzeri sözde kodda, işlev genellikle şöyle görünür:

function merge(A, B):
  C = []
  while A is not empty or B is not empty:
    if A is empty:
      C.append(B.pop())
    else if B is empty or A[0] ≤ B[0]:
      C.append(A.pop())
    else:
      C.append(B.pop())
  return C

Fikir ilk elemanlarının küçük haşhaş tutmaktır Ave Bhem listeleri boş olan ve içine sonuçları toplamak kadar C. Eğer Ave Bikisi de sıralanır, sonra böyledir C.

Tersine, eğer Cbir sıralı liste ve biz herhangi iki alt sıralar bölmek Ave Bsonra Ave Baynı zamanda sıralanır ve merge(A, B) == C. İlginç bir şekilde, bu Csıralanmıyorsa, bu zorunlu değildir, bu da bizi bu zorluğa getirir.

Giriş

2*nGirişiniz [0, 1, 2, ..., 2*n-1], bazıları n > 0için liste olarak verilen ilk negatif olmayan tam sayıların permütasyonudur C.

Çıktı

İki liste Ave böyle bir Buzunluk nvarsa C == merge(A, B), çıktınız gerçeğe uygun bir değer ve aksi takdirde bir sahte değer olacaktır. Giriş kopya içermediğinden, mergeişlevde bağların nasıl koptuğu konusunda endişelenmenize gerek yoktur .

Kurallar ve Bonuslar

Bir işlev veya tam bir program yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Listeleri hesaplamanız gerekmediğini Ave B"evet" örneklerinde gerekli olmadığını unutmayın . Ancak, listeleri gerçekten çıkarırsanız, % -20 bonus alırsınız . Bu bonusu talep etmek için, tüm olasılıkları değil, yalnızca bir çift liste çıkarmanız gerekir. Bu bonusun güçlü yazılan dillerde talep edilmesini kolaylaştırmak için, "hayır" örneklerinde bir çift boş liste çıkarılmasına izin verilir.

Kaba zorlama yasak değildir, ancak son dört test vakasının tümünü 1 saniyenin altında hesaplamak için % -10 bonus vardır .

Test Durumları

"Evet" örneklerinde yalnızca bir olası çıktı verilir.

[1,0] -> False
[0,1] -> [0] [1]
[3,2,1,0] -> False
[0,3,2,1] -> False
[0,1,2,3] -> [0,1] [2,3]
[1,4,0,3,2,5] -> False
[4,2,0,5,1,3] -> [4,2,0] [5,1,3]
[3,4,1,2,5,0] -> [4,1,2] [3,5,0]
[6,2,9,3,0,7,5,1,8,4] -> False
[5,7,2,9,6,8,3,4,1,0] -> False
[5,6,0,7,8,1,3,9,2,4] -> [6,0,8,1,3] [5,7,9,2,4]
[5,3,7,0,2,9,1,6,4,8] -> [5,3,7,0,2] [9,1,6,4,8]
[0,6,4,8,7,5,2,3,9,1] -> [8,7,5,2,3] [0,6,4,9,1]
[9,6,10,15,12,13,1,3,8,19,0,16,5,7,17,2,4,11,18,14] -> False
[14,8,12,0,5,4,16,9,17,7,11,1,2,10,18,19,13,15,6,3] -> False
[4,11,5,6,9,14,17,1,3,15,10,12,7,8,0,18,19,2,13,16] -> [4,17,1,3,15,10,12,7,8,0] [11,5,6,9,14,18,19,2,13,16]
[9,4,2,14,7,13,1,16,12,11,3,8,6,15,17,19,0,10,18,5] -> [9,4,2,16,12,11,3,8,6,15] [14,7,13,1,17,19,0,10,18,5]

Yanıtlar:


3

Pyth, 39 * 0.9 * 0.8 = 28.08

#aY->QxQeS-QsY&YsY)KfqylTlQmsdty_Y%tlKK

Bu program her iki ikramiyeyi de istila eder. Birleştirme listesi mümkün değilse, bir çift liste yazdırır, aksi takdirde Pyth (ve Python) 'da bir falsy değeri olan boş bir liste.

Input:  [5,3,7,0,2,9,1,6,4,8]
Output: ([9, 1, 6, 4, 8], [5, 3, 7, 0, 2])
Input:  [5,7,2,9,6,8,3,4,1,0]
Output: [] (falsy value)

Çevrimiçi olarak test edebilirsiniz , ancak çevrimdışı sürümden biraz daha yavaş olabilir. Çevrimdışı sürüm, test senaryolarının her birini dizüstü bilgisayarımda <0,15 saniyede çözer.

Muhtemelen (biri) ilk kez, bir Pyth çözümü aktif olarak İstisnalar kullanır (en az 1 karakter kurtardı). Peter Taylor'ın çözümü ile aynı fikri kullanıyor.

                         preinitialisations: Q = input(), Y = []
#                 )     while 1: (infinite loop)
        eS-QsY             finds the biggest, not previous used, number
      xQ                   finds the index
    >Q                     all elements from ... to end
   -          &YsY         but remove all used elements
 aY                        append the resulting list to Y

When all numbers are used, finding the biggest number fails, 
throws an exception and the while loop ends.  
This converts [5,3,7,0,2,9,1,6,4,8] to [[9, 1, 6, 4, 8], [7, 0, 2], [5, 3]]

        msdty_Y  combine the lists each for every possible subset of Y (except the empty subset)
 fqylTlQ         and filter them for lists T with 2*len(T) == len(Q)
K                and store them in K

%tlKK        print K[::len(K)-1] (prints first and last if K, else empty list)

Pyth, 30 * 0.9 = 27.0

Ortaya çıkan listeleri yazdırmadan gerçekten çözmeyi denemedim. Ancak, yukarıdaki koda dayalı hızlı bir çözüm.

#aY->QxQeS-QsY&YsY)fqylsTlQtyY

Temelde sadece print deyimini kaldırdım. Çıktı da oldukça çirkin.

Input:  [0,1,2,3]
Output: [[[3], [2]], [[3], [1]], [[2], [1]], [[3], [0]], [[2], [0]], [[1], [0]]] (truthy value)
Input:  [5,7,2,9,6,8,3,4,1,0]
Output: [] (falsy value)

Çevrimiçi deneyin .


Yazdırmak yerine (K[0], Q-K[0])yazdırabileceğinizi görebilirsiniz (K[0], K[-1]). Yine de bunun bir tasarruf sağlayıp sağlamadığını bilmiyorum.
Peter Taylor

@PeterTaylor teşekkürler, 2 karakter kurtardı.
Jakube

@PeterTaylor ve hatta 2 karakter daha yazdırırsam K[::len(K)-1].
Jakube

4

GolfScript (35 * 0.9 = 31.5)

{.$-1>/~,)\.}do;]1,\{{1$+}+%}/)2/&,

Online demo oldukça yavaştır: Bilgisayarımda, ben% 10 azalma iddia yüzden, 0.04 saniyeden kısa sürede testlerin hepsi çalışır.

açıklama

C'deki en büyük sayı ile başlayan C soneki aynı listeden gelmelidir. Daha sonra bu muhakeme (C - sonekine) uygulanabilir, böylece problem alt küme toplamına düşer.


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.