Ich finde es faszinierend, wie sehr sich die Buchstaben "H" und "I" ähneln. "H" ist ein horizontaler Strich, der von zwei vertikalen Strichen umgeben ist; "I" ist ein vertikaler Strich, der von zwei horizontalen Strichen umgeben ist (abhängig von Ihrer Schriftart). Ich wette, das könnte verschachtelt sein ... Weißt du, woran mich das erinnert? Fraktale !!!
Definieren wir die "IHIH" -Pyramide wie folgt: Die erste Iteration ist diese ASCII-Darstellung des Buchstabens "I":
---
|
---
Die nächste Iteration weist auf beiden Seiten einen vertikalen Strich auf.
| |
|---|
| | |
|---|
| |
Wenn Sie das "I" in der Mitte als einen einzelnen horizontalen Strich betrachten, ist diese zweite Iteration im Grunde ein "H". Die dritte Iteration fügt oben und unten einen horizontalen Strich hinzu
-------
| |
|---|
| | |
|---|
| |
-------
Wenn Sie das "H" in der Mitte als einen einzelnen vertikalen Strich betrachten, ist diese Iteration im Grunde ein "I". Dieses Muster setzt sich fort und wechselt bei jeder Iteration zwischen "H" und "I". Als Referenz sind hier die ersten 6 Iterationen:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
Die Herausforderung:
Schreiben Sie ein Programm oder eine Funktion, die die N-te Iteration der IHIH-Pyramide und einen optionalen Zeilenumbruch ausgibt. Ihre Eingabe ist eine einzelne positive Ganzzahl in dem von Ihnen gewünschten vernünftigen Format. Sie müssen keine ungültigen Eingaben verarbeiten, z. B. Nicht-Ganzzahlen, Zahlen kleiner als 1 usw. Ihr Programm muss mindestens die richtige Ausgabe für Eingaben bis 20 liefern. Da dies Codegolf ist , sind Standardlücken nicht zulässig und die kürzeste Antwort in Bytes gewinnt!
Antworten:
Pyth ,
50403125 BytesTestsuite.
Erläuterung
Dies ist ein rekursiver Algorithmus.
In jeder Iteration führen wir drei Aktionen aus:
"-"
oder in"|"
Abhängigkeit von der Anzahl der Iteration.Nach den Iterationen werden die ungeradzahligen Ausgaben transponiert. Deshalb setzen wir sie um.
quelle
Python,
165145133123 BytesEine rekursive Lösung:
Wird mit aufgerufen
print ("\n".join(i(int(sys.argv[1]))))
, wobei der Parameter die Iterationsnummer der IHIH-Pyramide ist.Vielen Dank an @DJMcMayhem für die Einsparung von 20 Bytes. Die Idee hinter diesen Vorschlägen weiter zu nehmen, sparte weitere 12 Bytes. Vielen Dank an @Maltysen für Vorschläge, die mehr Bytes gekürzt haben.
Die Funktion setzt das Trennzeichen
d
auf"|"
und die dazwischen liegenden Leerzeichen auf" "
(für ungerade Iterationen), behandelt die Rückkehr im entarteten Fall und setzt dann das Trennzeichen auf" "
und die dazwischen liegenden Leerzeichen auf"-"
für gerade Iterationen zurück. Die Funktion gibt eine Liste von Zeichenfolgen für jede Zeile der IHIH zurück, wobei das Ergebnis eines rekursiven Aufrufs der Funktion an der richtigen Stelle in der Liste eingebettet wurde.quelle
if e<1:return'|'
(kein Zeilenumbruch dazwischen), entfernen Sie dann das "else" und entfernen Sie den zusätzlichen Einzug.return
. Sie können auch die Zeilen ohneif
s mit Semikolons zusammenführen und den EinzugCheddar ,
186177165154148131 BytesVerwendet die Rekursion. Fügt eine Erklärung hinzu, sobald das Golfen abgeschlossen ist.
Probieren Sie es online!
Erläuterung
Dieses ist auch ein bisschen komplex. Behalte alle Variablen im Auge, die ich verwende, aber ich werde versuchen, es einfach zu halten:
Dies war eine Herausforderung für den Golfsport, aber seine 55 Bytes sind kürzer als das Original.
quelle
Python 2, 93 Bytes
Undichte Nonne sparte 7 Bytes.
quelle
int(x/2.)
weil ich genommen habe,range(-n,n+1)
aber jetzt kann ich nur diese verwenden. Vielen Dank!Matricks ,
8062 BytesEine iterative Lösung (Rekursion in Matricks ist schwierig ...)
Laufen Sie mit
python matricks.py ihih.txt [[]] <input> --asciiprint
Erläuterung:
quelle
JavaScript (ES6),
92 bis90 ByteDie rekursive Lösung verwendet die vorherige Iteration, fügt das
v
Zeichen an den Seiten und dannc
an den Ecken sowieh
am oberen und unteren Rand hinzu. Der Zeichensatz wechselt einfach jede Iteration. Bearbeiten: 2 Bytes durch Rückgabe vonv
wann gespeichertn=0
.quelle
Dyalog APL ,
5243 Bytesv h s←'|- '
Abtretungs die drei Zeichen zu drei Namen ( v ertikale, h orizontal, s Tempo)⊃
der erste, dh|
⍪
Machen Sie in 1 × 1 Tabelle{
...}⍣⎕
erhalten Eingaben und wenden die geschweifte Funktion so oft anv=⊃⍵:
Wenn das linke obere Zeichen des Arguments vertikal ist, gilt Folgendes:h⍪⍨
horizontale untenh⍪
Horizontale obens,
Leerzeichen links von⍵,s
das Argument mit Leerzeichen rechts⋄
sonst:v,⍨
Vertikale rechts vonv,
Vertikale links vons⍪
Leerzeichen darüber⍵⍪s
das Argument mit Leerzeichen untenTryAPL online!
quelle
Brachylog , 84 Bytes
Probieren Sie es online!
Ein Port meiner Antwort in Pyth .
quelle
C 110 Bytes
Aufrufen als
f(n)
. Für 111 Bytes könnte ich tun:Dh der
#define
speichert genau ein Byte.quelle
Dyalog APL, 34 Bytes
{
...}⍣⍵⍪'|'
Wende die Funktion in geschweiften Klammern an⍵
, beginnend mit 1x1 Zeichenmatrix|
. Das Ergebnis jeder Anwendung ist das Argument für die nächste Anwendung.s b←' -|'~⊃⍵
s ist Leerzeichen und b ist der Balken, der sich nicht in der oberen linken Ecke des Arguments befindet. (' -|'~'-'
Entfernt den horizontalen Balken und lässt Leerzeichen und den vertikalen Balken frei.)s,⍵,⊃s b
füge links und rechts Leerzeichen hinzu (⊃
Auswahl s von Vektor sb)b,b,⍨⍉
transponieren und b nach links und rechts addierenBei ungeraden Zahlen bleibt das Ergebnis transponiert, sodass eine endgültige Transponierung erforderlich ist.
⍉⍣⍵
Transponierungszeiten⍵
(einmal wäre ausreichend, aber kürzer, um auf diese Weise zu codieren)TryAPL online
quelle
Cheddar , 107 Bytes
Probieren Sie es online!
quelle
Cheddar, 85 Bytes
Meine erste Antwort von Cheddar. Probieren Sie es online!
Wenn ich versuche zu schreiben
r=(-n|>n).map(v->abs v).map
,r(y->r(x->…))
stürzt der Interpreter ab. ; -;quelle
v->abs v
in(abs)
(zBr.map((abs))
) , die eine Funktion zurück , die das Verhalten der ABS - Funktion hat. zB(+)(1,2)
->3
.(^)(2,6)
-> 64. Auch großartig, wenn du mich um fast 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(map
erhält vermutlich sowohl das Element als auch seinen Index.)APL (Dyalog Classic) , 34 Byte
Probieren Sie es online!
(verwendet
⎕io←1
)⍳⎕
ist1 2 ... N
(⌽,0,⊢)
ist ein Zug, der daraus macht-N ... -1 0 1 ... N
∘.( )⍨
Führt die Klammern für jedes Koordinatenpaar aus⍺ ⍵
Der Zug
(≤-(1+=)×2|⌈)
oder sein dfn-Äquivalent{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
erzeugt eine Matrix wie:'- |'[2+ ]
Legt diese gültigen Indizes fest⎕IO=1
und wählt die entsprechenden Zeichen ausquelle
Ruby,
817877 BytesDies basiert auf Lynns Python-Antwort . Golfvorschläge sind willkommen.
Edit: 3 Bytes dank Lynn. Korrekturen und Golfen 1 Byte dank Jordan.
Ungolfing:
quelle
.map(&:abs)
?*
macht gar nichts. Sie können*""
anstelle von verwenden.join
. Wenn Siep
die einzelnen Zeilen in Anführungszeichen setzen (dabei werdeninspect
die Argumente aufgerufen), kann dies zu einer Disqualifikation führen.&:abs
(map &:abs
) entfernen . Möglicherweise können Sie etwas mitArray#product
verschachteltenmap
s tun , aber Zeilenumbrüche sind schwierig.r.product(r).map
(wie auch immer) sind länger und lassen keine Zeilenumbrüche zu.MATLAB,
168163 BytesDies ist wahrscheinlich nicht die clevere Methode: Erweitern einer Zeichenfolge nach allen Seiten in
n
Schritten:Verwendung: Speichern unter
g.m
(muss ich das zur Byteanzahl hinzufügen?) Und rufen zB aufg(15)
.Ungolfed:
quelle
' '
durch0
(Matlab behandelt Zeichen 0 als Leerzeichen) und'-'
durch45
. Der Dateiname muss nicht in der Byteanzahl enthalten seinEigentlich ,
484544 ByteDies ist ein Versuch, meine Ruby-Antwort auf Actually zu portieren. Das ist viel zu lang und Golfvorschläge werden sehr geschätzt. Probieren Sie es online!
Hier ist eine 46-Byte-Version, die die verschachtelten Funktionen aufteilt, damit wir sie
"| -"
in weniger Bytes definieren können . Probieren Sie es online!Ungolfing:
Erster Algorithmus
Zweiter Algorithmus
quelle
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
ist länger als das, was Sie derzeit haben (um 2 Byte), aber Sie finden möglicherweise Anregungen, wie Sie es kürzer machen können, die ich nicht sehe.Canvas ,
19181714 BytesProbieren Sie es hier aus!
Wenn ich jede zweite Ausgabe um 90 ° gedreht ausgeben dürfe, könnten die letzten 4 Zeichen entfernt werden.
Erläuterung (einige Zeichen wurden so geändert, dass sie ~ monospace aussehen):
quelle
05AB1E ,
2928 BytesProbieren Sie es online!
-1 dank Dzaima ...
Dies ist eine iterative Lösung.
Dies erfolgt im Wesentlichen durch Erstellen des folgenden Musters:
Dann paarweise jedes Element zusammen transponieren und die Polsterung hinzufügen.
Durch das Transponieren nach jeder Iteration wird eine einzelne Ecke des Musters erstellt.
Dann können wir die Reflexionsbefehle von 05AB1E verwenden.
quelle
Mathematica,
158 bis164 BytesBerechnet mathematisch das richtige Symbol an den Koordinaten (i, j), wobei beide von -n nach n verlaufen. Menschlich formatiert:
quelle
PHP, 166 Bytes
mehr als 100 Bytes von meinem ersten Ansatz golfen und es ist immer noch die längste Antwort hier.
Nervenzusammenbruch
ungolfed
quelle
Perl 5 , 150 Bytes
Probieren Sie es online!
quelle
Haskell , 110 Bytes
Probieren Sie es online!
Erklärung / Ungolfed
Die
g
Hilfsfunktion nimmt ein Zeichen und eine Liste von Zeichenfolgen entgegen und hängt dieses Zeichen an jede Zeichenfolge an:Als nächstes nimmt der Operator
(!)
eine Funktion (g
), eine Zahl (n
) und ein Zeichen (c
). Dann berechnet es die Ausgabe fürn-1
, wendet die Funktion daraufg
an und fügtc
am Anfang und am Ende eine Zeichenfolge mit der gleichen Breite ein, die aus s besteht:Damit wir die Ausgaben rekursiv generieren können, müssen wir zunächst den Basisfall abdecken:
Und dann die Rekursion:
quelle
J , 37 Bytes
TIO
quelle
Stax , 22 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle