Скількома способами дорога може перетнути річку?


13

Уявіть пряму річку і дорогу, яка проходить через річку n разів через мости. Дорога не замикається на собі і нескінченно довга. Ця дорога вважалася б відкритим меандром. Відкрито меандрові є відкритою кривим, яка не перетинається з самими собою і простягається нескінченно на обох кінцях, які перетинають лінію п раз.

Дійсний меандр може бути описаний повністю у порядку розташування точок перетину, який він відвідує.

Кількість чітких закономірностей перетину з n перехрестями, якими може бути меандр, є n-м мендричним числом . Наприклад, n = 4:

Перші кілька номерів цієї послідовності:

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

Це послідовність OEIS A005316 .

Виклик

Написати програму / функцію , яка приймає ціле позитивне число п в якості вхідних даних і виводить п - й meandric номер .

Технічні умови

  • Застосовуються стандартні правила вводу / виводу .
  • Стандартні лазівки будуть заборонені .
  • Ваше рішення може бути 0-індексованим або 1-індексованим, але вкажіть, який саме.
  • Ця задача полягає не у пошуку найкоротшого підходу на всіх мовах, а у пошуку найкоротшого підходу в кожній мові .
  • Ваш код буде набраний у байтах , як правило, в кодуванні UTF-8, якщо не вказано інше.
  • Вбудовані функції, які обчислюють цю послідовність, дозволені, але включається рішення, яке не покладається на вбудований.
  • Пояснення навіть для "практичних" мов заохочуються .

Тестові справи

Це 0-індексовані. Зауважте, що вам не потрібно обробляти такі великі цифри, якщо ваша мова за замовчуванням не може.

Input      Output

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

У кількох кращих форматах:

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

1
Ви визначаєте меандр як закриту криву, але послідовність OEIS у вас є для меандрів за відкритими кривими. Ви замість цього мали на увазі A005315 ?
Не дерево

7
це рівень Project-Euler ...
J42161217

1
@Notatree О, там моя велика перекрутка дня ... Шукала. Виправлю, дякую, що повідомили мені!
повністюлюдський


1
Ще одна приказка (вибачте…): відкрита крива може мати кінцеві точки, але я думаю, що відкритий меандр повинен поширюватися на нескінченність з обох кінців. (Якщо кінцеві точки дозволені, у вас можуть бути криві, які роблять такі дії, щоб меандричні числа були б більшими.)
Не дерево

Відповіді:


11

Пітон 3 , 208 188 187 184 180 177 171 байт

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

Спробуйте в Інтернеті!

Зараз 1-індексований (раніше був 0-індексований, але 1-індексація зберегла байт через вдалий приціл щодо поведінки меандрів).

Пояснення

Це може бути те саме, що посилання, розміщене Jenny_mathy , але я не закінчив прочитати статтю, тому це лише логіка мого методу.

Я буду використовувати наступну ілюстрацію, представлену на OEIS , щоб візуалізувати результати.

введіть тут опис зображення

Кожен дійсний меандр може бути описаний повністю у порядку розташування точок перетину, який він відвідує. Це може банально спостерігатись на зображенні; сегмент вводу завжди на одній стороні (інакше число буде подвійним). Ми можемо представити тенденцію як сегментів входу, так і виходу до відповідних нескінченностей, просто додаючи до кожного замовлення крапку з обох боків - тобто, це (2, 1, 0)стане порядком (-1, 2, 1, 0, 3).

Зважаючи на це, завдання полягає в пошуку кількості замовлень або перестановок діапазону до n, які не перетинаються між собою. Перехрестя - це лише питання між парами точок, для яких сполучний відрізок лежить на одній стороні. Для будь-яких двох пар послідовних точок в перестановці, сегменти яких ділять сторону, незалежно від того, перетинаються вони еквівалентними тим, чи одна, і лише одна, з точок однієї пари знаходиться між двома елементами іншої пари. Таким чином, ми можемо визначити, чи є порядок дійсним, чи немає пар з однією точкою, що міститься в іншій парі, з сегментом на одній стороні.

Нарешті, визначивши обґрунтованість кожної перестановки, висновок функції зводиться до кількості перестановок, визнаних дійсними.


1
Ви вже робили це на уроці комбінаторики? Або ви просто FGITW надзвичайно важко?
Чарівна Восьминіжка Урна

2
@MagicOctopusUrn Чесно кажучи, я бився головою проти цього близько двох годин - тому я здогадуюсь останнього.
notjagan

Не заперечуєте, якби я використав якесь ваше пояснення у питанні? Тому що моє пояснення зараз ... не ... чудово.
повністюлюдський

1
@totallyhuman Не соромтеся використовувати будь-що, що здається корисним, хоча я думаю, що це не так вже й багато, оскільки багато особливо характерне для мого методу.
notjagan

5

Haskell , 199 байт

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

Спробуйте в Інтернеті!

Спираючись на розширення ідей Івана Дженсена, Перерахування літакових меандрів , 1999 р., На випадок відкритих меандрів. Це проходить через n = 1,…, 16 приблизно за 20 секунд на TIO.



@PeterTaylor У мене не було. Це схоже на новішу версію того ж документу, оновлену стратегією боротьби з відкритими меандрами, що, мабуть, простіше пояснити, ніж моя стратегія, але для цього потрібно набагато більше спеціальних випадків у коді.
Anders Kaseorg

0

APL (Dyalog Classic) , 127 115 байт

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

Спробуйте в Інтернеті!


Як це працює?
lirtosiast

@lirtosiast в основному це, але кодування циклу відповідності закінчується збігом цілих ідентифікаторів замість 0/1
ngn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.