Codegolf — Abaa/Abbb: Создайте Этот Рекурсивный 2D-Шаблон.

  • Автор темы Ing
  • Обновлено
  • 22, Oct 2024
  • #1

Я возился с бесконечными цепями резисторов (длинная история), когда наткнулся на следующий интересный рекурсивный шаблон:

 
 
 
 N = 0
|-

N = 1
|-||
|---

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

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

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

Ширина каждого экземпляра этого узора в два раза превышает высоту. Чтобы перейти с одного уровня паттерна на другой, вы разбиваете этот прямоугольник на два подблока (каждый из которых представляет собой квадрат NxN):

N

Эти половинки затем дублируются и переставляются по следующему шаблону:

N

Испытание

Напишите программу/функцию, которая по заданному числу ABAA ABBB giving |-|||-|- |---|-|- |-|||||| |------- , outputs the AB = |-|| |--- so A = |- |- and B = || -- итерация этого рекурсивного дизайна. Это гольф.

Формат ввода-вывода относительно мягок: вы можете вернуть одну строку, список строк, двумерный массив символов и т. д. Допускаются произвольные конечные пробелы. Вы также можете использовать индексацию 0 или 1.

Примеры

Первые несколько итераций шаблона следующие:

|-|| |---

Интересно, есть ли какой-нибудь короткий алгебраический способ вычислить эту структуру?

#код-гольф #ascii-art

Ing


Рег
31 Mar, 2006

Тем
86

Постов
213

Баллов
653
  • 26, Oct 2024
  • #2

АПЛ (Диалог Классик), 29 25 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 SubstitutionSystem[{"|"->{i={"|","-"},i},"-"->{i,i}},{i},{#}]&
 

Попробуйте онлайн!

{"|-"x{x,'|+|~x:x,x}/,!2} is the vector matrix

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} turns it into a 2x1 matrix

≦⊗ιJ⊗ιιT⊗ιι transposes it, so it becomes 1x2

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

N FENX²ι« применить функцию, которая много раз

э²→|- concatenate the argument on top of itself - a 2x2 matrix

э²→|-FENX²ι«F432C×Iκι׳ιF245C×Iκι⊗ι≦⊗ιJ⊗ιιT⊗ιι remember as ≦⊗ιэ±ι±ιT⊗ιι

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

N transpose

FENX²ι« reverse horizontally

э²↖|-¶¶ reverse vertically

э²↖|-¶¶FENX²ι«F²C±ι⁰C⁰ιC⊗ι±ιC׳ι±ι≦⊗ιэ±ι±ιT⊗ιι concatenate with f=.3 :'''|-''{~((,.[:|.[:|."1[:|:-.)@,~)^:y,:0 1' слева

unzip (%)=zipWith(++) f 0=["|-"] f n|(a,b)<-unzip$splitAt(2^(n-1))<$>f(n-1)=a%b%a%a++a%b%b%b использовать матрицу в качестве индексов в строке import StdEnv $0=[['|-']] $n#z=map(splitAt(2^n/2))($(n-1)) =[u++v++u++u\\(u,v)<-z]++[u++v++v++v\\(u,v)<-z] , i.e. turn 0 into ----------------- ;"/;`,Ẏ;`€$ 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) и 1 в ZY

 

OceanparkBery


Рег
12 Jun, 2014

Тем
64

Постов
203

Баллов
543
  • 26, Oct 2024
  • #3

JavaScript (Node.js), 130...106 94 92 байт

Гольф из моего альтернативного метода и исправления символов, -14 байт Спасибо @Shaggy

¡

Попробуйте онлайн!

Мой оригинальный подход (106 102 байт)

AB AA [ AB , BB ]

-4 байта Спасибо @Shaggy

[A, B]

Попробуйте онлайн!

Объяснение и отсутствие гольфа:

Ç

Мой оригинальный альтернативный метод, если ["|","-"] is allowed, 105 104 bytes:

⁾|-

Попробуйте онлайн!

Только что придумал какой-то алгебраический метод решения этой проблемы.

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

Попробуйте онлайн!

(наконец-то функция, длина которой сопоставима с моим первоначальным ответом)

!¡§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. calculates the block type at (x, y) block at !¡§z+DȯṁmDTm½;"|- итерация следующей замены:

@1='|-';$l=@1,map{/.{$l}/;push@1,$_.$' x2;$_.=$&x2}@1for 1..<>;say for@1

где 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)] , starting from ω .

Затем, α calculates the symbol at (x, y) of the original pattern.

 

Sergsp


Рег
17 Jul, 2004

Тем
74

Постов
213

Баллов
633
  • 26, Oct 2024
  • #4

Стакс, 24 17 15 байты

|∙- 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 "|-||¶|---"

Запустите и отладьте его

Вот ascii-представление той же программы.

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

Основная идея — начать с сетки нулевого поколения, а затем повторить блок, расширяющий сетку.

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

Холст, 17 16 байты

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

Попробуйте здесь!

Пояснение, показывающее стек для ввода 1:

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

Обновлено до 16 байт путем исправления ошибки, из-за которой значения, установленные для g(x)(y) / f(0, 0, 0) = 0 для работы не были скопированы должным образом (Canvas должен быть полностью неизменяемым, но, увы, это не так).

 

AshleyTer


Рег
14 May, 2014

Тем
65

Постов
172

Баллов
527
  • 26, Oct 2024
  • #7

Шелуха, 17 байт

n

1-индексированный. Попробуйте онлайн!

Объяснение

f(n, x, y) ||answer||

Желе, 21 19 байт

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=>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" , that is "|"->"2", "-"->"1" .

Последняя ссылка( 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 "|-"; } ), given 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` `:"|-" , вернется

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

. 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="|-" repeatedly apply the last link (input) number of times, and - форматирует его.

Пояснение к последней ссылке:

| ||answer||

Чистый, 121 106 байт

'|-'

Попробуйте онлайн!

 

Aleksander1982


Рег
13 May, 2011

Тем
66

Постов
207

Баллов
557
  • 26, Oct 2024
  • #8

Хаскелл, 86 байт

]

Попробуйте онлайн!

Довольно просто. Вывод представляет собой список строк. Мы берем предыдущую версию и разделяем каждую строку пополам, а затем собираем их в два новых списка, используя '|-'[ . Then it's simply a matter of combining the arrays together the right way

 

MyXaMoP


Рег
13 Oct, 2006

Тем
63

Постов
200

Баллов
545
  • 26, Oct 2024
  • #9

Дж, 49 байт

a

Неуклюжий перевод решения APL от ngn. У меня были проблемы с тем, чтобы сделать это молчаливым - я буду признателен за любой совет.

Попробуйте онлайн!

 

Angelina1718


Рег
14 Nov, 2015

Тем
68

Постов
196

Баллов
546
  • 26, Oct 2024
  • #10

Древесный уголь, 47 46 байт

a,

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Чтобы получить согласованную позицию курсора для следующего цикла, мне нужно напечатать шаг 0 в позиции (-2, -2) и оставить курсор в позиции (-2, 0). (Это может быть связано с ошибкой в ​​Charcoal.)

Перебрать первый powers of 2.

~

Сделайте копии предыдущего вывода с различными смещениями, в результате чего появится холст, содержащий желаемый следующий шаг в прямоугольнике внутри него.

a

Переместитесь в положение этого прямоугольника и обрежьте холст.

Альтернативное решение, тоже 46 байт:

a←

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

⍪⍨⍵

На этот раз нулевой временной шаг должен быть напечатан в позиции (2, 0), но, по крайней мере, позиция курсора не имеет значения.

}⍣⎕

Перебрать первый { powers of 2.

Сделайте копии предыдущего вывода с различными смещениями, в результате чего появится холст, содержащий желаемый следующий шаг в прямоугольнике внутри него.

Переместитесь в положение этого прямоугольника и обрежьте холст.

 

Наталія оксентю


Рег
07 Dec, 2011

Тем
68

Постов
177

Баллов
557
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно