Saya bermain-main dengan jaringan resistor tanpa batas (cerita panjang) ketika saya menemukan pola rekursif yang menarik berikut:
|-||
|---
Setiap instance dari pola ini dua kali lebih lebar dari tingginya. Untuk beralih dari satu level pola ke level berikutnya, Anda memecah persegi panjang ini menjadi dua sub-blok (masing-masing merupakan kotak NxN):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Bagian ini kemudian digandakan dan disusun kembali sesuai dengan pola berikut:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Tantangan
Tulis program / fungsi yang, diberi nomor N
, menampilkan N
iterasi desain rekursif ini. Ini golf.
Format I / O relatif ringan: Anda dapat mengembalikan string tunggal, daftar string, array karakter 2D, dll. Ruang spasi trailing sewenang-wenang diizinkan. Anda juga dapat menggunakan pengindeksan 0 atau 1.
Contohnya
Beberapa iterasi pertama dari pola adalah sebagai berikut:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Saya ingin tahu apakah ada beberapa cara aljabar singkat untuk menghitung struktur ini.
f(n,x,y)
yang dapat secara langsung menghitung apakah koordinat yang diberikan harus berisi-
atau|
. Ini mungkin melibatkan operasi modulo atau operasi bitwise. Teknik yang saya lihat sejauh ini semuanya melibatkan cutting / join array seperti yang ditunjukkan dalam spesifikasi.f(x,y)
juga berfungsi, karena jikax,y
valid maka hasilnya tidak bergantung padan
|-
?Jawaban:
APL (Dyalog Classic) ,
2925 byteCobalah online!
⍳2
adalah vektor0 1
⍪
mengubahnya menjadi matriks 2x1⍉
mentransposnya, sehingga menjadi 1x2⎕
input yang dievaluasi{
}⍣⎕
menerapkan fungsi yang berkali-kali⍪⍨⍵
menggabungkan argumen di atas dirinya sendiri - matriks 2x2a←
ingat sebagaia
~
meniadakan⍉
mengubah urutan⌽
mundur secara horizontal⊖
membalikkan secara vertikala,
bergabung dengana
di sebelah kiri'|-'[
]
gunakan matriks sebagai indeks dalam string'|-'
, yaitu mengubah 0 menjadi|
dan 1 menjadi-
sumber
JavaScript (Node.js) ,
130...1069492 byteGolf dari metode alternatif saya dan memperbaiki karakter, -14 byte Terima kasih @Shaggy
Cobalah online!
Pendekatan asli saya (
106102 bytes)-4 byte Terima kasih @ShaggyCobalah online!
Penjelasan & Tidak Digabungkan:
Metode alternatif asli saya, jika
"|"->"2", "-"->"1"
diizinkan,105104 byte:Cobalah online!
Baru saja menemukan beberapa metode aljabar untuk masalah ini.
Cobalah online!
(akhirnya fungsi yang panjangnya sebanding dengan jawaban asli saya)
f(n, x, y)
menghitung tipe blok pada (x, y) blok padan
iterasi substitusi berikut:dimana
0 = "|-", 1 = "||", 2 = "--"
, mulai darif(0, 0, 0) = 0
.Kemudian,
g(x)(y)
hitung simbol pada (x, y) dari pola aslinya.sumber
Stax ,
241715 byteJalankan dan debug itu
Inilah representasi ascii dari program yang sama.
Ide dasarnya adalah mulai dengan kisi 0-generasi, dan kemudian ulangi blok yang memperluas kisi.
sumber
Kanvas ,
1716 byteCoba di sini!
Penjelasan, menunjukkan tumpukan untuk input 1:
Diperbarui hingga 16 byte dengan memperbaiki bug di mana nilai yang ditetapkan untuk
α
/ω
untuk bekerja tidak disalin dengan benar (Canvas seharusnya sepenuhnya tidak dapat diubah, tetapi, sayangnya, tidak).sumber
Python 2 ,
8877 byte-11 byte thansk ke Lynn
Cobalah online!
sumber
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)]
Perl 5 , 72 byte
Cobalah online!
sumber
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1untuk (@ 1 = "| -") x <>; ucapkan untuk @ 1`Sekam , 17 byte
1-diindeks. Cobalah online!
Penjelasan
sumber
Jelly ,
2119 byteCobalah online!
Penjelasan:
Awalnya, nilainya
⁾|-
, yaitu["|","-"]
.Tautan terakhir (
Ç
), diberikan[A, B]
, akan kembali. The
¡
berulang kali menerapkan link terakhir (input) beberapa kali, danZY
format itu.Penjelasan untuk tautan terakhir:
sumber
Bersih ,
121106 byteCobalah online!
sumber
Haskell , 86 byte
Cobalah online!
Cukup mudah. Output adalah daftar string. Kami mengambil versi sebelumnya dan membagi setiap baris menjadi dua lalu mengumpulkannya menjadi dua daftar baru menggunakan
unzip
. Maka itu hanya masalah menggabungkan array bersama dengan cara yang benarsumber
J , 49 byte
Terjemahan canggung dari solusi APL ngn. Saya punya masalah membuatnya diam-diam - saya akan menghargai saran apa pun.
Cobalah online!
sumber
Arang ,
4746 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Untuk mendapatkan posisi kursor yang konsisten untuk loop berikut, saya harus mencetak langkah 0 pada posisi (-2, -2) dan membiarkan kursor berada pada (-2, 0). (Ini mungkin karena bug di Arang.)
Ulangi
N
kekuatan pertama 2.Buat salinan dari output sebelumnya dengan berbagai offset yang menghasilkan kanvas yang berisi langkah berikutnya yang diinginkan dalam kotak di dalamnya.
Pindah ke posisi persegi panjang itu dan rapikan kanvas.
Solusi alternatif, juga 46 byte:
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Langkah waktu 0 ini harus dicetak pada posisi (2, 0), tetapi setidaknya posisi kursor tidak masalah.
Ulangi
N
kekuatan pertama 2.Buat salinan dari output sebelumnya dengan berbagai offset yang menghasilkan kanvas yang berisi langkah berikutnya yang diinginkan dalam kotak di dalamnya.
Pindah ke posisi persegi panjang itu dan rapikan kanvas.
sumber
R , 126 byte
Cobalah online!
Pengembalian a
matrix
. Ada sedikit kode di tautan TIO untuk membuatnya mencetak dengan baik untuk kemudahan verifikasi.sumber
K (ngn/k), 25 bytes
Try it online!
sumber
Wolfram Language (Mathematica),
6765 bytesTry it online!
Straightforward implementation of the recursion. Returns an array of characters wrapped in a list.
sumber