Ich habe mit unendlichen Widerstandsnetzwerken herumgespielt (lange Geschichte), als ich auf folgendes interessantes rekursives Muster stieß:
|-||
|---
Jedes Exemplar dieses Musters ist doppelt so breit wie hoch. Um von einer Ebene des Musters zur nächsten zu gelangen, zerlegen Sie dieses Rechteck in zwei Unterblöcke (von denen jeder ein NxN-Quadrat ist):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Diese Hälften werden dann dupliziert und nach folgendem Muster neu angeordnet:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Herausforderung
Schreiben Sie ein Programm / eine Funktion, die unter Angabe einer Zahl N
die N
Iteration dieses rekursiven Entwurfs ausgibt . Das ist Golf.
Das E / A-Format ist relativ nachgiebig: Sie können eine einzelne Zeichenfolge, eine Liste von Zeichenfolgen, ein 2D-Array von Zeichen usw. zurückgeben. Beliebig nachgestellte Leerzeichen sind zulässig. Sie können auch die Indexierung 0 oder 1 verwenden.
Beispiele
Die ersten Iterationen des Musters lauten wie folgt:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Ich frage mich, ob es eine kurze algebraische Methode gibt, um diese Struktur zu berechnen.
f(n,x,y)
der direkt berechnet werden kann, ob eine bestimmte Koordinate enthalten soll-
oder nicht|
. Es kann sich um Modulo-Operationen oder bitweise Operationen handeln. Die Techniken, die ich bisher gesehen habe, umfassen alle das Schneiden / Verbinden von Arrays, wie in der Spezifikation gezeigt.f(x,y)
funktioniert auch, da wennx,y
gültig, dann das Ergebnis nicht abhängtn
|-
?Antworten:
APL (Dyalog Classic) ,
2925 BytesProbieren Sie es online!
⍳2
ist der Vektor0 1
⍪
verwandelt es in eine 2x1 Matrix⍉
transponiert es, so wird es 1x2⎕
ausgewertete Eingabe{
}⍣⎕
wende eine Funktion so oft an⍪⍨⍵
Verketten Sie das Argument auf sich selbst - eine 2x2-Matrixa←
erinnere mich alsa
~
negieren⍉
transponieren⌽
horizontal umkehren⊖
vertikal umkehrena,
verketten mita
auf der linken Seite'|-'[
]
Verwenden Sie die Matrix als Indizes in der Zeichenfolge'|-'
, dh drehen Sie 0 in|
und 1 in-
quelle
JavaScript (Node.js) ,
130...1069492 BytesGolf von meiner alternativen Methode und die Festsetzung der Zeichen, -14 Bytes Danke @ Shaggy
Probieren Sie es online!
Mein ursprünglicher Ansatz (
106102 Bytes)-4 Bytes Danke @ShaggyProbieren Sie es online!
Erklärung & Ungolfed:
Meine ursprüngliche alternative Methode, falls
"|"->"2", "-"->"1"
zulässig,105 bis104 Byte:Probieren Sie es online!
Ich habe gerade eine algebraische Methode für dieses Problem herausgefunden.
Probieren Sie es online!
(Endlich eine Funktion, deren Länge mit meiner ursprünglichen Antwort vergleichbar ist)
f(n, x, y)
berechnet den Blocktyp am (x, y) Block bein
der Iteration der folgenden Ersetzung:woher
0 = "|-", 1 = "||", 2 = "--"
, ausgehend vonf(0, 0, 0) = 0
.Dann
g(x)(y)
berechnet das Symbol bei (x, y) des ursprünglichen Muster.quelle
Stax ,
241715 BytesFühren Sie es aus und debuggen Sie es
Hier ist die ASCII-Darstellung des gleichen Programms.
Die Grundidee ist, mit dem Gitter der Generation 0 zu beginnen und dann einen Block zu wiederholen, der das Gitter erweitert.
quelle
Canvas ,
1716 BytesProbieren Sie es hier aus!
Erklärung, die den Stack für die Eingabe von 1 zeigt:
Auf 16 Bytes aktualisiert, indem ein Fehler behoben wurde, bei dem die für
α
/ω
to work festgelegten Werte nicht richtig kopiert wurden (Canvas soll vollständig unveränderlich sein, war es aber leider nicht).quelle
Python 2 ,
8877 Bytes-11 Bytes als Lynn
Probieren Sie es online!
quelle
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 Bytes
Probieren Sie es online!
quelle
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1für (@ 1 = "| -") x <>; sagen wir für @ 1`Schale , 17 Bytes
1-indiziert. Probieren Sie es online!
Erläuterung
quelle
Jelly ,
21 bis19 BytesProbieren Sie es online!
Erläuterung:
Der Wert ist anfangs
⁾|-
also["|","-"]
.Der letzte angegebene link (
Ç
)[A, B]
wird zurückgegeben. Die
¡
letzte Verknüpfung (Eingabe) wird wiederholt angewendet undZY
formatiert.Erklärung für den letzten Link:
quelle
Sauber ,
121106 BytesProbieren Sie es online!
quelle
Haskell , 86 Bytes
Probieren Sie es online!
Ziemlich einfach. Die Ausgabe ist eine Liste von Zeichenfolgen. Wir nehmen die vorherige Version und teilen jede Zeile in zwei Hälften, dann sammeln wir diese mit in zwei neue Listen
unzip
. Dann geht es einfach darum, die Arrays richtig zu kombinierenquelle
J , 49 Bytes
Eine ungeschickte Übersetzung der APL-Lösung von ngn. Ich hatte Probleme, es stillschweigend zu machen - ich werde jeden Rat zu schätzen wissen.
Probieren Sie es online!
quelle
Kohle ,
4746 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Um eine konsistente Cursorposition für die folgende Schleife zu erhalten, muss Schritt 0 an Position (-2, -2) gedruckt und der Cursor an Position (-2, 0) belassen werden. (Dies könnte an einem Fehler in Charcoal liegen.)
Schleife über die ersten
N
Potenzen von 2.Erstellen Sie Kopien der vorherigen Ausgabe mit verschiedenen Offsets, sodass eine Zeichenfläche entsteht, die den gewünschten nächsten Schritt in einem Rechteck enthält.
Bewegen Sie sich an die Position dieses Rechtecks und schneiden Sie die Leinwand.
Alternative Lösung, auch 46 Bytes:
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Dieser Zeitschritt 0 muss an Position (2, 0) gedruckt werden, aber zumindest die Cursorposition spielt keine Rolle.
Schleife über die ersten
N
Potenzen von 2.Erstellen Sie Kopien der vorherigen Ausgabe mit verschiedenen Offsets, sodass eine Zeichenfläche entsteht, die den gewünschten nächsten Schritt in einem Rechteck enthält.
Bewegen Sie sich an die Position dieses Rechtecks und schneiden Sie die Leinwand.
quelle
R , 126 Bytes
Probieren Sie es online!
Gibt a zurück
matrix
. Der TIO-Link enthält ein bisschen Code, damit er gut gedruckt werden kann, um die Überprüfung zu vereinfachen.quelle
K (ngn / k) , 25 Bytes
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
6765 BytesProbieren Sie es online!
Einfache Implementierung der Rekursion. Gibt ein Array von Zeichen in einer Liste zurück.
quelle