ABAA / ABBB: สร้างรูปแบบ 2D แบบเรียกซ้ำ


30

ฉันยุ่งกับเครือข่ายตัวต้านทานที่ไม่มีที่สิ้นสุด (เรื่องยาว) เมื่อฉันเจอรูปแบบการเรียกซ้ำที่น่าสนใจต่อไปนี้:

|-||
|---

ตัวอย่างของรูปแบบนี้มีความกว้างเป็นสองเท่าของความสูง หากต้องการเปลี่ยนจากรูปแบบหนึ่งไปยังอีกระดับคุณจะแบ่งสี่เหลี่ยมนี้ออกเป็นบล็อกย่อยสองบล็อก (ซึ่งแต่ละรูปนั้นเป็นสี่เหลี่ยมจัตุรัส NxN):

AB =
|-||
|---

so A = 
|-
|-

and B = 
||
--

แบ่งครึ่งเหล่านี้แล้วทำซ้ำและจัดเรียงใหม่ตามรูปแบบต่อไปนี้:

ABAA
ABBB

giving

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

ท้าทาย

เขียนโปรแกรม / ฟังก์ชั่นซึ่งให้ตัวเลขNผลลัพธ์ที่Nซ้ำของการออกแบบซ้ำนี้ นี่คือกอล์ฟ

รูปแบบ I / O นั้นค่อนข้างผ่อนปรน: คุณอาจส่งคืนสตริงเดี่ยวรายการของสตริงอาเรย์สองมิติของตัวละคร ฯลฯ อนุญาตให้ใช้ช่องว่างที่ต่อท้ายได้ตามอำเภอใจ คุณอาจใช้การจัดทำดัชนี 0 หรือ 1 ก็ได้

ตัวอย่าง

ซ้ำหลายครั้งแรกของรูปแบบดังต่อไปนี้:

N = 0
|-

N = 1
|-||
|---

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

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

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

ฉันสงสัยว่ามีวิธีพีชคณิตสั้น ๆ ในการคำนวณโครงสร้างนี้หรือไม่


"พีชคณิต" คุณหมายถึงอะไร
user202729

4
@ user202729 เช่นอาจจะมีบางอย่างที่ "ง่าย" สูตรคณิตศาสตร์f(n,x,y)ที่โดยตรงสามารถคำนวณว่าได้รับการประสานงานควรมีหรือ- |มันอาจเกี่ยวข้องกับการดำเนินการโมดูโลหรือการดำเนินงานระดับบิต เทคนิคที่ฉันเคยเห็นทั้งหมดเกี่ยวข้องกับการตัด / การเข้าร่วมอาร์เรย์ดังแสดงในสเปค
PhiNotPi

3
f(x,y)ยังใช้งานได้เนื่องจากหากx,yถูกต้องผลลัพธ์จะไม่ขึ้นอยู่กับn
amara

2
สามารถส่งออกเป็นดัชนี 1 เช่นอินพุต 1 ให้|-?
Zgarb

2
การสูญเสียนี้หรือไม่? 🤔
qwr

คำตอบ:


13

APL (Dyalog Classic) , 29 25 ไบต์

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

ลองออนไลน์!

⍳2 เป็นเวกเตอร์ 0 1

เปลี่ยนเป็นเมทริกซ์ 2x1

เปลี่ยนมันดังนั้นจึงกลายเป็น 1x2

การประเมินการป้อนข้อมูล

{ }⍣⎕ ใช้ฟังก์ชั่นที่หลายต่อหลายครั้ง

⍪⍨⍵ เชื่อมอาร์กิวเมนต์ที่อยู่ด้านบนของตัวเอง - เมทริกซ์ 2x2

a← จำได้ว่าเป็น a

~ ลบล้าง

transpose

ย้อนกลับในแนวนอน

ย้อนกลับในแนวตั้ง

a,ต่อกับaด้านซ้าย

'|-'[ ]ใช้เมทริกซ์เป็นดัชนีในสตริง'|-'เช่นเปลี่ยนเป็น 0 |และ 1 เป็น-


10

JavaScript (Node.js) , 130 ... 106 94 92 ไบต์

ใช้วิธีการสำรองของฉันและแก้ไขอักขระ -14 ไบต์ขอบคุณ @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="|-"

ลองออนไลน์!

วิธีดั้งเดิมของฉัน ( 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 ไบต์ขอบคุณ @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`
`:"|-"

ลองออนไลน์!

คำอธิบาย & 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 "|-";
}

วิธีทางเลือกดั้งเดิมของฉันถ้า"|"->"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)คำนวณชนิดบล็อกที่บล็อก (x, y) ที่nการวนซ้ำของการทดแทนต่อไปนี้:

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 ไบต์สำหรับการแก้ปัญหาครั้งแรกของคุณ
Shaggy

88 ไบต์สำหรับวินาทีของคุณ
Shaggy

1
ให้โซลูชันที่สองของคุณทำงานกับอักขระที่ถูกต้องขนาด 95 ไบต์
Shaggy



9

Stax , 24 17 15 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

นี่คือการแสดง ascii ของโปรแกรมเดียวกัน

'|'-{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 ไบต์โดยแก้ไขข้อผิดพลาดที่ค่าที่ตั้งค่าสำหรับα/ ωทำงานไม่ถูกคัดลอกอย่างถูกต้อง (Canvas ควรจะไม่เปลี่ยนรูปแบบได้อย่างสมบูรณ์ แต่อนิจจาไม่ใช่)




4

Husk , 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

Haskell , 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

ถ่าน , 47 46 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

M²↖|-¶¶

เพื่อให้ได้ตำแหน่งเคอร์เซอร์ที่สอดคล้องกันสำหรับลูปต่อไปนี้ฉันต้องพิมพ์ขั้นตอนที่ 0 ที่ตำแหน่ง (-2, -2) และปล่อยเคอร์เซอร์ที่ (-2, 0) (อาจเกิดจากข้อผิดพลาดใน Charcoal)

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

R , 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}

ลองออนไลน์!

matrixผลตอบแทน มีรหัสเล็กน้อยในลิงค์ TIO เพื่อให้พิมพ์ได้อย่างสะดวกเพื่อการตรวจสอบความถูกต้อง




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.