এবিএএ / এবিবিবি: এই পুনরাবৃত্ত 2D প্যাটার্ন উত্পন্ন করুন


30

আমি যখন নিম্নলিখিত আকর্ষণীয় পুনরাবৃত্তি প্যাটার্নটি পেয়েছিলাম তখন আমি অসীম প্রতিরোধক নেটওয়ার্কগুলি (দীর্ঘ গল্প) নিয়ে ঘোরাঘুরি করছিলাম:

|-||
|---

এই প্যাটার্নটির প্রতিটি উদাহরণ লম্বা হিসাবে দ্বিগুণ প্রশস্ত। প্যাটার্নের এক স্তর থেকে অন্য স্তরে যেতে, আপনি এই আয়তক্ষেত্রটি দুটি উপ-ব্লকে (যার প্রত্যেকটিই একটি এনএক্সএন বর্গ) বিভক্ত করুন:

AB =
|-||
|---

so A = 
|-
|-

and B = 
||
--

এই অর্ধগুলি নীচের প্যাটার্ন অনুসারে সদৃশ এবং পুনরায় সাজানো হয়:

ABAA
ABBB

giving

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

চ্যালেঞ্জ

একটি প্রোগ্রাম / ফাংশন যা একটি নম্বর দেওয়া লিখুন N, আউটপুট Nএই রিকার্সিভ নকশা তম পুনরাবৃত্তির। এটি গল্ফ।

আই / ও ফর্ম্যাটটি তুলনামূলকভাবে বিন্যাসযুক্ত: আপনি একটি একক স্ট্রিং, স্ট্রিংগুলির একটি তালিকা, অক্ষরের একটি 2D অ্যারে ইত্যাদি ফিরিয়ে দিতে পারেন Ar আপনি 0 বা 1 সূচকও ব্যবহার করতে পারেন।

উদাহরণ

নিদর্শনটির প্রথম কয়েকটি পুনরাবৃত্তি নিম্নরূপ:

N = 0
|-

N = 1
|-||
|---

N = 2
|-|||-|-
|---|-|-
|-||||||
|-------

N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------

N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------

আমি ভাবছি যদি এই কাঠামোটি গণনা করার জন্য কিছু সংক্ষিপ্ত বীজগণিত উপায় থাকে।


"বীজগণিত" বলতে কী বোঝ?
ব্যবহারকারী 202729

4
@ user202729 হয়তো আছে মত কিছু "সরল" গণিত সূত্র f(n,x,y)যা সরাসরি নিরূপণ করতে পারেন কিনা দেওয়া তুল্য একটি থাকা উচিত -বা |। এতে মডুলো অপারেশন বা বিটওয়াইজ অপারেশন জড়িত থাকতে পারে। আমি এখন পর্যন্ত যে কৌশলগুলি দেখেছি সেগুলির মধ্যে স্প্রে অনুযায়ী প্রদর্শিত অ্যারেগুলি কাটা / যোগদানের সাথে জড়িত।
PhiNotPi

3
f(x,y)এছাড়াও কাজ করে, যেহেতু x,yবৈধ হয় তবে ফলাফল নির্ভর করে নাn
আমারা

2
আউটপুটটি কি 1-ইনডেক্স করা যায়, অর্থাত 1 ইনপুট দেওয়া যায় |-?
জাগারব

2
এই ক্ষতি কি? 🤔
qwr

উত্তর:


13

এপিএল (ডায়ালগ ক্লাসিক) , 29 25 বাইট

'|-'[{a,⊖⌽⍉~a←⍪⍨⍵}⍣⎕⍉⍪⍳2]

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

⍳2 ভেক্টর হয় 0 1

এটিকে 2x1 ম্যাট্রিক্সে পরিণত করে

এটি স্থানান্তর করে, তাই এটি 1x2 হয়ে যায়

মূল্যায়ন ইনপুট

{ }⍣⎕ বহুবার একটি ফাংশন প্রয়োগ করুন

⍪⍨⍵ নিজের উপর যুক্তি যুক্ত করুন - একটি 2x2 ম্যাট্রিক্স

a← হিসাবে মনে রাখবেন a

~ অস্বীকার করা

TRANSPOSE

অনুভূমিকভাবে বিপরীত

উল্লম্বভাবে বিপরীত

a,সঙ্গে CONCATENATE aবাম

'|-'[ ]স্ট্রিংয়ে সূচক হিসাবে ম্যাট্রিক্স ব্যবহার করুন '|-', অর্থাত 0 |এবং 1 এ রূপান্তর করুন-


10

জাভাস্ক্রিপ্ট (নোড.জেএস) , 130 ... 106 94 92 বাইট

আমার বিকল্প পদ্ধতি থেকে গল্ফ করা এবং অক্ষরগুলি ঠিক করা, -১৪ বাইট ধন্যবাদ @ শেগি

f=n=>n?f(n-1).replace(/.+/g,x=>(g=i=>x.replace(/./g,p=>p<i?s[i]+s[i]:s))`0`+`
`+g`1`):s="|-"

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

আমার আসল পদ্ধতি ( 106 102 বাইট)

f=n=>n?[0,1].map(j=>f(n-1).split`
`.map(x=>x+x.substr((i=x.length/2)*j,i).repeat(2)).join`
`).join`
`:"|-"

-4 বাইট ধন্যবাদ @ শেগি

f=n=>n?[0,1].map(j=>f(n-1).split`
`.map(x=>x+(y=x.substr((i=x.length/2)*j,i))+y).join`
`).join`
`:"|-"

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

ব্যাখ্যা এবং অবহিত:

function f(n) {                     // Main Function
 if (n != 0) {                      //  If n != 0: (i.e. not the base case)
  return [0, 1].map(                //   Separate the pattern into 2 parts
  function(j) {                     //   For each part:
   return f(n - 1).split("\n")      //    Split the next depth into lines
    .map(function(x) {              //    For each line in the result:
    return x                        //     The common part: "AB"
     + x.substr(
      (i = x.length / 2) * j        //     Take A if j == 0, B if j == 1
      , i                           //     Take half the original length
     ).repeat(2);                   //     Double this part
   }).join("\n");                   //    Join all lines together
  }).join("\n");                    //   Join the two parts together
 }
 else return "|-";                  //  If not (base case): return "|-";
}

আমার আসল বিকল্প পদ্ধতিটি যদি "|"->"2", "-"->"1"অনুমোদিত হয় তবে 105 104 বাইট:

f=n=>n?f(n-1).replace(/[12]+/g,x=>(g=(y,i)=>y.replace(/1|2/g,p=>[,i?11:22,21][p]))(x,0)+`
`+g(x,1)):"21"

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

এই সমস্যার দিকে সবেমাত্র কিছু বীজগণিত পদ্ধতি বের করা হয়েছে।

x=>y=>"|-||--"[(f=(x,y,t=0,m=2**30,i=!(y&m)*2+!(x&m)<<1)=>m?f(x^m,y^m,([18,0,90][t]&3<<i)>>i,m>>1):t)(x>>1,y)*2+x%2]

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

(অবশেষে এমন একটি ফাংশন যা আমার মূল উত্তরের সাথে তুলনীয়)

f(n, x, y)nনিম্নলিখিত প্রতিস্থাপনের পুনরাবৃত্তিতে (x, y) ব্লকের ব্লক প্রকার গণনা করে :

0 => 0 1      1 => 0 0      2 => 1 1
     0 2           0 0           2 2

যেখানে 0 = "|-", 1 = "||", 2 = "--", থেকে শুরু f(0, 0, 0) = 0

তারপরে, g(x)(y)মূল প্যাটার্নের (x, y) চিহ্নটি গণনা করে।


আপনার প্রথম সমাধানের জন্য 102 বাইট
শেগি

আপনার দ্বিতীয় জন্য 88 বাইট
শেগি




9

স্ট্যাক্স , 24 17 15 বাইট

╛ä├¼àz[{╧↑;ε╖>╠

এটি চালান এবং এটি ডিবাগ করুন

এখানে একই প্রোগ্রামটির আসকি উপস্থাপনা।

'|'-{b\2*aa+c\}N\m

প্রাথমিক ধারণাটি 0-প্রজন্মের গ্রিড দিয়ে শুরু হয় এবং তারপরে গ্রিডকে প্রসারিত করে এমন একটি ব্লক পুনরাবৃত্তি করে।

'|'-                    Push "|" and "-"
     {         }N       Get input and repeat block that many times.
      b                 Copy two top stack values
       \2*              Zip two parts, and double the height
          aa            Roll the top of the stack down to 3rd position.
            +           Concatenate two grids vertically
             c\         Copy result and zip horizontally
                  \     Zip the two parts horizontally
                   m    Output each row

8

ক্যানভাস , 17 16 বাইট

|∙-╶[∔αω+:∔;:+}+

এখানে চেষ্টা করুন!

ব্যাখ্যা, 1 এর ইনপুট জন্য স্ট্যাক দেখাচ্ছে:

|∙-               push "|" and "-" - the initial halves  "|", "-"
   ╶[         }   repeat input times                     
     ∔              add the two parts vertically         "|¶-"
      αω            get the original arguments to that   "|¶-", "|", "-"
        +           and add those horizontally           "|¶-", "|-"
         :∔         and add to itself vertically         "|¶-", "|-¶|-"
           ;        get the vertically added parts       "|-¶|-", "|¶-"
            :+      and add to itself horizontally       "|-¶|-", "||¶--"
               +  finally, add the halves together       "|-||¶|---"

একটি বাগ ফিক্স করে 16 বাইটে আপডেট হয়েছে যেখানে α/ ωকাজের জন্য নির্ধারিত মানগুলি যথাযথভাবে অনুলিপি করা হয়নি (ক্যানভাসটি সম্পূর্ণরূপে অপরিবর্তনীয় বলে মনে করা হচ্ছে, তবে হায়, এটি ছিল না)।


6

পাইথন 2 , 88 77 বাইট

লিনের কাছে -11 বাইট

f=lambda x:x<1and['|-']or[n+2*n[i:i+2**x/2]for i in(0,2**x/2)for n in f(x-1)]

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


আপনি সেই তালিকাটি বোঝার জন্য 77 এর জন্য একসাথে রোল করতে পারেন:f=lambda x:x<1and['|-']or[n+2*n[i:i+2**x/2]for i in(0,2**x/2)for n in f(x-1)]
লিন


4

হুশ , 17 বাইট

!¡§z+DȯṁmDTm½;"|-

1-ইন্ডেক্স। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

!¡§z+DȯṁmDTm½;"|-  Implicit input: a number n.
              "|-  The string "|-".
             ;     Wrap in a list: ["|-"]
 ¡                 Iterate this function on it:
                    Argument is a list of lines, e.g. L = ["|-||","|---"]
           m½       Break each line into two: [["|-","||"],["|-","--"]]
          T         Transpose: [["|-","|-"],["||","--"]]
      ȯṁ            Map and concatenate:
        mD           Map self-concatenation.
                    Result: ["|-|-","|-|-","||||","----"]
   z+               Zip using concatenation
  §  D              with L concatenated to itself: ["|-|||-|-","|---|-|-","|-||||||","|-------"]
                   Result is the infinite list [["|-"],["|-||","|---"],["|-|||-|-","|---|-|-","|-||||||","|-------"],...
!                  Take n'th element, implicitly display separated by newlines.

3

জেলি , 21 19 বাইট

;"/;`,Ẏ;`€$
⁾|-Ç¡ZY

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


ব্যাখ্যা:

প্রাথমিকভাবে, মানটি ⁾|-হ'ল ["|","-"]

Çপ্রদত্ত শেষ লিঙ্কটি ( ) [A, B]ফিরে আসবে

   AB     AA
[  AB  ,  BB  ]

¡বারবার সময়ের গত লিঙ্ক (ইনপুট) নম্বর, এবং প্রযোজ্য ZYএটা ফরম্যাটের।

শেষ লিঙ্কের জন্য ব্যাখ্যা:

-----------------
;"/;`,Ẏ;`€$  Monadic link. Value = [A, B]
;"/          Accumulate vectorized concatenate. Calculates (A ;" B).
             Represented as a matrix, it's |AB| (concatenated horizontally)
   ;`        Concatenate with self.      |AB|
                                Value =  |AB|  (concatenate vertically)
     ,    $  Pair with ...
      Ẏ        Tighten.  |A|    (concatenate vertically)
                 Value = |B|
       ;`€     Concatenate each with self.    |AA|
                                      Value = |BB|  (duplicate horizontally)


2

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

(%)=zipWith(++)
f 0=["|-"]
f n|(a,b)<-unzip$splitAt(2^(n-1))<$>f(n-1)=a%b%a%a++a%b%b%b

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

বেশ সহজ. আউটপুট স্ট্রিংগুলির একটি তালিকা। আমরা পূর্ববর্তী সংস্করণটি গ্রহণ করি এবং প্রতিটি লাইনকে অর্ধেক ভাগে ভাগ করে ব্যবহার করে সেগুলি দুটি নতুন তালিকায় সংগ্রহ করি unzip। তারপরে এটি অ্যারেগুলি সঠিক উপায়ে একত্রিত করার বিষয়


1

জে , 49 বাইট

f=.3 :'''|-''{~((,.[:|.[:|."1[:|:-.)@,~)^:y,:0 1'

এনজিএন এর এপিএল সমাধানের একটি আনাড়ি অনুবাদ। এটিকে প্রশমিত করতে আমার সমস্যা হয়েছিল - আমি কোনও পরামর্শকে প্রশংসা করব।

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


1

কাঠকয়লা , 47 46 বাইট

M²↖|-¶¶FENX²ι«F²C±ι⁰C⁰ιC⊗ι±ιC׳ι±ι≦⊗ιM±ι±ιT⊗ιι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

M²↖|-¶¶

নিম্নলিখিত লুপের জন্য একটি নিয়মিত কার্সার অবস্থান পেতে, আমাকে পদে 0-পদক্ষেপ (-2, -2) মুদ্রণ করতে হবে এবং কার্সারটি (-2, 0) এ রেখে দিতে হবে। (এটি কাঠকয়ালের একটি বাগের কারণে হতে পারে))

FENX²ι«

প্রথম Nক্ষমতার উপর লুপ 2।

F²C±ι⁰C⁰ιC⊗ι±ιC׳ι±ι

বিভিন্ন অফসেটের সাহায্যে পূর্ববর্তী আউটপুটটির অনুলিপিগুলি তৈরি করুন যার ফলস্বরূপ একটি ক্যানভাসের মধ্যে এটির মধ্যে একটি আয়তক্ষেত্রের মধ্যে পছন্দসই পরবর্তী পদক্ষেপ থাকে।

≦⊗ιM±ι±ιT⊗ιι

সেই আয়তক্ষেত্রের অবস্থানে যান এবং ক্যানভাসটি ছাঁটাবেন।

বিকল্প সমাধান, এছাড়াও 46 বাইট:

M²→|-FENX²ι«F432C×Iκι׳ιF245C×Iκι⊗ι≦⊗ιJ⊗ιιT⊗ιι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

M²→|-

এবার পদক্ষেপ 0 টি অবস্থানে (2, 0) মুদ্রণ করতে হবে, তবে কমপক্ষে কার্সারের অবস্থানের কোনও ব্যাপার নেই।

FENX²ι«

প্রথম Nক্ষমতার উপর লুপ 2।

F432C×Iκι׳ιF245C×Iκι⊗ι

বিভিন্ন অফসেটের সাহায্যে পূর্ববর্তী আউটপুটটির অনুলিপিগুলি তৈরি করুন যার ফলস্বরূপ একটি ক্যানভাসের মধ্যে এটির মধ্যে একটি আয়তক্ষেত্রের মধ্যে পছন্দসই পরবর্তী পদক্ষেপ থাকে।

≦⊗ιJ⊗ιιT⊗ιι

সেই আয়তক্ষেত্রের অবস্থানে যান এবং ক্যানভাসটি ছাঁটাবেন।


1

আর , 126 বাইট

function(n,k=cbind){o=matrix(c("|","-"),1,2)
if(n>0)for(i in 1:n)o=rbind(k(a<-o[,x<-1:(2^(i-1))],b<-o[,-x],a,a),k(a,b,b,b))
o}

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

ফিরে আসে a matrix। টিআইও লিঙ্কে একটি বিট কোড রয়েছে যাচাইকরণের স্বাচ্ছন্দ্যের জন্য এটি সুন্দরভাবে মুদ্রণ করতে।




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