유효한 피보나치 타일링 생성


9

배경

피보나치 타일링은 짧은 세그먼트 S 와 긴 세그먼트 L을 사용하는 (1D) 라인의 타일링입니다 . 이 두 프로토 타이핑을 사용하여 실제로 피보나치 타일링을하는 타일링을 위해서는 다음 조건이 충족되어야합니다.

  • 타일링에는 하위 시퀀스 SS가 포함되지 않아야합니다 .
  • 타일링에는 하위 시퀀스 LLL이 포함되어서는 안됩니다 .
  • 다음 대체를 모두 수행하여 새 타일을 구성하는 경우 결과는 여전히 피보나치 타일링이어야합니다.
    1. LLS
    2. SL
    3. L(빈 문자열)

몇 가지 예를 살펴 보겠습니다.

SLLSLLSLLSLS

두 개의 * S * s 또는 세 개의 * L * s를 포함하지 않지만 컴포지션을 수행하므로 유효한 타일링처럼 보입니다.

LSLSLSLL

그래도 괜찮아 보이지만 다시 작성하면

LLLS

유효한 피보나치 타일링이 아닙니다. 따라서 두 개의 이전 시퀀스도 유효한 타일링이 아니 었습니다.

반면에 우리가 시작하면

LSLLSLSLLSLSLL

이것을 짧은 시퀀스로 반복 작성

LSLLSLLS
LSLSL
LL
S

모든 결과는 유효한 피보나치 타일링입니다. 왜냐하면 우리는 해당 문자열 내에서 SS 또는 LLL을 얻지 못하기 때문 입니다.

더 읽기 위해, 이 타일링을 펜로즈 타일링과 간단한 1D 비유로 사용 하는 논문 이 있습니다.

도전

음수가 아닌 정수 N이 주어지면 유효한 모든 피보나치 바둑판 식을 N 문자를 포함하는 문자열 형식으로 반환 하는 프로그램이나 함수를 작성하십시오 ( S또는 L).

함수 인수 STDIN 또는 ARGV를 통해 입력을 받아 결과를 반환하거나 인쇄 할 수 있습니다.

이것은 코드 골프이며, 가장 짧은 대답 (바이트)이 이깁니다.

N      Output
0      (an empty string)
1      S, L
2      SL, LS, LL
3      LSL, SLS, LLS, SLL
4      SLSL, SLLS, LSLS, LSLL, LLSL
5      LLSLL, LLSLS, LSLLS, LSLSL, SLLSL, SLSLL
...
8      LLSLLSLS, LLSLSLLS, LSLLSLLS, LSLLSLSL, LSLSLLSL, SLLSLLSL, SLLSLSLL, SLSLLSLL, SLSLLSLS

그럴까요 LSLSL-> LL?

@ tolos 아 그래, 잘 잡아. 나는 그것을 고쳤다. 참고로, 이것은 비슷한 분해 규칙을 사용하여 맨 아래부터 시작하여 실제로 다른 방식으로 문자열을 생성했기 때문에 발생 했으며 조각의 경계와 관련하여 정확하게 뒤집을 수 는 없습니다 .
Martin Ender

답변:


4

CJam, 70 62 59 바이트

Qali{_'L:Xf+\'S:Yf++}*{{_X2*/Xf-Yf/Xf*Y*}h]N*_X3*#\Y2*#=},p

STDIN에서 읽습니다. 온라인으로 사용해보십시오.

예제 실행

$ cjam tilings.cjam <<< 5
["LLSLL" "SLSLL" "SLLSL" "LSLSL" "LSLLS" "LLSLS"]

작동 원리

아이디어는 모든 길이의 L과 S의 문자열을 적절한 길이로 푸시하고 결과가 빈 문자열이 될 때까지 각각에 변환을 적용하고 문자열 시퀀스를 연결하고 금지 된 하위 문자열을 검색하는 것입니다.

Qa         " Push R := [ '' ].                                                            ";
li{        " Do the following int(input()) times:                                         ";
  _'L:Xf+  " Append (X := 'L') to a copy of all strings in R.                             ";
  \'S:Yf+  " Append (Y := 'S') to all original strings in R.                              ";
  +        " Concatenate the arrays into R.                                               ";
}*         " R now contains all strings of L's and S's of length int(input()).            ";
{          " For each S ∊ R:                                                              ";
  {        "                                                                              ";
    _      " Push a copy of S.                                                            ";
    X2*/   " Split S at 'LL'.                                                             ";
    Xf-    " Remove 'L' from the chunks.                                                  ";
    Yf/    " Split the chunks at 'S'.                                                     ";
    Xf*    " Join the chunks, separating by 'L'.                                          ";
    Y*     " Join, separating by 'S'.                                                     ";
  }h       " If the resulting string is non-empty, repeat.                                ";
  ]N*      " Join the array of resulting strings from S to '', separating by linefeeds.   ";
  _X3*#    " Push the index of 'LLL' a copy in the resulting string (-1 if not present).  ";
  \Y2*#    " Push the index of 'SS' in the original string (-1 if not present).           ";
  =        " Check if the indexes are equal; this happens if and only if both are -1.     ";
},         " Filter: Keep S in R if and only if = pushed 1.                               ";
p          " Print a string representation of R.                                          ";

3

GolfScript (86 바이트)

~:|'LS'1/\{{.{1&!'LLS'2/=}%'SS'/'SLS'*[.(1&{'LS'\+}*]{.)1&{'SL'+}*}/}%.&}*['']+{,|=},p

이것은 인플레이션 접근이다 : 그것은 시작 LS및 규칙을 사용하여 확장 LL -> SLS, L -> S, S -> LL, 및 선행 또는 후행하는 것은 S이 가질 수있는 L단어 경계에 추가했다.

온라인 데모


@ MartinBüttner는 보통 golfscript.apphb.com을 사용하여 온라인 데모에 연결하지만 중첩 루프 주위에 버그가있는 이전 버전을 실행 중이며 ( 2012 년 12 월 3 일 릴리스에서 수정 됨 )이 프로그램을 올바르게 실행할 수 없습니다.
피터 테일러

3
@ MartinBüttner 죄송합니다. 버그에 대해 알려 주셔서 감사합니다. 웹 사이트를 새로운 GS 버전으로 업데이트했습니다. 데모를 보려면 이 링크 를 클릭하십시오 .
Cristian Lupascu

@ w0lf, 업데이트 (최근 변경으로 시간 제한을 늘려 주셔서 감사합니다).
피터 테일러

1

하스켈, 217

import Control.Monad
data F=L|S deriving (Eq)
f n=filter s$replicateM n [L,S]
r (L:L:m)=S:r m
r (S:m)=L:r m
r (L:m)=r m
r []=[]
s []=True
s m|v m=s$r m
s _=False
v (L:L:L:_)=False
v (S:S:_)=False
v (_:m)=v m
v []=True

설명 :

4 가지 기능을 정의합니다.

  • f 정수를 취하고 결과를 반환

    replicateM n [L,S][L,S]길이로 가능한 모든 순열을 만듭니다. n filter s ...이 목록을 목록으로 필터링합니다.s

  • r 주어진 목록을 1 레벨 씩 줄입니다.

    이것은 단순히 패턴 일치로 수행됩니다. 2로 시작 L하는 목록은 시작으로 시작하고 S나머지는 줄어 듭니다.

  • v 주어진 규칙에 따라 주어진 목록을 검증합니다 (3 연속 L 없음, 2 연속 S 없음)

    목록이 2 개의 잘못된 시퀀스 (L, L, L 또는 S, S) 중 하나로 시작하면 결과는 False이고 빈 목록은 유효하며 비어 있지 않은 목록은 첫 번째 요소가 제거 된 상태에서 다시 검사됩니다.

  • s 목록과 모든 축소 된 목록이 유효한지 확인합니다.

    다시 : 빈 목록이 유효하며 더 이상 축소 할 수 없습니다.
    인수로 제공된 목록이 유효하면 목록이 s다시 확인되어 축소 됩니다.
    그렇지 않으면 결과는False

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.