Geçiş dizileri


11

Geçiş Dizileri

Pozitif tamsayıların bir listesi verildiğinde A, her bir eleman bir öncekinden büyük veya ona eşitse ona artan bir sekans adı verin ; ve her öğenin öncekinden küçük veya ona eşit olması durumunda buna azalan bir dizi denir .

Bazı artan sekanslar:

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

Bazı azalan diziler:

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

Bir kesişme dizisi , biri artan bir dizi ve diğeri azalan bir dizi olmak üzere iki ayrık alt diziye ayrılabilen bir listedir.

Örneğin, liste:

[3,5,2,4,1]

bir geçiş dizisidir, çünkü içine ayrıştırılabilir:

[3,    4  ]
[  5,2,  1]

[3,4]artan sekans nerede ve [5,2,1]azalan sekans. Böyle bir çift (artan, azalan) alt diziyi geçiş sırasının ayrışması olarak adlandıracağız.

Liste:

[4,5,2,1,3]

bir geçiş sırası değildir; giderek artan ve azalan bir alt diziye ayrışmanın bir yolu yoktur.

Göreviniz girdi olarak pozitif tamsayıların bir listesini alan bir program / işlev yazmaktır; ve eğer bir geçiş sırası ise, iki listeyi ayrışmalarından birinde döndürün; veya liste bir geçiş sırası değilse tutarlı bir "falsey" değeri içerebilir.

Bu ; her dilde en kısa program / fonksiyon kazanır.

Kurallar:

  • Giriş esnektir.
  • Her zamanki boşluklar yasaktır.
  • Girişi ayrıştırmanın birden çok geçerli yolu varsa, bunlardan birini veya tümünü çıktısını alabilirsiniz.
  • Ayrışma için çıktı biçimlendirmesi esnektir; ancak iki alt sekans arasındaki ayrım konusunda açık olmalıdır.
  • Girişin bir geçiş sırası olmadığını belirtmek için herhangi bir tutarlı çıkış değeri kullanabilirsiniz; herhangi bir geçiş dizisinin çıktısına kıyasla açık olmadığı sürece. Cevabınızda falsey değerini belirtmelisiniz.

Test Durumları:

FalseGeçiş yapmayan dizileri belirtmek için kullanma :

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
Olası kopya . Gördüğüm sadece iki fark, diğer zorluğun girdi uzunluğunda polinom zamanında çalıştırılması ve iki alt dizinin yerine gerçek bir değere izin vermesidir (alt dizilerin kendilerinin geri döndürülmesi% 20 bonus kazanacaktır). Hala bana bir dupe gibi geliyor, ama çekiçlemeyeceğim.
Kevin Cruijssen

@KevinCruijssen zaman kısıtlaması muhtemelen bunu bir dupe yapmamak için tek başına yeterlidir.
Nick Kennedy

1
@NickKennedy Muhtemelen evet, bu yüzden onu dövmekten kaçındım. :)
Kevin Cruijssen

2
Önerilen test durumu: [3, 5, 2, 4, 4, 1, 1]. Mevcut test senaryoları, >=/ ile <gerçekten ne zaman olması gerektiğini ortadan >=kaldırmanızı sağlar <=.
Grimmy

1
@Arnauld: Evet, herhangi bir değer olabilir ("falsey" sadece şunu söylemek içindir: girişin bir geçiş sırası olması yanlıştır).
Chas Brown

Yanıtlar:


1

05AB1E , 15 14 13 bayt

2.Œ.ΔćRšεü@}W

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

2.Œ                    # all partitions of the input in 2 subsequences
   .Δ                  # find the first partition such that the following gives 1
     ćRš               # reverse the first subsequence
        ε  }           # map each subsequence to
         ü@            # pairwise greater-than
            W          # minimum (1 if all 1s, 0 otherwise)


1

JavaScript (ES6),  110 105  104 bayt

[[decreasing], [increasing]]1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

Çevrimiçi deneyin!

Nasıl?

n02LL

b[0]b[1]in

1i=11i=0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

bsome()


1

Haskell, 84 bayt

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

Geçerli tüm (decreasing,increasing)çiftlerin bir listesini veya böyle bir çift yoksa boş listeyi döndürür .

Çevrimiçi deneyin!


1

Python 3 , 109107 bayt

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

Çevrimiçi deneyin!

İşlev, olası tüm ayrışmaları standart çıktıya yazdırır. Olası ayrışma yoksa, hiçbir şey yazdırılmaz.

@Sriotchilism O'Zaic'e iyileştirme önerileri için teşekkürler.


Siteye hoş geldiniz. Ben hem bayt hem de tasarruf s<i[-1]yerine yapmak i[-1]>s ve benzer bir şekilde yapmanızı öneririz d[-1]<s .
Ad Hoc Garf Hunter

Önerin için teşekkürler. Cevabı güncelledim. Burada cevapları yayınlamak için kopyalanabilir bir şablon var mı?
Joel

Neyi kastettiğinden emin değilim? TIO'da zaten kullanmakta olduğunuz bir şablon var.
Ad Hoc Garf Hunter

Yalnızca TIO'da bir bağlantı oluşturdum ve bağlantıyı yazıma ekledim. Orada hiç şablon kullanmadım. Nerede?
Joel

1
@Joel - TIO sayfasının üstünde bazı zincir bağlantılarına benzeyen bir simge var. Bunu tıklayın ve ardından bir seçenekler sayfası elde edin. Bunlardan biri 'Code Golf Submission'. Bu kopya tampon içine istediğiniz biçimlendirilmiş şeyler koymak olacak! Ayrıca hoş geldiniz ve güzel bir çözüm!
Chas Brown


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.