ABAA / ABBB: Tạo mẫu 2D đệ quy này


30

Tôi đã loay hoay với các mạng điện trở vô hạn (câu chuyện dài) khi tôi bắt gặp mô hình đệ quy thú vị sau:

|-||
|---

Mỗi trường hợp của mẫu này rộng gấp đôi chiều cao của nó. Để đi từ một cấp của mẫu sang cấp tiếp theo, bạn chia hình chữ nhật này thành hai khối phụ (mỗi khối là một hình vuông NxN):

AB =
|-||
|---

so A = 
|-
|-

and B = 
||
--

Các nửa này sau đó được nhân đôi và sắp xếp lại theo mẫu sau:

ABAA
ABBB

giving

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

Thử thách

Viết chương trình / hàm, cho một số N, đưa ra Nlần lặp thứ của thiết kế đệ quy này. Đây là golf.

Định dạng I / O tương đối nhẹ nhàng: bạn có thể trả về một chuỗi đơn, danh sách các chuỗi, một mảng ký tự 2D, v.v ... khoảng trắng theo dõi tùy ý được cho phép. Bạn cũng có thể sử dụng lập chỉ mục 0 hoặc 1.

Ví dụ

Một số lần lặp đầu tiên của mẫu như sau:

N = 0
|-

N = 1
|-||
|---

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

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

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

Tôi tự hỏi nếu có một số cách đại số ngắn để tính toán cấu trúc này.


Bạn có ý nghĩa gì bởi "đại số"?
dùng202729

4
@ user202729 Giống như có thể có một số công thức toán học "đơn giản" f(n,x,y)có thể tính toán trực tiếp xem một tọa độ đã cho có nên chứa -hay không |. Nó có thể liên quan đến các hoạt động modulo hoặc hoạt động bitwise. Các kỹ thuật tôi đã thấy cho đến nay đều liên quan đến việc cắt / nối các mảng như thể hiện trong thông số kỹ thuật.
PhiNotPi

3
f(x,y)cũng hoạt động, vì nếu x,yhợp lệ thì kết quả không phụ thuộc vàon
amara

2
Đầu ra có thể được lập chỉ mục 1, tức là đầu vào 1 cho |-không?
Zgarb

2
Đây có phải là mất mát? 🤔
qwr

Câu trả lời:


13

APL (Dyalog Classic) , 29 25 byte

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

Hãy thử trực tuyến!

⍳2 là vectơ 0 1

biến nó thành ma trận 2x1

hoán vị nó, vì vậy nó trở thành 1x2

đánh giá đầu vào

{ }⍣⎕ áp dụng một chức năng mà nhiều lần

⍪⍨⍵ nối đối số trên chính nó - một ma trận 2x2

a← nhớ như a

~ phủ định

hoán vị

đảo ngược theo chiều ngang

đảo ngược theo chiều dọc

a,nối với abên trái

'|-'[ ]sử dụng ma trận như các chỉ số trong chuỗi '|-', tức là biến 0 thành |và 1 thành-


10

JavaScript (Node.js) , 130 ... 106 94 92 byte

Chơi gôn từ phương pháp thay thế của tôi và sửa các ký tự, -14 byte Cảm ơn @Shaggy

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="|-"

Hãy thử trực tuyến!

Cách tiếp cận ban đầu của tôi ( 106 102 byte)

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 byte Cảm ơn @Shaggy

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`
`:"|-"

Hãy thử trực tuyến!

Giải thích & Ungolfed:

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 "|-";
}

Phương pháp thay thế ban đầu của tôi, nếu "|"->"2", "-"->"1"được phép, 105 104 byte:

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"

Hãy thử trực tuyến!

Chỉ cần tìm ra một số phương pháp đại số đối với vấn đề này.

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]

Hãy thử trực tuyến!

(cuối cùng là một hàm có độ dài tương đương với câu trả lời ban đầu của tôi)

f(n, x, y)tính toán loại khối tại khối (x, y) khi nlặp lại thay thế sau:

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

nơi 0 = "|-", 1 = "||", 2 = "--", bắt đầu từ f(0, 0, 0) = 0.

Sau đó, g(x)(y)tính toán ký hiệu tại (x, y) của mẫu ban đầu.


102 byte cho giải pháp đầu tiên của bạn.
Xù xì

88 byte cho lần thứ hai của bạn.
Xù xì

1
Có giải pháp thứ hai của bạn làm việc với các ký tự chính xác cho 95 byte
Shaggy



9

Stax , 24 17 15 byte

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

Chạy và gỡ lỗi nó

Đây là đại diện ascii của cùng một chương trình.

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

Ý tưởng cơ bản được bắt đầu với lưới thế hệ 0, và sau đó lặp lại một khối mở rộng lưới.

'|'-                    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

Canvas , 17 16 byte

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

Hãy thử nó ở đây!

Giải thích, hiển thị ngăn xếp cho đầu vào của 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       "|-||¶|---"

Đã cập nhật lên 16 byte bằng cách sửa một lỗi trong đó các giá trị được đặt cho α/ ωhoạt động không được sao chép đúng cách (Canvas được cho là hoàn toàn không thay đổi, nhưng, than ôi, không phải vậy).


6

Python 2 , 88 77 byte

-11 byte thông qua Lynn

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)]

Hãy thử trực tuyến!


Bạn có thể cuộn các danh sách đó lại với nhau trong 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)]
Lynn


4

Husk , 17 byte

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

1 chỉ mục. Hãy thử trực tuyến!

Giải trình

!¡§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

Thạch , 21 19 byte

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

Hãy thử trực tuyến!


Giải trình:

Ban đầu, giá trị là ⁾|-, đó là ["|","-"].

Liên kết cuối cùng ( Ç), đã cho [A, B], sẽ trả về

   AB     AA
[  AB  ,  BB  ]

. Việc ¡liên tục áp dụng số lần liên kết (đầu vào) cuối cùng và ZYđịnh dạng nó.

Giải thích cho liên kết cuối cùng:

-----------------
;"/;`,Ẏ;`€$  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

Haskell , 86 byte

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

Hãy thử trực tuyến!

Khá đơn giản. Đầu ra là một danh sách các chuỗi. Chúng tôi lấy phiên bản trước và chia mỗi dòng thành một nửa sau đó thu thập chúng thành hai danh sách mới bằng cách sử dụng unzip. Sau đó, nó chỉ đơn giản là vấn đề kết hợp các mảng với nhau đúng cách


1

J , 49 byte

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

Một bản dịch vụng về của giải pháp APL của ngn. Tôi gặp vấn đề khiến nó trở nên ngầm - Tôi sẽ thực hiện bất kỳ lời khuyên nào.

Hãy thử trực tuyến!


1

Than , 47 46 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

M²↖|-¶¶

Để có được vị trí con trỏ nhất quán cho vòng lặp sau, tôi phải in bước 0 tại vị trí (-2, -2) và để con trỏ ở (-2, 0). (Điều này có thể là do lỗi trong Than.)

FENX²ι«

Lặp lại các Nquyền hạn đầu tiên của 2.

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

Tạo các bản sao của đầu ra trước đó với nhiều độ lệch khác nhau dẫn đến một khung vẽ có chứa bước tiếp theo mong muốn trong một hình chữ nhật bên trong nó.

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

Di chuyển đến vị trí của hình chữ nhật đó và cắt vải.

Giải pháp thay thế, cũng 46 byte:

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

M²→|-

Lần này bước 0 phải được in ở vị trí (2, 0), nhưng ít nhất vị trí con trỏ không thành vấn đề.

FENX²ι«

Lặp lại các Nquyền hạn đầu tiên của 2.

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

Tạo các bản sao của đầu ra trước đó với nhiều độ lệch khác nhau dẫn đến một khung vẽ có chứa bước tiếp theo mong muốn trong một hình chữ nhật bên trong nó.

≦⊗ιJ⊗ιιT⊗ιι

Di chuyển đến vị trí của hình chữ nhật đó và cắt vải.


1

R , 126 byte

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}

Hãy thử trực tuyến!

Trả về a matrix. Có một chút mã trong liên kết TIO để khiến nó được in độc đáo để dễ xác minh.




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.