In quanti modi una strada può attraversare un fiume?


13

Immagina un fiume dritto e una strada che attraversa il fiume n volte attraverso i ponti. La strada non si snoda su se stessa ed è infinitamente lunga. Questa strada sarebbe considerata un meandro aperto. Un meandro aperto è una curva aperta, che non si interseca e si estende all'infinito su entrambe le estremità, che si interseca una linea n volte.

Un meandro valido può essere descritto interamente dall'ordine dei punti di intersezione che visita.

Il numero di modelli distinti di intersezione con n intersezioni che un meandro può essere è l' ennesimo numero medio . Ad esempio, n = 4:

I primi numeri di questa sequenza sono:

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

Questa è la sequenza OEIS A005316 .

Sfida

Scrivi un programma / funzione che accetta un intero positivo n come input e stampa l' ennesimo numero medio .

specificazioni

  • Si applicano le regole I / O standard .
  • Sono vietate le scappatoie standard .
  • La tua soluzione può essere 0 indicizzata o 1 indicizzata ma specifica quale.
  • Questa sfida non riguarda la ricerca dell'approccio più breve in tutte le lingue, ma piuttosto la ricerca dell'approccio più breve in ciascuna lingua .
  • Il tuo codice verrà assegnato un punteggio in byte , di solito nella codifica UTF-8, se non diversamente specificato.
  • Le funzioni integrate che calcolano questa sequenza sono consentite ma è incoraggiata l'inclusione di una soluzione che non si basa su un incorporato.
  • Le spiegazioni, anche per le lingue "pratiche", sono incoraggiate .

Casi test

Questi sono indicizzati 0. Nota che non è necessario gestire numeri così grandi se la tua lingua non è in grado di default.

Input      Output

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

In alcuni formati migliori:

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

1
Definisci un meandro come una curva chiusa, ma la sequenza OEIS che hai è per i meandri a curve aperte. Cercavi A005315 , invece?
Non un albero il

7
questo è il livello Project-Euler ...
J42161217

1
@Notatree Oh, c'è il mio grosso casino del giorno ... Lo stava cercando. Risolverà, grazie per avermelo fatto notare!
totalmente umano il


1
Un altro cavillo (scusate ...): una curva aperta può avere degli endpoint, ma penso che un meandro aperto debba estendersi all'infinito ad entrambe le estremità. (Se gli endpoint sono consentiti, puoi avere curve che fanno cose del genere in modo che i numeri medi siano più grandi.)
Non un albero

Risposte:


11

Python 3 , 208 188 187 184 180 177 171 byte

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

Provalo online!

Ora 1-indicizzato (era precedentemente 0-indicizzato ma 1-indicizzazione salvava un byte a causa di una stranezza fortunata riguardo al comportamento dei meandri).

Spiegazione

Questo potrebbe essere lo stesso del link pubblicato da Jenny_mathy , ma non ho finito per leggere il documento, quindi questa è solo la logica alla base del mio metodo.

Userò la seguente illustrazione fornita su OEIS per visualizzare i risultati.

inserisci qui la descrizione dell'immagine

Ogni meandro valido può essere descritto interamente dall'ordine dei punti di intersezione che visita. Questo può essere banalmente osservato nell'immagine; il segmento di immissione è sempre dalla stessa parte (altrimenti il ​​numero sarebbe doppio). Possiamo rappresentare la tendenza di entrambi i segmenti di entrata e di uscita nei rispettivi infiniti semplicemente aggiungendo ad ogni ordine un punto su entrambi i lati - vale a dire, l'ordine (2, 1, 0)diventerebbe (-1, 2, 1, 0, 3).

Con questo in mente, il compito è trovare il numero di ordini, o permutazioni dell'intervallo fino a n, che non si intersecano con se stessi. Le intersezioni sono solo un problema tra coppie di punti per i quali il segmento di collegamento si trova sullo stesso lato. Per ogni coppia di punti consecutivi in ​​una permutazione i cui segmenti condividono un lato, indipendentemente dal fatto che si intersecano, è equivalente al fatto che uno, e solo uno, dei punti di una coppia si trovi tra i due elementi dell'altra coppia. Come tale, possiamo determinare se un ordine è valido se non ci sono coppie con un punto contenuto da un'altra coppia con un segmento sullo stesso lato.

Infine, dopo aver determinato la validità di ciascuna permutazione, l'output della funzione si riduce al numero di permutazioni ritenute valide.


1
Lo hai già fatto per un corso di combinatoria? O hai semplicemente FGITW eccezionalmente duro?
Magic Octopus Urn,

2
@MagicOctopusUrn Onestamente, ho battuto la testa contro questo per circa due ore - quindi immagino che quest'ultimo.
Notjagan,

Ti dispiacerebbe se ho usato alcune delle tue spiegazioni nella domanda? Perché la mia spiegazione al momento ... non è ... eccezionale.
totalmente umano il

1
@totallyhuman Sentiti libero di usare tutto ciò che sembra utile, anche se immagino che non sia troppo poiché molto è specifico del mio metodo in particolare.
notjagan,

5

Haskell , 199 byte

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])

Provalo online!

Basato su un'estensione delle idee di Iwan Jensen, Enumerazioni di meandri aerei , 1999 al caso di meandri aperti. Questo passa attraverso n = 1,…, 16 in circa 20 secondi su TIO.



@PeterTaylor Non l'ho fatto. Sembra una versione più recente dello stesso documento, aggiornata con una strategia per gestire meandri aperti che è probabilmente più facile da spiegare rispetto alla mia strategia, ma che richiede molti altri casi speciali nel codice.
Anders Kaseorg,

0

APL (Dyalog Classic) , 127 115 byte

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

Provalo online!


Come funziona?
lirtosiast

@lirtosiast fondamentalmente questo, ma la codifica del loop di corrispondenza termina con ID interi corrispondenti invece di 0/1
ngn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.