ABAA / ABBB :이 재귀 적 2D 패턴 생성


30

다음과 같은 흥미로운 재귀 패턴을 발견했을 때 무한 저항 네트워크 (긴 이야기)로 혼란 스러웠습니다.

|-||
|---

이 패턴의 각 인스턴스는 키보다 두 배 넓습니다. 패턴의 한 레벨에서 다음 레벨로 이동하려면이 사각형을 두 개의 서브 블록 (각각 NxN 정사각형)으로 나눕니다.

AB =
|-||
|---

so A = 
|-
|-

and B = 
||
--

그런 다음이 절반은 다음 패턴에 따라 복제되고 재 배열됩니다.

ABAA
ABBB

giving

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

도전

숫자가 주어지면 이 재귀 적 디자인의 반복을 N출력 하는 프로그램 / 함수를 작성하십시오 N. 이것은 골프입니다.

I / O 형식은 비교적 관대합니다. 단일 문자열, 문자열 목록, 2D 문자 배열 등을 반환 할 수 있습니다. 임의의 후행 공백이 허용됩니다. 0 또는 1 인덱싱을 사용할 수도 있습니다.

패턴의 처음 몇 번의 반복은 다음과 같습니다.

N = 0
|-

N = 1
|-||
|---

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

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

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

이 구조를 계산하는 짧은 대수적 방법이 있는지 궁금합니다.


"대수"란 무엇을 의미합니까?
user202729 2019

4
@ user202729 어쩌면 일부 "간단한"수학 공식이처럼 f(n,x,y)직접 좌표 주어진 포함할지 여부를 계산할 수 있습니다 -또는 |. 모듈로 연산 또는 비트 연산이 포함될 수 있습니다. 지금까지 본 기술은 모두 사양에 표시된대로 절단 / 결합 배열과 관련됩니다.
PhiNotPi

3
f(x,y)x,y유효하면 결과는 다음에 의존하지 않기 때문에 작동합니다 .n
amara

2
출력을 1- 색인화 할 수 있습니까 |-?
Zgarb February

2
이 손실입니까? 🤔
qwr

답변:


13

APL (Dyalog Classic) , 29 25 바이트

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

온라인으로 사용해보십시오!

⍳2 벡터입니다 0 1

그것을 2x1 행렬로 바꿉니다.

전치하여 1x2가됩니다.

평가 된 입력

{ }⍣⎕ 여러 번 기능을 적용

⍪⍨⍵ 인수 자체를 2x2 행렬로 연결

a← 로 기억 a

~ 부정하다

바꾸어 놓다

수평으로 뒤집다

수직으로 뒤집다

a,a왼쪽에 연결

'|-'[ ]행렬을 문자열의 인덱스로 사용하십시오 '|-'. 즉, 0을 |1로-


10

JavaScript (Node.js) , 130 ... 106 94 92 바이트

대체 방법을 골라 문자를 수정, -14 바이트 Thanks @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="|-"

온라인으로 사용해보십시오!

내 원래 접근 방식 ( 106102 바이트)

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)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 바이트 입니다.
얽히고 설킨





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 바이트로 업데이트했습니다 (캔버스는 완전히 변경 불가능하지만 슬프게는 아닙니다).


6

파이썬 2 , 88 77 바이트

Lynn에게 감사합니다 -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)]
Lynn


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

, 47 46 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

M²↖|-¶¶

다음 루프에 대해 일관된 커서 위치를 얻으려면 위치 (-2, -2)에 0 단계를 인쇄하고 커서를 (-2, 0)에 두어야합니다. (이것은 숯의 버그 때문일 수 있습니다.)

FENX²ι«

N2 의 첫번째 거듭 제곱을 반복합니다 .

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

다양한 오프셋으로 이전 출력을 복사하여 원하는 다음 단계를 포함하는 캔버스를 사각형으로 만듭니다.

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

해당 사각형의 위치로 이동하여 캔버스를 자릅니다.

대체 솔루션, 46 바이트 :

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

M²→|-

이 시간 단계 0은 위치 (2, 0)에 인쇄되어야하지만 적어도 커서 위치는 중요하지 않습니다.

FENX²ι«

N2 의 첫번째 거듭 제곱을 반복합니다 .

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

다양한 오프셋으로 이전 출력을 복사하여 원하는 다음 단계를 포함하는 캔버스를 사각형으로 만듭니다.

≦⊗ιJ⊗ιιT⊗ιι

해당 사각형의 위치로 이동하여 캔버스를 자릅니다.




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.