ফিবোনাচি ডোমিনো টাইলিং


11

আছে সর্বোত্তম সংযুক্তিকরণ ফলাফলের যে টাইল করতে উপায়ে একটি 2*nদ্বারা ফালা 1*2dominoes এন ফিবানচি সংখ্যা। আপনার লক্ষ্যটি হ'ল একটি n8 টি টিলিংয়ের মতো ড্যাশ এবং উল্লম্ব রেখাগুলির সাথে আঁকানো সমস্ত টিলিংস মুদ্রণ করা n=5:

|————
|————

——|——
——|——

|||——
|||——

————|
————|

||——|
||——|

|——||
|——||

——|||
——|||

|||||
|||||

আপনাকে এমন একটি প্রোগ্রাম বা নামযুক্ত ফাংশন সরবরাহ করতে হবে nযা ইনপুট হিসাবে গ্রহণ করে এবং প্রয়োজনীয় আউটপুট প্রিন্ট করে। সবচেয়ে কম বাইট জেতা

ইনপুট

STDIN বা ফাংশন ইনপুট এর nমধ্যে 1এবং 10সমেত একটি সংখ্যা number

আউটপুট

2*nঅনুভূমিকভাবে আঁকা স্ট্রিপের প্রতিটি সম্ভাব্য ডোমিনো টিলিংস মুদ্রণ করুন । টিলিংগুলি কোনও ক্রমে হতে পারে তবে প্রতিটি একেবারে একবারে উপস্থিত হওয়া উচিত। এগুলি অবশ্যই একটি ফাঁকা রেখার দ্বারা পৃথক করা উচিত।

একটি উল্লম্ব ডোমিনো দুটি উল্লম্ব বার ( |) এবং একটি অনুভূমিক ডোমিনো দুটি এম ড্যাশ ( ) দিয়ে তৈরি হয় । আপনি -ASCII এ থাকার জন্য Em dashes এর জায়গায় হাইফেন ( ) ব্যবহার করতে পারেন ।

মুদ্রিত আউটপুটটি যতক্ষণ দেখা যায় ততক্ষণ আপনি হোয়াইটস্পেসের সাহায্যে কিছু করতে পারেন।


শেষ টাইলিংয়ের পরে কোনও অতিরিক্ত লাইনফিড কি হোয়াইট স্পেসের সাথে কিছু পড়ে ?
ডেনিস

@ ডেনিস হ্যাঁ, অতিরিক্ত ফাঁকা লাইনগুলি ভাল।
xnor

একই সমস্যা সমাধানের জন্য অনেকগুলি ভিন্ন উপায় দেখে আমি সত্যিই অবাক হয়েছি। আপনি কি এটি আশা করেছিলেন?
স্তরের নদী সেন্ট

@ স্টেভেরিল না, আমি সম্পূর্ণরূপে করিনি, এবং বিভিন্নতা দেখে আনন্দিত! এবং আপনার অপ্রত্যাশিততার জন্য কেক নেয়। আমার বেশিরভাগ ক্ষেত্রে একটি ফিবোনাচি-স্টাইল পুনরাবৃত্তি মনে ছিল, বেশিরভাগ সমাধান হিসাবে আমি ব্যবহার করি। আমি ফিল্টারিং কার্যকর হতে আশা করিনি, এবং ব্যাপ্তি আমি করেছিলাম, আমি তা স্ট্রিং ফিল্টারিং করা হবে যদিও করতে ——এবং |ডেনিস, তাই না length- মত দৈর্ঘ্য দ্বারা nস্ট্রিং এবং |ফিল্টার দ্বারা জোড়া প্রদর্শনে। এবং পরবর্তীকালের জন্য, আমি এটি s.split('——আপনার মতো পাটিগণিত পদ্ধতির দ্বারা নয় , উত্পাদিত স্ট্রিংয়ের রেগেক্সেস বা স্ট্রিং অপারেশনগুলির মাধ্যমে হয়ে থাকতে পারব ।
xnor

আমার মনে হয় "1x2 ডোমিনোস" নিরর্থক।
সুপারজেডি ২২৪

উত্তর:


5

সি, 106

গল্ফ সংস্করণ

f(n){
  for(int i,h=n*2<<n;h--;(i/3|i/3*2)-i||(putchar(i>>h%n&1?45:124),h%n||puts(h%(n*2)?"":"\n")))
    i=h/2/n;
}

মূল সংস্করণ

i,j,n;
main(){
  scanf("%d",&n);
  for(i=1<<n;i--;)if((i/3|i/3*2)==i){
    for(j=1<<n;j/=2;)printf("%c",i&j?'-':'|');puts("");
    for(j=1<<n;j/=2;)printf("%c",i&j?'-':'|');puts("\n");
  }
}

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

ভেরিয়েবলটি নীচে থেকে 0 iপর্যন্ত 1<<n-1চলে, nঅঙ্ক সহ সমস্ত সম্ভাব্য বাইনারি সংখ্যা তৈরি করে । 0 এর জন্য এনকোড |এবং এর জন্য 1 এনকোড -। আমরা সংখ্যার সাথে আগ্রহী যা জোড়ায় 1 টি রয়েছে। স্পষ্টত এই জাতীয় সংখ্যাগুলি 3 দ্বারা বিভাজ্য।

যখন একটি সংখ্যা 3 দ্বারা বিভক্ত করা হয়, তখন মূল সংখ্যাটি 2 দ্বারা গুণ করে এবং এটি নিজের সাথে যুক্ত করে পুনরুদ্ধার করা যায় (কার্যকরভাবে 3 দ্বারা বিভক্ত) সুদ, কোনও বাহন প্রয়োজন হয় না, সুতরাং এই ক্ষেত্রে শুধুমাত্র, বা যোগ করার পরিবর্তে ব্যবহার করা যেতে পারে। এটি আগ্রহের সংখ্যার জন্য পরীক্ষার জন্য ব্যবহৃত হয়, কারণ এগুলিই কেবলমাত্র যেখানে অভিব্যক্তিটির i/3|i/3*2মূল মানটি দেয় i। নীচে উদাহরণ দেখুন।

1111= 15 ---> 0101= 5 ---> 1111= 15 (বৈধ, 0101|1010== 0101+1010)

1001= 9 ---> 0011= 3 ---> 0111= 7 (অবৈধ 0011|0110,! = 0011+0110)

পরীক্ষার মানটি সর্বদা মূল মানের থেকে সমান বা কম। যে সংখ্যাগুলি 3 এর গুণক হয় না সেগুলিও 3 টি দিয়ে ভাগ করে যখন মূলটির চেয়ে কম সংখ্যা ফিরে আসে তখন 3 দ্বারা গুণিত হয়, পরীক্ষাগুলিও এই সংখ্যাগুলিতে পছন্দসই ফলস দেয়।

আসল সংস্করণে বেশ কয়েকটি লুপ ইন jবিটের মাধ্যমে স্ক্যান iকরতে এবং আউটপুট উত্পাদন করতে ব্যবহৃত হয় । গল্ফযুক্ত সংস্করণে একটি একক forলুপ ব্যবহৃত হয়, যার মধ্যে নিচে hথেকে (n*2)*(1<<n)-1নীচে 0 পর্যন্ত সমস্ত সংখ্যার মাধ্যমে সঞ্চালিত হয় এর মানগুলি iউত্পন্ন হয় h/2/njসমমানের পরিমাণটি প্রাপ্ত হওয়ায় চলকটি আর ব্যবহার করা হয় না h%nn*2উভয় রেখার ব্যবহার একই লুপ থেকে মুদ্রণ করতে সক্ষম করে, putsবিবৃতিতে কিছু নিফ্টি মাল্টিপ্লেক্সিং সহ সারির শেষে এক বা দুটি নিউলাইন প্রিন্ট করতে পারে।

নোট করুন যে এর মাংস for()বন্ধনীটির বর্ধিত অবস্থানে রয়েছে এবং তাই এর পরে কার্যকর করা হয় i=h/2/h

নমুনা আউটপুট n = 6:

$ ./a
6
------
------

----||
----||

--|--|
--|--|

--||--
--||--

--||||
--||||

|----|
|----|

|--|--
|--|--

|--|||
|--|||

||----
||----

||--||
||--||

|||--|
|||--|

||||--
||||--

||||||
||||||

i/3|i/3*2কৌতুক প্রতিভাশালী হয়! আমি ব্যাকরণের জন্য পাটিগণিতের এক্সপ্রেশন আশা করিনি।
xnor

3

সিজেম, 33 27 বাইট

LN{_'|f+@"——"f++}ri*\;{_N}/

6 বাইট বন্ধ করে গল্ফ করার জন্য @ জিমি 23013 কে ধন্যবাদ!

এটি অনলাইন চেষ্টা করুন!

পটভূমি

এটি একটি পুনরাবৃত্ত আলগোরিদমের পুনরাবৃত্তি বাস্তবায়ন:

সম্ভব tilings এন সম্ভব tilings করার জন্য একটি উল্লম্ব ডমিনো যোগ করে প্রাপ্ত করা যাবে 1 - এন এবং দুই অনুভূমিক dominos সম্ভব tilings করার N - 2

এইভাবে, n এর জন্য টিলিংয়ের সংখ্যা হ'ল n - 1 এবং n - 2 এর জন্য টিলিংয়ের সংখ্যার যোগফল , অর্থাৎ, n ফিবোনাকির সংখ্যা।

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

LN                                " A:= [''] B:= ['\n']                         ";
  {             }ri*              " Repeat int(input()) times:                  ";
   _'|f+                          "   C = copy(B); for T ∊ C: T += '|'          ";
              @                   "   Swap A and B.                             ";
               "——"f+             "   for T ∊ B: T += "——"                      ";
                     +            "   B = C + B                                 ";
                        \;        " Discard A.                                  ";
                          {_N}/   " for T ∊ B: print T, T + '\n'                ";

উদাহরণ রান

$ alias cjam='java -jar cjam-0.6.2.jar'

$ cjam domino.cjam <<< 3
|||
|||

——|
——|

|——
|——

$ for i in {1..10}; do echo $[$(cjam domino.cjam <<< $i | wc -l) / 3]; done1
2
3
5
8
13
21
34
55
89

LNli{_'|f\@"——"f\+2/}*\;{_N}/
jimmy23013

f\এখনও 0.6.2 এ কার্যকর করা হয়নি তবে আমি আমাদের পন্থাগুলি একত্রিত করতে সক্ষম হয়েছি। ধন্যবাদ!
ডেনিস

2

হাস্কেল, 89 বাইট

f(-1)=[]
f 0=[""]
f n=map('|':)(f$n-1)++map("--"++)(f$n-2)
g=unlines.(>>= \x->[x,x,""]).f

fএকটি ফাংশন যা একটি নম্বর দেওয়া সম্ভব দৈর্ঘ্য n এর সমস্ত সম্ভাব্য ফিবোনাচি টিলিংয়ের একটি লাইনের একটি তালিকা প্রদান করে। এটি এক লাইনে ফিরে আসে তাতে কিছু যায় আসে না, কারণ সমস্ত টিলিংয়ের উভয় লাইনই একই are

fপুনরাবৃত্তভাবে কল করে n-1এবং স্ট্রিংগুলিতে n-2যুক্ত করে "|"এবং "--"(যথাক্রমে) কাজ করে।

gপ্রশ্নগুলির উত্তর দেয় এমন ফাংশন। এটি মূলত ইনপুটটিতে কল fকরে, প্রতিটি স্ট্রিংকে দ্বিগুণ করে তোলে যাতে এটি দুটি লাইন প্রদর্শন করে এবং সমস্তগুলি নিউলাইন দ্বারা যুক্ত হয়।

উদাহরণ আউটপুট:

*Main> putStrLn $ g 5
|||||
|||||

|||--
|||--

||--|
||--|

|--||
|--||

|----
|----

--|||
--|||

--|--
--|--

----|
----|

2

সিজেম, 42 37 বাইট

3li:L#,{3b"——|"2/f=s}%{,L=},_&{N+_N}/

প্রশ্নগুলি এএসসিআইআই হাইফেনগুলির সাথে তাদের প্রতিস্থাপন করতে মঞ্জুরি দিয়ে আমি ড্যাশগুলি প্রতিটি বাইট হিসাবে গণনা করেছি।

এটি অনলাইনে চেষ্টা করুন।

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

2 ডিগ্রি এল এর সমস্ত সম্ভাব্য টিলিংসগুলি পেতে , আমরা সমস্ত অ-নেতিবাচক পূর্ণসংখ্যাগুলি I <3 এল এর উপর পুনরাবৃত্তি করি , বেস 3 তে এমনকি অঙ্কগুলি অনুভূমিক ডেমোমোজের সাথে এবং উলম্ব অঙ্কগুলির সাথে বিজোড় অঙ্কগুলির সাথে সামঞ্জস্য করি।

যেহেতু প্রতিটি বেসের 3 টিতে আমার কাছে এল বা তার চেয়ে কম অঙ্ক রয়েছে, এটি 2 × এল স্ট্রিপটি coveringেকে দেওয়ার সমস্ত সম্ভাব্য উপায় তৈরি করে । যা বাকি আছে তা হ'ল 2 × এল এর চেয়ে বড় বা ছোট কভারিংগুলি ফিল্টার করে বাকী প্রচ্ছদগুলি মুদ্রণ করা।

3li:L#,      " Read an integer L from STDIN and push A := [ 0 1 ... (3 ** N - 1) ].       ";
{            " For each integer I in A:                                                   ";
  3b         " Push B, the array of I's base 3 digits.                                    ";
  "——|"2/    " Push S := [ '——' '|' ].                                                    ";
  f=         " Replace each D in B with S[D % 2] (the modulus is implicit).               ";
  s          " Flatten B.                                                                 ";
}%           " Collect the result in an array R.                                          ";
{,L=},       " Filter R so it contains only strings of length L.                          ";
_&           " Intersect R with itself to remove duplicates.                              ";
{N+_N}/      " For each string T in B, push (T . '\n') twice, followed by '\n'.           ";

উদাহরণ রান

$ cjam domino.cjam <<< 3
|——
|——

——|
——|

|||
|||

$ for i in {1..10}; do echo $[$(cjam domino.cjam <<< $i | wc -l) / 3]; done
1
2
3
5
8
13
21
34
55
89

কুল। আমি কেবল ভাবছি আপনি কেন বেস 3 এর পরিবর্তে 2 বেসটি এডসি 65 এর মতো ব্যবহার করেন নি That যা আপনাকে সদৃশ হওয়ার হাত থেকে বাঁচাতে পারত। আমি ধরে নিয়েছি কারণ শীর্ষস্থানীয় শূন্যরা সম্ভবত পদক্ষেপে বিচ্ছিন্ন হয়ে গেছে 3b। এটা কি সঠিক?
স্তরের নদী সেন্ট

1
@ স্টেভেভারিল: হ্যাঁ, এটাই হ'ল কারণ। যেমনটি হয়, নেতৃস্থানীয় শূন্যগুলি কোনও ডোমিনোর সাথে মিল নেই। তবে সদৃশ না থাকা আমাকে তিনটি ব্লককে একটি একক দিয়ে প্রতিস্থাপন করতে দেয়। আমি এই সম্পর্কে আরও কিছু চিন্তা করতে হবে।
ডেনিস

@ স্টিভেভারিল: আমি বেস 2 কাজ করার ব্যবস্থা করতে পারি নি, তবে পুনরাবৃত্তির উপায়টি আরও ছোট হবে বলে মনে হয়।
ডেনিস

2

জাভাস্ক্রিপ্ট (E6) 102

বিট সিকোয়েন্স, 0 -> '-' এবং 1 -> '|' থেকে কনফিগারেশন তৈরি করুন।

F=n=>{
  for(i=0;(j=++i)<2<<n;s.length==1+n&&console.log('\n'+s+s))
    for(s='\n';j>1;j>>=1)s+=j&1?'|':'--';
}

টেস্ট ফায়ারফক্স / ফায়ারবাগ কনসোলটি

F(5)

আউটপুট

|----
|----

--|--
--|--

----|
----|

|||--
|||--

||--|
||--|

|--||
|--||

--|||
--|||

|||||
|||||

1

হাস্কেল: 109 বাইট

এটি ফিজোনাচি সংখ্যার ক্রমটি অলসভাবে গণনার জন্য সুপরিচিত হাস্কেল ওয়ান-লাইনারের একটি অনুবাদ:

b=map.map.(++)
w=zipWith
z=w(++)
s=["\n"]:["|\n"]:z(b"--"s)(b"|"$tail s)
f=sequence_.map putStrLn.(w z s s!!)

টাইলিং স্ট্রিংগুলির মূল ক্রম, অব্যক্ত:

dominos = [""] : ["|"] : zipWith (++) ("--" `before` dominos) ("|" `before` tail dominos)
    where before = map . map . (++)

এবং তুলনা করার জন্য ফিবোনাচি ওয়ান-লাইনার:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

ব্যবহারের উদাহরণ:

$ ghci fibtile
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( fibtile.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 5
----|
----|

--|--
--|--

--|||
--|||

|----
|----

|--||
|--||

||--|
||--|

|||--
|||--

|||||
|||||

*Main>

1

কোবরা - 176

আমি কোবরা গল্ফিং প্যাকেজ শেষ না হওয়া পর্যন্ত অপেক্ষা করতে পারি না।

def m(n)
    for t in.f(n),print t+t
def f(n,x='')as String*
    if x.length<n,for i in.f(n,x+'-').toList+.f(n,x+'|').toList,yield i
    else if not'-'in x.replace('--',''),yield x+'\n'

1

জে - 54 চর

nডানদিকে তর্ক হিসাবে ফাংশন ।

0{::(];'--'&,"1@[,'|',"1])&>/@[&0&((1 2$,:)&.>'';,'|')

এই গল্ফের মূল মূল হ'ল (];'--'&,"1@[,'|',"1])&>/। এটি দৈর্ঘ্যের (এন -২) এবং (এন -১) টিলিংয়ের একটি তালিকা নিয়েছে এবং দৈর্ঘ্যের টিলিংয়ের একটি তালিকা দেয় (এন -১) এবং এন। এটি স্ট্যান্ডার্ড ফিবোনাচি পুনরাবৃত্তি, line লা লিনিয়ার বীজগণিত। ];নতুন বাম হিসাবে ডান তালিকাটি ফিরিয়ে দেয় (কোনও পরিবর্তন নেই)। '--'&,"1@[জোড়ে-- বাম লিস্টে টাইলস, যখন '|',"1]যোগ |ডান লিস্টে টাইলস, এবং যারা একসঙ্গে নতুন ডানদিকের তালিকা আছে।

আমরা বারবার এটি পুনরুক্ত করি n(এটিই @[&0) এবং খালি টাইলিং এবং দৈর্ঘ্যের একক টাইলিং দিয়ে শুরু করি Then তারপরে আমরা জোড়াটির প্রথমটি ফিরে আসি 0{::। অর্থ, যদি আমরা এটি শূন্য বার চালাই তবে আমরা কেবল প্রথম অর্থ খালি টাইলিং ফিরিয়ে দেব। যদি আমরা এটি nবার চালনা করি তবে আমরা গণনা করিn এবং ( n+1) জুটি তবে পরেটিকে বাতিল করে দেই। এটি অতিরিক্ত কাজ কিন্তু কম অক্ষর।

দ্য (1 2$,:)কিছু জে অর্ডার তালিকায় tilings সহজে extendable করার জন্য যা করতে হয়েছে। আমরা বাম শুরু তালিকা অক্ষরের একটি 2-সারি ম্যাট্রিক্স একটি 1 আইটেম তালিকা হতে করতে, প্রতিটি সারির দৈর্ঘ্য 0. অধিকার শুরুর তালিকা থাকার একই, কিন্তু সারি দৈর্ঘ্য 1 হও, ভরা হয়েছে |। তারপরে, আমরা প্রতিটি সারিতে নতুন টাইল যুক্ত করি এবং ম্যাট্রিকের তালিকাগুলি যুক্ত করি যখন আমরা দুটি সেট টিলেিংস একসাথে যোগদান করি। এটি একটি ধারণার জে র‌্যাঙ্ককে কল করে এমন একটি সাধারণ প্রয়োগ: এটি প্রয়োজনীয়ভাবে যুক্তিগুলির মাত্রিকতা ম্যানিপুলেট করে এবং যখন প্রয়োজন হয় তখন স্পষ্টতই লুপ করে।

   0{::(];'--'&,"1@[,'|',"1])&>/@[&0&((1 2$,:)&.>'';,'|')5
----|
----|

--|--
--|--

--|||
--|||

|----
|----

|--||
|--||

||--|
||--|

|||--
|||--

|||||
|||||

নিজের জন্য এটি ব্যবহার করে দেখুন tryj.tk


1

পাইথন 3: 70 বাইট

f=lambda n,s="\n":n>0and f(n-1,"|"+s)==f(n-2,"--"+s)or n or print(s*2)

পুনরাবৃত্তভাবে ডেমোপিকেট sএবং মুদ্রিত ডেমোপোজগুলির একটি সারি উপস্থাপন করে সমস্ত সম্ভাব্য স্ট্রিংগুলি তৈরি করে । শুরু হচ্ছেsনতুন লাইনের চরিত্র হিসাবে করা ফাঁকা রেখাটি স্বয়ংক্রিয়ভাবে ঘটায়।

==জন্য দুটি কল মধ্যে fমাত্র উভয় ফাংশন কল সঞ্চালন হয়। এগুলি সাধারণত ফিরে আসে Noneকারণ এগুলি কেবল মুদ্রণ করে এবং ==এটি নির্ধারিত কয়েকটি অপারেটরের মধ্যে একটিNone

andS এবং orগুলি প্রজনন করার অধিকার শর্ট-সার্কিট আচরণ উত্পাদন করতে হয় ifs এবং elseungolfed কোডের গুলি।

Ungolfed:

def f(n,s="\n"):
 if n==-1:pass
 elif n==0: print(s*2)
 else: f(n-1,"|"+s);f(n-2,"--"+s)

1

রেটিনা , 44 বাইট

দ্রষ্টব্য: রেটিনা এই চ্যালেঞ্জের চেয়ে কম বয়সী।

+`([-|]*)11(1*#)
$1|1$2$1--$2
1
|
.*?#
$0$0#

ট্রেলিং করা নতুন লাইনের সাথে আনারি ইনপুট নেয়।

প্রতিটি লাইন তার নিজস্ব ফাইলে যেতে হবে এবং ফাইলের নতুন লাইনে #পরিবর্তন করা উচিত। এটি অযৌক্তিক তবে আপনি -sপতাকাটি সহ একটি ফাইলের মতো কোডটি চালাতে পারেন , #চিহ্নিতকারীদের রেখে (এবং ইনপুটটিতেও নিউলাইনটি পরিবর্তন #করছেন)। আপনি #যদি ইচ্ছা করেন তবে আপনি পঠনযোগ্যতার জন্য আউটপুটে নতুন লাইনে ফিরে যেতে পারেন। উদাহরণ:

> echo 1111# | retina -s fib_tile | tr # '\n'
||||
||||

||--
||--

|--|
|--|

--||
--||

----
----

পদ্ধতি:

  • ইনপুট থেকে শুরু করে আমরা প্রতিটি লাইনকে অন্য দুটি দিয়ে অদলবদল করি: প্রথম 1পরিবর্তনের |সাথে একটি এবং প্রথম দুটি 1এর দুটিতে পরিবর্তিত হয় --। কমপক্ষে দু'জনের লাইন না পাওয়া পর্যন্ত আমরা এটি করি 1
  • যখন কেবলমাত্র একা 1বাম বাকী থাকে তখন আমরা সেগুলিতে পরিবর্তন করেছিলাম| 's এ ।
  • আমরা প্রতিটি লাইন দ্বিগুণ করি এবং এতে একটি অতিরিক্ত নিউলাইন যুক্ত করি এবং আমরা পছন্দসই আউটপুট পাই।

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