Bir yol nehri geçebilir?


13

Düz bir nehir ve nehir giden bir yol düşünün n köprüler aracılığıyla zamanlarda. Yol kendi kendine dönmüyor ve sonsuz uzun. Bu yol açık bir menderes olarak kabul edilir. Bir açık menderes kendi kesişmez ve çizgiyi kesecek iki ucunda sonsuz uzanan açık bir eğrisini göstermektedir , n kere.

Geçerli bir kıvrım tamamen ziyaret ettiği kesişim noktalarının sırası ile tanımlanabilir.

Bir kıvrımlı olabilen n kavşak ile belirgin kavşak paterni sayısı , n . Örneğin, n = 4:

Bu dizinin ilk birkaç sayısı:

1, 1, 1, 2, 3, 8, 14, 42, 81, 262, 538, 1828, 3926, 13820, 30694, 110954...

Bu OEIS dizisi A005316'dır .

Meydan okuma

Giriş olarak pozitif bir tamsayı n alan ve n. Boyutsal sayıyı yazdıran bir program / işlev yazın .

Özellikler

  • Standart I / O kuralları geçerlidir.
  • Standart boşluklar vardır yasak .
  • Çözümünüz 0 dizinli veya 1 dizinli olabilir, ancak lütfen hangisini belirtin.
  • Bu zorluk tüm dillerdeki en kısa yaklaşımı bulmak değil, her dilde en kısa yaklaşımı bulmakla ilgilidir .
  • Kodunuz , aksi belirtilmedikçe, genellikle UTF-8 kodlamasında bayt cinsinden puanlanır .
  • Bu diziyi hesaplayan yerleşik işlevlere izin verilir, ancak yerleşik bir teknolojiye dayanmayan bir çözüm eklemek teşvik edilir.
  • "Pratik" diller için bile açıklamalar teşvik edilmektedir .

Test senaryoları

Bunlar 0 dizinlidir. Diliniz varsayılan olarak kullanılamıyorsa, bu büyük sayıları işlememeniz gerektiğini unutmayın.

Input      Output

1          1
2          1
11         1828
14         30694
21         73424650
24         1649008456
31         5969806669034

Birkaç iyi biçimde:

1 2 11 14 21 24 31
1, 2, 11, 14, 21, 24, 31

1
Bir kıvrımı kapalı bir eğri olarak tanımlarsınız, ancak sahip olduğunuz OEIS dizisi açık eğrilerle kıvrımlar içindir. Şunu mu demek istediniz A005315 yerine?
Bir ağaç değil

7
Bu Project-Euler seviyesidir ...
J42161217 21:17

1
@Notatree Oh, günün büyük vidalanması var ... Onu arıyordum. Düzeltecek, bana bildirdiğiniz için teşekkürler!
totallyhuman


1
Bir kelime oyunu (özür dilerim…): açık bir eğrinin uç noktalara sahip olmasına izin verilir, ancak açık bir kıvrımın her iki uçta sonsuza kadar uzanması gerektiğini düşünüyorum. (Uç noktalara izin verilirse, meandrik sayıların daha büyük olması için böyle şeyler yapan eğrilere sahip olabilirsiniz .)
bir ağaç değil

Yanıtlar:


11

Python 3 , 208 188 187 184 180 177 171 bayt

lambda n:sum(all(i-j&1or(x<a<y)==(x<b<y)for(i,(a,b)),(j,(x,y))in d(enumerate(map(sorted,zip((0,)+p,p+(n,)))),2))for p in d(range(n)))
from itertools import*;d=permutations

Çevrimiçi deneyin!

Şimdi 1-endeksli (daha önce 0-endeksliydi ama 1-endeksleme, kıvrımların davranışlarıyla ilgili şanslı bir tuhaflık nedeniyle bir bayt kaydetti).

açıklama

Bu, Jenny_mathy tarafından gönderilen bağlantı ile aynı olabilir , ancak makaleyi okumadım , bu yüzden bu sadece benim yöntemimin arkasındaki mantık.

Sonuçları görselleştirmek için OEIS'te verilen aşağıdaki çizimi kullanacağım.

resim açıklamasını buraya girin

Her geçerli kıvrım tamamen ziyaret ettiği kesişim noktalarının sırası ile tanımlanabilir. Bu görüntüde önemsiz bir şekilde görülebilir; giriş segmenti her zaman aynı taraftadır (aksi takdirde sayı iki katına çıkar). Giriş ve çıkış segmentlerinin her bir tarafa basitçe her iki tarafa bir nokta ekleyerek, yani düzen (2, 1, 0)haline gelecek şekilde kendi sonsuzluklarına eğilimini temsil edebiliriz (-1, 2, 1, 0, 3).

Bunu akılda tutarak, görev, nkendisiyle kesişmeyen aralıkların emir veya permütasyon sayısını bulmaktır . Kavşaklar yalnızca bağlantı parçasının aynı tarafta bulunduğu nokta çiftleri arasındaki bir sorundur. Kesitleri kesişip kesişmesin, bir tarafı paylaşan bir permütasyondaki iki ardışık nokta çifti için, bir çiftin noktalarından birinin ve sadece bir tanesinin diğer çiftin iki elemanı arasında olup olmadığına eşittir. Bu nedenle, bir siparişin geçerli olup olmadığını, aynı tarafta bir segmente sahip başka bir çift tarafından bir noktaya sahip çift olup olmadığına karar verebiliriz.

Son olarak, her bir permütasyonun geçerliliğini belirledikten sonra, fonksiyonun çıktısı geçerli olduğu belirlenen permütasyon sayısına iner.


1
Bunu zaten bir kombinatorik sınıfı için yaptınız mı? Yoksa sadece FGITW'i son derece zor mu yaptınız?
Sihirli Ahtapot Urn

2
@MagicOctopusUrn Dürüst olmak gerekirse, yaklaşık iki saattir başımı buna dayayordum - sanırım ikincisi.
notjagan

Sorudaki açıklamanızın bir kısmını kullanmamın bir sakıncası var mı? Çünkü şu an açıklamam ... harika değil.
totallyhuman

1
@totallyhuman Yararlı görünen herhangi bir şeyi kullanmaktan çekinmeyin, ancak özellikle benim yöntemime özgü olduğu için çok fazla olmadığını hayal ediyorum.
notjagan

5

Haskell , 199 bayt

1!x=x
-1!(-1:x)=1:x
n!(i:x)=i:(n-i)!x
0#([],[])=1
0#_=0
n#(a,b)=sum$((n-1)#)<$>(-1:a,-1:b):[(a,-i:b)|i:a<-[a]]++[(-j:a,b)|j:b<-[b]]++[(j!a,i!b)|i:a<-[a],j:b<-[b],i+j>=0]
f n=n#([],[-1,1])+n#([1],[1])

Çevrimiçi deneyin!

Iwan Jensen'deki fikirlerin , Düzlem kıvrımlarının numaralandırılması , 1999'un açık kıvrımlar örneğine genişletilmesine dayanarak . Bu , TIO'da yaklaşık 20 saniyede n = 1,…, 16 ile geçer.



@PeterTaylor yapmamıştım. Aynı makalenin daha yeni bir versiyonuna benziyor, muhtemelen açıklamam için bir stratejiyle güncellenmiş, muhtemelen açıklamam stratejimden daha kolay, ancak kodda çok daha özel durumlar gerektiriyor.
Anders Kaseorg

0

APL (Dyalog Klasik) , 127 115 bayt

⊃⊃⌽{↓⍉(⊃,/c),∘(+/)⌸(≢¨c←{1↓¨⍳¨⍨0,¨((×2↑¯1⌽⍵)/¯1 1⌽¨⊂⍵),(⊂∊#⍵#),(××/m,≠/m)/⊂1↓¯1↓(⊢-⍵×~)⍵∊m2↑¯1⌽⍵}¨⊃⍵)/⊃⌽⍵}⍣⎕⌽1,⊂⍳2

Çevrimiçi deneyin!


Bu nasıl çalışıyor?
lirtosiast

@lirtosiast temelde bu ancak kodlayan eşleşen döngü 0/1
ngn
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.