有効なフィボナッチタイルを生成する


9

バックグラウンド

フィボナッチタイリングは、短いセグメントSと長いセグメントLの 2つのセグメントを使用した(1D)ラインのタイリングです(長さの比率は黄金比ですが、この課題には関係ありません)。これらの2つのプロトタイルを使用してタイリングを実際にフィボナッチタイリングにするには、次の条件を満たす必要があります。

  • タイリングには、サブシーケンスSSを含めることはできません。
  • タイリングには、サブシーケンスLLLを含めることはできません。
  • 次のすべての置換を実行して新しいタイリングを構成する場合でも、結果はフィボナッチタイリングでなければなりません。
    1. LLS
    2. SL
    3. L(空の文字列)

いくつかの例を見てみましょう:

SLLSLLSLLSLS

2つの* S *または3つの* L *が含まれていないため、これは有効なタイリングのように見えますが、構成を実行してみましょう。

LSLSLSLL

それでも問題はないように見えますが、これをもう一度作成すると、

LLLS

これは有効なフィボナッチタイルではありません。したがって、前の2つのシーケンスも有効なタイリングではありませんでした。

一方、

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ああ、いいキャッチ。直した。私は実際には文字列、他の方法ラウンド、同様の分解規則を使用して、下からを生成し、それらではないためFYI、これが起こったまさにそれがフラグメントの境界に来るときリバーシブル。
マーティンエンダー

回答:


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 -> SLSL -> SS -> LL、および先頭または末尾にはS持つことができますLワード境界で加えます。

オンラインデモ


@MartinBüttner、私は通常、golfscript.apphb.comを使用してオンラインデモにリンクしますが、ネストされたループに関するバグのある古いバージョンを実行しており(2012年12月3日リリースで修正済み)、このプログラムを正しく実行できません。
Peter Taylor

3
@MartinBüttnerおっと。バグについて知らせてくれてありがとう。ウェブサイトを新しいGSバージョンに更新しました。デモについては、このリンクをクリックしてください
クリスティアンルパスク2014

@ w0lf、更新に感謝します(時間制限を増やすための最近の変更にも感謝します)。
Peter Taylor

1

Haskell、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.