Bir listeyi düzgünleştirme


12

Negatif olmayan bir tamsayı kve sıralı bir tamsayı listesi Lgirdi ve çıktı olarak alan veya düzgün bir liste döndüren bir program veya işlev yazmalısınız M.

MListe sıralanmış halde Len fazla ktamsayı elemanı eklenerek artan listeden oluşturulur . Girilen tamsayılar, maksimum ileri farkının Molabildiğince küçük olacağı şekilde seçilmelidir . Bu en küçük değere "yumuşaklık" adını vereceğiz.

Listenin ileri farklar -1 3 8 11 15vardır 4 5 3 4ve maksimum ileri farktır 5.

İle 2eklemeleri düzgünlüğü 2 10 15IS 4ve olası bir çıkış olduğunu 2 6 10 11 15ileri farklarla 4 4 1 4.

Giriş

  • Negatif olmayan bir tam sayı k.
  • LEn az 2 elemanlı artan bir tamsayı listesi .

Çıktı

  • Artan tam sayı listesi M.
  • Eğer birden fazla doğru cevap varsa, bunlardan tam olarak çıktısını alın (herhangi biri yeterlidir).
  • Çözümünüz, bilgisayarımdaki herhangi bir örnek test vakasını bir dakikadan kısa bir sürede çözmelidir (sadece yakın vakaları test edeceğim. Ortalamanın altında bir bilgisayarım var.).

Örnekler

Girdi ( k, L) => Parantez içinde olası bir çıktı ve maksimum ileri farkı (çıktının bir parçası olmayan)

0, 10 20 => 10 20 (10)

2, 1 10 => 1 4 7 10 (3)

2, 2 10 15 => 2 6 10 11 15 (4)

3, 2 10 15 => 2 5 8 10 12 15 (3)

5, 1 21 46 => 1 8 15 21 27 33 39 46 (7)

5, 10 20 25 33 => 10 14 18 20 24 25 29 33 (4)

3, 4 4 6 9 11 11 15 16 25 28 36 37 51 61 => 4 4 6 9 11 11 15 16 22 25 28 36 37 45 51 59 61 (8)

15, 156 888 2015 => 156 269 382 495 608 721 834 888 1001 1114 1227 1340 1453 1566 1679 1792 1905 2015 (113)

8, -399 -35 -13 56 157 => -399 -347 -295 -243 -191 -139 -87 -35 -13 39 56 108 157 (52)

5, 3 3 3 => 3 3 3 3 (0)

Bu kod golf bu yüzden en kısa giriş kazanır.

Yanıtlar:


5

Pyth, 28 27 bayt

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

Girdi aşağıdaki gibi:

3
[2, 10, 15]

Gösteri. Kablo demetini test edin.

Not: Soru sorulduğunda, Pyth'te rFdiçeride kullanmakla ilgili küçük bir hata vardı u, ki bu sadece düzeltti. Böcek , kesinlikle amaçlanmayan Fiçinde kullanmak imkansız hale getirdi u.

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

                               Implicit:
                               z is the number of insertions, in string form.
                               Q is the input list.
              C,QtQ            Pairs of elements, e.g. [(2, 10), (10, 15)]
           rFd                 d = (a, b) -> range(a, b)
        %hH                    Take every H+1th element of that range
       t                       And throw out the first one.
      m                        Perform this process for each element pair
     s                         And combine the results into one list.

                               The above is a minimal set of additional elements
                               To reduce the maximal difference to H+1.

  u                     hvz    Repeat until the result stops changing, where
                               the prior result is G, H starts at 0 and
                               increases by 1 each repetition, and
                               G is initialized to eval(z)+1.
   ?               >GvzG       If not G[eval(z):], return G. In other words,
                               if the prior result was short enough, stop.
                               Also, this is always false on the initial call.
    smt%hHrFdC,QtQ             Otherwise, recalculate with H incremented.
S+Q                            Take the result, add the original list, and sort.

İşte soru sorulduğu anda tercümanla çalışacak bir versiyon. 28 bayt ve aynı şekilde çalışır:

S+Qu?smt%hHr.udC,QtQ>GvzGhvz

Gösteri.

Git sürümü uygun sürümü, f6b40e62


rF<seq>İki elementli kapları açmak için kullanmayı hiç düşünmemiştim .
orlp

@orlp Bu harika bir hile ve ufarklı bir şekilde çalışıp evar olmadığı günlerden urGHddaha kısa bir süre önce kullandım rhd@d1. Bunu Pyth hileleri sayfasına koyacağım.
isaacg

Bir karakteri tıraş edebilirsin, ihtiyacın yok U.
orlp

@orlp Teşekkürler. Aslında, yvzne zaman başarısız olur vz = 0, ama hvzhile yapar.
isaacg

Kod, soru sorulduğunda mevcut olan Pyth sürümü ile çalışmadığı için bu çözümü kabul etmemeyi seçtim. Eğer hata düzeltmesine dayanmayan bir cevap verirseniz, bana ping atın ve kabul edeceğim.
randomra

8

Python 2, 104

def f(L,k,d=1):
 M=[];p=L[0]
 for x in L:M+=range(p+d,x,d);p=x
 return M[k:]and f(L,k,d+1)or sorted(L+M)

d1'den başlayarak ve artırarak farklı maksimum artışları dener . Boşluktaki (p,x)her bir dsayıyı alarak birbirini izleyen her bir çiftin boşluklarını doldurur . Eğer Mkota izin verdiğinden daha uzundur, daha yüksek bir denemeye recurses d. Aksi takdirde, eklenen ve orijinal öğelerin bir listesini sıralanmış olarak döndürür.

Bu, tüm test durumlarını makinemde gecikmeden yapar.


1, 1000000000 gibi bir şey denedin mi?
edc65

@ edc65 Bu algoritmayı gerçekten çok uzun sürecekti, ama ondan önce yığın derinliği yolundan kaçtım.
xnor
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.