도로가 강을 건너는 방법은 몇 가지입니까?


13

직선 강과 강을 건너가는 도로 상상 n 개의 다리를 통해 번. 길은 그 자체로 반복되지 않으며 무한히 길다. 이 길은 열린 사행으로 간주됩니다. 오픈 앤더는 자신과 교차하지 않는 교차 선 양단에서 무한히 연장 개방 곡선이며, N 번.

유효한 사행은 그것이 방문하는 교차점의 순서에 의해 완전히 설명 될 수 있습니다.

만나는 별개의 패턴의 수 N 개의 앤더 될 수있다 교점은 제 n meandric 번호 . 예를 들어, n = 4 :

이 순서의 처음 몇 숫자는 다음과 같습니다.

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

이다 OEIS 순서 A005316 .

도전

양의 정수 n 을 입력으로 받아서 n 번째 meandric 수를 인쇄 하는 프로그램 / 함수 를 작성하십시오 .

명세서

  • 표준 I / O 규칙이 적용됩니다.
  • 표준 허점금지되어 있습니다.
  • 솔루션 은 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
하나 더 퀴즈 (죄송합니다 ...) : 열린 곡선에는 끝 점이있을 수 있지만 열린 meander는 양쪽 끝에서 무한대로 확장되어야한다고 생각합니다. (끝 점이 허용되면 평균값이 더 큰 곡선을 만들 수 있습니다 .)
나무가 아닙니다

답변:


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 인덱싱은 meanders의 행동에 관한 운이 좋은 덕으로 인해 바이트를 저장했습니다).

설명

이것은 Jenny_mathy가 게시 한 링크 와 동일 할 수 있지만 논문을 읽지 않았으므로 이것이 내 방법의 논리입니다.

결과를 시각화하기 위해 OEIS 에 제공된 다음 그림을 사용합니다 .

여기에 이미지 설명을 입력하십시오

각각의 유효한 사행은 그것이 방문하는 교차점의 순서에 의해 완전히 설명 될 수 있습니다. 이것은 이미지에서 사소하게 관찰 될 수 있습니다. 항목 세그먼트는 항상 같은쪽에 있습니다 (그렇지 않으면 숫자가 두 배가 됨). 우리는 단순히 모든 주문에 어느 한쪽에 포인트 추가하여 각각의 무한의 입구와 출구 모두 세그먼트의 경향을 나타낼 수 - 말을하는 것입니다, 순서가 (2, 1, 0)될 것입니다 (-1, 2, 1, 0, 3).

이 점을 염두에두고, 과제는 n자신과 교차하지 않는 범위의 순서 또는 순열 수를 찾는 것 입니다. 교차점은 연결 세그먼트가 같은면에있는 점 쌍 사이의 문제입니다. 순열에서 세그먼트가 측면을 공유하는 연속 쌍의 두 쌍의 연속 점에 대해, 세그먼트의 교차 여부는 한 쌍의 점 중 하나만 다른 쌍의 두 요소 사이에 있는지 여부와 같습니다. 따라서 같은쪽에 세그먼트가있는 다른 쌍에 포함 된 한 점을 가진 쌍이 없는지 여부에 따라 주문이 유효한지 여부를 확인할 수 있습니다.

마지막으로 각 순열의 유효성을 확인한 후 함수의 출력은 유효한 것으로 확인 된 순열 수로 결정됩니다.


1
당신은 이미 조합 수업을 위해 이것을 했습니까? 아니면 아주 열심히 FGITW 했습니까?
매직 문어 Urn

2
@MagicOctopusUrn 솔직히, 나는 약 2 시간 동안 이것에 대해 머리를 강타했다. 그래서 나는 후자를 추측한다.
notjagan

질문에 당신의 설명 중 일부를 사용해도 될까요? 왜냐면 내 설명은 ...
완전히 인간적인

1
@totallyhuman 유용하다고 생각되는 것을 자유롭게 사용하십시오. 많은 것이 내 방법에 따라 다르기 때문에 너무 많지는 않다고 생각합니다.
notjagan

5

하스켈 , 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])

온라인으로 사용해보십시오!

Iwan Jensen의 아이디어 확장을 기반으로 1999 년, 공개 구불 구불 한 경우에 대한 평면 구불 구불 한 열거 . 이것은 TIO에서 약 20 초 안에 n = 1,…, 16을 통과 합니다.



@PeterTaylor 나는하지 않았다. 그것은 같은 논문의 최신 버전처럼 보이며 내 전략보다 설명하기 쉽지만 코드에서 더 많은 특수 사례가 필요한 공개 구제 수단을 다루기위한 전략으로 업데이트되었습니다.
Anders Kaseorg

0

APL (Dyalog 클래식) , (127) 115 바이트

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

온라인으로 사용해보십시오!


이것은 어떻게 작동합니까?
lirtosiast

@lirtosiast 기본적으로 이것 이지만 일치하는 루프를 인코딩하는 것은 0/1 대신 정수 ID로 일치하는 것으로 끝납니다
ngn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.