বৈধ ফিবোনাচি টিলিংস উত্পন্ন করুন


9

পটভূমি

ফিবোনাচি টাইলিং হ'ল (1 ডি) লাইনের দুটি টুকরোগুলি ব্যবহার করে: একটি সংক্ষিপ্ত, এস , এবং একটি দীর্ঘ এল , এল (তাদের দৈর্ঘ্যের অনুপাতটি স্বর্ণের অনুপাত, তবে এটি এই চ্যালেঞ্জের সাথে প্রাসঙ্গিক নয়)। এই দুটি প্রোটোটাইল ব্যবহার করে টাইলিংয়ের জন্য প্রকৃতপক্ষে ফিবোনাচি টাইলিং হতে নিম্নলিখিত শর্তগুলি পূরণ করতে হবে:

  • টালি দ্বারা আচ্ছাদন subsequence থাকতে পারবে না এস এস
  • টাইলিংয়ে অবশ্যই এলটিএলটি অনুচ্ছেদে থাকা উচিত ।
  • নিম্নলিখিত সমস্ত বিকল্পগুলি সম্পাদন করে যদি কোনও নতুন টাইলিং রচনা করা হয় তবে ফলাফলটি অবশ্যই একটি ফিবোনাচি টাইলিং হতে হবে:
    1. এলএলএস
    2. এসএল
    3. এল(খালি স্ট্রিং)

আসুন কয়েকটি উদাহরণ দেখুন:

SLLSLLSLLSLS

এটি একটি বৈধ টাইলিংয়ের মতো দেখায়, কারণ এতে দুটি * এস * এস বা তিনটি * এল * এস থাকে না তবে আসুন এটি রচনাটি সম্পাদন করুন:

LSLSLSLL

এটি এখনও দুর্দান্ত দেখায়, তবে আমরা যদি এটি আবার রচনা করি তবে আমরা পাই

LLLS

যা বৈধ ফিবোনাচি টাইলিং নয়। অতএব, পূর্ববর্তী দুটি ক্রমগুলি বৈধ tilings ছিল না।

অন্যদিকে, যদি আমরা শুরু করি

LSLLSLSLLSLSLL

এবং বার বার এটি সংক্ষিপ্ত ক্রম রচনা

LSLLSLLS
LSLSL
LL
S

সমস্ত ফলাফল বৈধ ফিবোনাচি সারণি, কারণ আমরা কখনই এই স্ট্রিংগুলির মধ্যে কোথাও এসএস বা এলএলএল পাই না ।

আরও পড়ার জন্য, একটি থিসিস রয়েছে যা এই টাইলিংটিকে পেনরোজ টিলিংসের সাধারণ 1D উপমা হিসাবে ব্যবহার করে।

চ্যালেঞ্জ

একটি প্রোগ্রাম বা ফাংশন লিখুন, যা একটি অ-নেতিবাচক পূর্ণসংখ্যা এন দেওয়া হয় , সমস্ত অক্ষর ফিবোনাচি টাইলিংগুলিকে 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?

হ্যাঁ, ভাল ধরা আমি ঠিক করেছিলাম। এফওয়াইআই, এটি ঘটেছিল কারণ আমি একইভাবে পচে যাওয়া নিয়মগুলি ব্যবহার করে নীচে থেকে শুরু করে স্ট্রিংটি অন্যভাবে তৈরি করেছি, এবং যখন খণ্ডের সীমানায় আসে তখন সেগুলি একেবারে বিপরীত হয় না ।
মার্টিন এন্ডার

উত্তর:


4

সিজেম, 70 62 59 বাইট

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

এসটিডিআইএন থেকে পড়া। এটি অনলাইনে চেষ্টা করুন।

উদাহরণ রান

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

কিভাবে এটা কাজ করে

ধারণাটি হ'ল এল এর এবং এস এর সমস্ত স্ট্রিং যথাযথ দৈর্ঘ্যের দিকে ঠেলে দেওয়া, ফলশ্রুতিটি খালি স্ট্রিং না হওয়া পর্যন্ত প্রতিটিটিতে ধারাবাহিকভাবে রূপান্তরটি প্রয়োগ করা, স্ট্রিংগুলির ক্রমগুলি একত্রিত করা এবং নিষিদ্ধ সাবস্ট্রিংগুলি অনুসন্ধান করা।

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

গল্ফস্ক্রিপ্ট (86 বাইট)

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

এটি একটি মুদ্রাস্ফীতিজনিত পন্থা: এটা দিয়ে শুরু হয় Lএবং Sএবং নিয়ম ব্যবহার করে সেগুলি বিস্তৃতি LL -> SLS, L -> S, S -> LL, এবং নেতৃস্থানীয় বা trailing Sএকটি থাকতে পারে Lশব্দ সীমানা এ যোগ করা হয়েছে।

অনলাইন ডেমো


@ মার্টিনবাটনার, আমি সাধারণত গল্ফস্ক্রিপ্ট.এপএইচবি.কম. এর সাথে একটি অনলাইন ডেমোর সাথে লিঙ্ক করব, তবে এটি নেস্টেড লুপগুলির চারপাশে একটি বাগ সহ একটি পুরানো সংস্করণ চলছে ( ডিসেম্বর 3, 2012 রিলিজের মধ্যে স্থির করা হয়েছে ) এবং এই প্রোগ্রামটি সঠিকভাবে সম্পাদন করতে পারে না।
পিটার টেলর

3
@ মার্টিনব্যাটনার ওফস আমাকে ত্রুটি সম্পর্কে জানাতে ধন্যবাদ বলছি। আমি নতুন জিএস সংস্করণ দিয়ে ওয়েবসাইট আপডেট করেছি। ডেমোর জন্য এই লিঙ্কটি ক্লিক করুন ।
ক্রিশ্চিয়ান লুপাস্কু

@ ডাব্লু0এলএফ, আপডেটের জন্য ধন্যবাদ (এবং সাম্প্রতিক পরিবর্তনের জন্যও সময় সীমা বাড়ানো)।
পিটার টেলর

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

Explaination:

আমি 4 টি ফাংশন সংজ্ঞায়িত করেছি:

  • f একটি পূর্ণসংখ্যার লাগে এবং ফলাফল প্রদান করে

    replicateM n [L,S][L,S]দৈর্ঘ্যের সাথে সমস্ত সম্ভাব্য ক্রম তৈরি n filter s ...করে ফাংশন সহ এই তালিকাটি (তালিকার তালিকা) ফিল্টার করবেs

  • r এএ প্রদত্ত তালিকাটি 1 স্তর দ্বারা হ্রাস করে।

    এটি কেবল প্যাটার্ন মেলানো দ্বারা করা হয়। 2 দিয়ে শুরু হওয়া Lএকটি তালিকা শুরু হওয়া Sএবং হ্রাসমান বাকী একটি তালিকায় পরিণত হবে

  • v প্রদত্ত বিধি দ্বারা প্রদত্ত তালিকাকে বৈধতা দেয় (কোনও 3 ধারাবাহিক এল, কোনও 2 ক্রমাগত এস নয়)

    যদি তালিকাটি ২ টি অবৈধ অনুক্রমের (এল, এল, এল বা এস, এস) এর মধ্যে একটির সাথে শুরু হয় তবে ফলাফলটি হয় False, একটি খালি তালিকা বৈধ হয় এবং খালি খালি তালিকাটি প্রথম উপাদানটি সরিয়ে পুনরায় পরীক্ষা করা হয়

  • s একটি তালিকা এবং সমস্ত হ্রাস তালিকা বৈধ কিনা তা পরীক্ষা করে।

    আবার: একটি খালি তালিকা বৈধ (এবং আরও কমানো যায় না)।
    যুক্তি হিসাবে প্রদত্ত তালিকাটি যদি বৈধ হয় তবে তালিকাটি sআবার বিজ্ঞাপনের সাথে চেক করা হ্রাস করা হবে।
    অন্যথায় ফলাফল হয়False

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.