Einführung
Wenn Sie mit Hexagony nicht vertraut sind , ist es eine esoterische Sprache, die von Martin Büttner entwickelt wurde. Die Sache ist, dass diese Sprache mehrere Formen für das Programm akzeptiert. Die folgenden Programme sind alle gleichwertig:
abcdefg
und
a b
c d e
f g
Der Code wurde also im Grunde genommen in ein reguläres Sechseck gerollt. Beachten Sie jedoch, dass das Hinzufügen eines neuen Befehls zum Code abcdefgh
zu folgendem Programm führen würde:
a b c
d e f g
h . . . .
. . . .
. . .
Wie Sie sehen, wird der Code im ersten Schritt zu einem Sechseck aufgerollt, und danach wird das Sechseck mit No-Ops ( .
) bis zur nächsten zentrierten Sechseckzahl ausgefüllt .
Ihre Aufgabe ist einfach: Wenn Sie eine Zeichenfolge (den Quellcode) angeben, geben Sie den vollständigen Hexagon-Quellcode aus.
Die Regeln
- Sie können ein Programm oder eine Funktion bereitstellen.
- Ein führendes Leerzeichen ist zulässig, jedoch nur, wenn das Sechseck nicht aus der Form gerät
- Leerzeichen dürfen nachgestellt werden.
- Beachten Sie, dass Leerzeichen im Programm ignoriert werden . Ist
a b c
also gleichabc
- Es werden nur die druckbaren ASCII-Zeichen (
32 - 126
) verwendet, daher wird nur das reguläreSpace
Zeichen ignoriert. - Angenommen, die Länge der Zeichenfolge ist größer als 0.
- Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Testfälle
Input: ?({{&2'2':{):!/)'*/
Output:
? ( {
{ & 2 '
2 ' : { )
: ! / )
' * /
Input: H;e;l;d;*;r;o;Wl;;o;*433;@.>;23<\4;*/
Output:
H ; e ;
l ; d ; *
; r ; o ; W
l ; ; o ; * 4
3 3 ; @ . >
; 2 3 < \
4 ; * /
Input: .?'.) .@@/'/ .!.> +=(<.!)} ( $>( <%
Output:
. ? ' .
) . @ @ /
' / . ! . >
+ = ( < . ! )
} ( $ > ( <
% . . . .
. . . .
abc`defg
würde eigentlich pastebin.com/ZrdJmHiR werden`
Zeichen) enthält."Antworten:
Pyth,
575450494846Test Suite
Gibt in jeder Zeile ein Leerzeichen aus.
Diese Version erfordert einen Beweis, dass 10 ^ n> = 3n (n - 1) + 1 für alle n> = 1 . Vielen Dank an ANerdI und ErickWong für die Beweise.
Wenn man diesen Ungleichungen folgt: 10 ^ n> (1 + 3) ^ n = 1 + 3n + 9n (n - 1) + ...> 3n (n - 1) + 1 , kann man leicht erkennen, dass dies für n> richtig ist = 2 . Die Untersuchung des Falls n = 1 ist eher trivial und ergibt 10> 1 .
Alternativ zeigt die zweimalige Ableitung dieser Gleichungen, dass 10 ^ n eine größere zweite Ableitung für alle n> = 1 hat , die dann auf die ersten Ableitungen und schließlich auf die ursprünglichen Gleichungen herunterkaskadiert werden kann.
Erläuterung
quelle
Hexagony , 271 Bytes
Ich präsentiere Ihnen die ersten 3% eines Hexagony-Selbstinterpreten ...
Probieren Sie es online! Sie können es auch selbst ausführen, es dauert jedoch ca. 5-10 Sekunden.
Im Prinzip könnte dies in die Seitenlänge 9 passen (für eine Punktzahl von 217 oder weniger), da hier nur 201 Befehle verwendet werden und die ungolfed-Version, die ich zuerst geschrieben habe (auf Seitenlänge 30), nur 178 Befehle benötigte. Ich bin mir jedoch ziemlich sicher, dass es ewig dauern würde, bis wirklich alles passt. Ich bin mir also nicht sicher, ob ich es tatsächlich versuchen werde.
Es sollte auch möglich sein, dies ein bisschen in Größe 10 zu spielen, indem die Verwendung der letzten ein oder zwei Reihen vermieden wird, so dass die nachgestellten No-Ops weggelassen werden können, aber dies würde ein wesentliches Umschreiben als einer der ersten Pfade erfordern joins nutzt die linke untere Ecke.
Erläuterung
Beginnen wir damit, den Code zu entfalten und die Kontrollflusspfade zu kommentieren:
Das ist immer noch ziemlich chaotisch, also hier das gleiche Diagramm für den "ungolfed" Code, den ich zuerst geschrieben habe (tatsächlich ist das die Seitenlänge 20 und ursprünglich habe ich den Code auf Seitenlänge 30 geschrieben, aber das war so spärlich, dass es nicht so wäre verbessert die Lesbarkeit überhaupt nicht, deshalb habe ich sie ein wenig komprimiert, um die Größe ein wenig vernünftiger zu machen):
Klicken Sie für eine größere Version.
Die Farben sind bis auf ein paar sehr kleine Details genau gleich, die Befehle ohne Kontrollfluss sind auch genau gleich. Ich werde Ihnen also anhand der ungolfed Version erklären, wie das funktioniert. Wenn Sie wirklich wissen möchten, wie das golfed funktioniert, können Sie überprüfen, welche Teile dort welchen im größeren Sechseck entsprechen. (Der einzige Haken ist, dass der Golf-Code mit einem Spiegel beginnt, sodass der eigentliche Code in der rechten Ecke nach links beginnt.)
Der grundlegende Algorithmus ist fast identisch mit meiner CJam-Antwort . Es gibt zwei Unterschiede:
.
stattdessen eine aus, wenn vorhanden.Das heißt, die Grundidee läuft auf Folgendes hinaus:
N
(und die entsprechende zentrierte hexagonale Zahlhex(N)
), die die gesamte Eingabe aufnehmen kann.2N-1
.2N-1
). Einzug drucken, Zellen drucken (.
wenn die Eingabe bereits erschöpft ist), Zeilenvorschub drucken.Beachten Sie, dass es nur No-Ops gibt, so dass der eigentliche Code in der linken Ecke beginnt (der
$
, der über den springt>
, damit wir wirklich auf,
dem dunkelgrauen Pfad beginnen).Hier ist das anfängliche Speicherraster:
Der Speicherzeiger beginnt also an der mit input bezeichneten Kante und zeigt nach Norden.
,
liest ein Byte von STDIN oder a,-1
wenn wir EOF in diese Kante getroffen haben. Daher ist das<
Recht danach eine Bedingung dafür, ob wir alle Eingaben gelesen haben. Bleiben wir vorerst in der Eingabeschleife. Der nächste Code, den wir ausführen, istDies schreibt eine 32 in den Rand mit der Bezeichnung " Raum" und subtrahiert sie dann vom Eingabewert in dem Rand mit der Bezeichnung " Diff" . Beachten Sie, dass dies niemals negativ sein kann, da garantiert wird, dass die Eingabe nur druckbares ASCII enthält. Es wird Null sein, wenn die Eingabe ein Leerzeichen war. (Timwi weist darauf hin, dass dies weiterhin funktionieren würde, wenn die Eingabe Zeilenvorschübe oder Tabulatoren enthalten könnte, aber auch alle anderen nicht druckbaren Zeichen mit Zeichencodes unter 32 entfernen würde.) In diesem Fall wird der
<
verbleibende Anweisungszeiger (IP) abgelenkt und der hellgraue Weg wird genommen. Dieser Pfad setzt einfach die Position des MP mit zurück{=
und liest dann das nächste Zeichen - daher werden Leerzeichen übersprungen. Wenn das Zeichen kein Leerzeichen war, führen wir es ausDieser bewegt sich zunächst um das Sechseck durch die Länge Kante bis zu seiner gegenüber dem diff Kante mit
=}}}
. Dann kopiert den Wert aus gegenüber der Länge Kante in die Länge Kante und inkrementiert sie mit)&'+'+)
. Wir werden gleich sehen, warum dies Sinn macht. Zum Schluss verschieben wir die Kante mit=}
:(Die jeweiligen Kantenwerte stammen aus dem letzten in der Challenge angegebenen Testfall.) Zu diesem Zeitpunkt wiederholt sich die Schleife, wobei sich jedoch alles um ein Sechseck nach Nordosten verschoben hat. Nachdem wir ein anderes Zeichen gelesen haben, erhalten wir Folgendes:
Jetzt können Sie sehen, dass wir die Eingabe (Minuszeichen) schrittweise entlang der Nordostdiagonale schreiben, wobei die Zeichen an jeder anderen Kante und die Länge bis zu diesem Zeichen parallel zur mit Länge bezeichneten Kante gespeichert werden .
Wenn wir mit der Eingabeschleife fertig sind, sieht der Speicher folgendermaßen aus (wo ich bereits ein paar neue Kanten für den nächsten Teil markiert habe):
Dies
%
ist das letzte Zeichen, das wir lesen, und die29
Anzahl der Zeichen, die keine Leerzeichen sind. Nun wollen wir die Seitenlänge des Sechsecks ermitteln. Erstens gibt es im dunkelgrünen / grauen Pfad einen linearen Initialisierungscode:Hier wird
=&
die Länge (in unserem Beispiel 29) in die mit Länge bezeichnete Kante kopiert . Bewegt''3
sich dann zu der mit 3 bezeichneten Kante und setzt ihren Wert auf3
(den wir nur als Konstante in der Berechnung benötigen). Bewegt{
sich schließlich zu der mit N (N-1) bezeichneten Kante .Nun betreten wir die blaue Schleife. Diese Schleifeninkremente
N
(in der mit N bezeichneten Zelle gespeichert ) berechnen dann ihre zentrierte hexagonale Zahl und subtrahieren sie von der eingegebenen Länge. Der lineare Code, der das macht, ist:Hier
{)
bewegt sich auf und erhöht N .')&(
bewegt sich zu der mit N-1 bezeichneten Kante , kopiertN
dort und dekrementiert sie.{=*
berechnet ihr Produkt in N (N-1) .'*)
multipliziert dies mit der Konstanten3
und erhöht das Ergebnis in der mit hex (N) bezeichneten Kante . Wie erwartet ist dies die N-te zentrierte hexagonale Zahl. Zum Schluss wird'-
die Differenz zwischen dieser und der eingegebenen Länge berechnet. Wenn das Ergebnis positiv ist, ist die Seitenlänge noch nicht groß genug, und die Schleife wird wiederholt (wobei}}
der MP zurück zu der mit N (N-1) bezeichneten Kante bewegt wird ).Sobald die Seitenlänge groß genug ist, ist die Differenz null oder negativ und wir erhalten Folgendes:
Als erstes gibt es jetzt den sehr langen linearen grünen Pfad, der einige notwendige Initialisierungen für die Ausgangsschleife vornimmt:
Die
{=&
beginnt mit dem Kopieren des Ergebnisses in der diff Kante in die Länge Rand, weil wir später etwas kraft- es brauchen.}}}32
Schreibt eine 32 in den Rand mit der Bezeichnung Leerzeichen .'"2
Schreibt eine Konstante 2 in die unbeschriftete Kante über diff .'=&
kopiertN-1
in die zweite Kante mit dem gleichen Etikett.'*)
multipliziert es mit 2 und inkrementiert es, so dass wir den korrekten Wert in der mit 2N-1 bezeichneten Kante oben erhalten. Dies ist der Durchmesser des Sechsecks.{=&')&
kopiert den Durchmesser in die andere Kante mit der Bezeichnung 2N-1 . Anschließend}}
kehren Sie zu der mit 2N-1 gekennzeichneten Kante oben zurück.Beschriften wir die Kanten neu:
Die Kante, auf der wir uns gerade befinden (die immer noch den Durchmesser des Sechsecks enthält), wird verwendet, um über die Linien der Ausgabe zu iterieren. Die mit Einzug bezeichnete Kante berechnet, wie viele Leerzeichen in der aktuellen Zeile benötigt werden. Die randbeschrifteten Zellen werden verwendet, um die Anzahl der Zellen in der aktuellen Zeile zu durchlaufen.
Wir befinden uns jetzt auf dem rosa Pfad, der den Einzug berechnet .
('-
dekrementiert den Linien Iterator und subtrahiert es von N-1 (in den Gedankenstrich Flanke). Der kurze blau / graue Zweig im Code berechnet einfach den Modul des Ergebnisses (~
negiert den Wert, wenn er negativ oder null ist, und nichts passiert, wenn er positiv ist). Der Rest des rosafarbenen Pfads"-~{
subtrahiert den Einzug vom Durchmesser in die Zellenkante und bewegt sich dann zurück zur Einzugskante .Der schmutzige gelbe Pfad druckt jetzt den Einzug. Die Schleifeninhalte sind wirklich gerecht
Wo
'"
bewegt sich zum Rand des Raums ,;
druckt es,{}
bewegt sich zurück zum Einzug und(
dekrementiert es.Wenn wir damit fertig sind, sucht der (zweite) dunkelgraue Pfad nach dem nächsten zu druckenden Zeichen. Der
=}
bewegt sich in Position (dh auf den Zellenrand , zeigt nach Süden). Dann haben wir eine sehr enge Schleife,{}
die sich einfach zwei Kanten in Richtung Südwesten nach unten bewegt, bis wir das Ende der gespeicherten Zeichenfolge erreichen:Beachten Sie, dass ich dort eine Kante EOF neu etikettiert habe ? . Sobald wir dieses Zeichen verarbeitet haben, machen wir diese Kante negativ, sodass die
{}
Schleife hier anstelle der nächsten Iteration endet:Im Code befinden wir uns am Ende des dunkelgrauen Pfads, wo wir
'
einen Schritt zurück zum eingegebenen Zeichen gehen. Handelt es sich bei der Situation um eines der letzten beiden Diagramme (dh es gibt immer noch ein Zeichen aus der Eingabe, die wir noch nicht gedruckt haben), nehmen wir den grünen Pfad (den unteren für Leute, die mit Grün und nicht gut umgehen können) Blau). Das ist ziemlich einfach:;
druckt das Zeichen selbst.'
bewegt sich zu der entsprechenden Raum Kante , die immer noch ein 32 aus früheren und hält;
Druck , den Raum. Dann{~
macht unser EOF? Negativ für die nächste Iteration,'
bewegt sich einen Schritt zurück, damit wir mit einer weiteren engen}{
Schleife zum nordwestlichen Ende der Saite zurückkehren können . Was auf der Länge endetZelle (die nicht-positiv unter hex (N) . Schließlich}
bewegt sich zurück in die Zellen Kante.Wenn wir die Eingabe jedoch bereits erschöpft haben, sucht die Schleife nach EOF? wird hier tatsächlich enden:
In diesem Fall bewegen wir uns
'
auf die Länge der Zelle und nehmen stattdessen den hellblauen (oberen) Pfad, der ein No-Op ausgibt. Der Code in diesem Zweig ist linear:Der
{*46;
schreibt eine 46 in die Kante mit der Bezeichnung no-op und druckt sie aus (dh einen Punkt). Bewegt{{;
sich dann zum Rand des Raums und druckt diesen aus. Die{{=
Bewegungen zurück in den Zellen für die nächste Iteration umranden.Zu diesem Zeitpunkt verbinden sich die Pfade wieder und
(
dekrementieren die Zellenkante . Wenn der Iterator noch nicht Null ist, nehmen wir den hellgrauen Pfad, der einfach die Richtung des MP umkehrt=
und dann nach dem nächsten zu druckenden Zeichen sucht.Ansonsten haben wir das Ende der aktuellen Zeile erreicht und die IP nimmt stattdessen den violetten Pfad. So sieht das Speicherraster an diesem Punkt aus:
Der violette Pfad enthält Folgendes:
Das
=
kehrt die Richtung des MP wieder um.M8
Setzt den Wert des Sets auf778
(da der Zeichencode vonM
is77
und die Ziffern an den aktuellen Wert angehängt werden). Das ist zufällig10 (mod 256)
so. Wenn wir es mit drucken;
, erhalten wir einen Zeilenvorschub. Dann~
macht die Flanke wieder negativ,'"
bewegt sich zurück zur Linienkante und=
kehrt die MP noch einmal um.Wenn die Linienkante Null ist, sind wir fertig. Die IP nimmt den (sehr kurzen) roten Pfad, auf dem
@
das Programm beendet wird. Andernfalls fahren wir auf dem violetten Pfad fort, der sich in den rosafarbenen Pfad zurückzieht, um eine weitere Zeile zu drucken.Kontrollflussdiagramme, die mit dem HexagonyColorer von Timwi erstellt wurden . Speicherdiagramme, die mit dem visuellen Debugger in seiner Esoteric IDE erstellt wurden .
quelle
CJam,
56525048 BytesMein erster Gedanke war: "Hey, ich habe bereits Code dafür!" Aber dann konnte ich nicht die Mühe machen, die notwendigen Teile aus dem Ruby-Code zusammen zu ziehen, vor allem, weil sie für das Golfen nicht sehr geeignet zu sein schienen. Also habe ich stattdessen etwas anderes in CJam ausprobiert ...
Teste es hier.
Erläuterung
Ein bisschen Mathe über zentrierte hexagonale Zahlen zuerst. Wenn das reguläre Sechseck eine Seitenlänge hat
N
, enthält es3N(N-1)+1
Zellen, die der Quellcodelänge entsprechen müssenk
. Wir können das lösen,N
weil es eine einfache quadratische Gleichung ist:Wir können die negative Wurzel ignorieren, da dies ein negatives N ergibt. Damit eine Lösung gefunden werden kann, muss die Quadratwurzel eine halbe ganze Zahl sein. Oder mit anderen Worten, es
√(1 + 4(k-1)/3) = √((4k-1)/3)
muss eine ganze Zahl sein (zum Glück entspricht diese ganze Zahl dem DurchmesserD = 2N-1
des Sechsecks, den wir sowieso benötigen). So können wir wiederholt eine einzelne hinzufügen,.
bis diese Bedingung erfüllt ist.Der Rest ist eine einfache Schleife, die das Sechseck auslegt. Eine nützliche Beobachtung für diesen Teil ist, dass sich die Leerzeichen in der Einrückung plus die Nicht-Leerzeichen im Code in jeder Zeile zum Durchmesser addieren.
Es stellt sich heraus, dass wir überhaupt keine Doppelarithmetik verwenden müssen (mit Ausnahme der Quadratwurzel). Aufgrund der Multiplikation mit 4 treten beim Teilen durch 3 keine Kollisionen auf, und der gewünschte
k
Wert liefert als erster eine ganzzahlige Quadratwurzel.quelle
Perl,
203200198enthält + 1 für
-p
Rennen wie:
echo abc | perl -p file.pl
Ein sehr naiver Ansatz:
;
; Code sich jetzt unter 200 Bytes!$s=~/\S+/g
anstelle vonsplit/\n/,$s
quelle
JavaScript (ES6), 162,
172Anonyme Funktion
Die Sechseckgröße wird gefunden, indem die Gleichung aus Wikipedia aufgelöst wird
Die Lösungsformel ist grundsätzlich
Mit etwas Algebra und etwas Näherung (Danke auch an @ user18655) wird es
Mehr lesbar
Testschnipsel (besser ganze Seite - Laufzeit ~ 1 Minute)
quelle
n=...+1-1e-9|0
anstelle vonn=Math.ceil(...)
2 Bytes speichern. Sie könnten auch ES7 verwenden und**0.5
stattdessen,Math.sqrt
aber das liegt bei Ihnen. Normalerweise behalte ich meine Antworten bei ES6, weil sie in meinem Browser funktionieren, haha!Pyth,
5251 BytesProbieren Sie es online aus. Testsuite.
Jede Zeile hat ein zusätzliches Leerzeichen, wie vom OP zugelassen.
Erläuterung
quelle
Netzhaut , 161 Bytes
Vielen Dank an FryAmTheEggman für das Speichern von 2 Bytes.
Diese Antwort ist nicht konkurrierend. Retina hat seit dieser Herausforderung einige Updates gesehen, und ich bin mir ziemlich sicher, dass ich einige der neueren Funktionen verwende (obwohl ich sie nicht überprüft habe).
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus. Die erste Zeile enthält ein einzelnes Leerzeichen. Beachten Sie, dass die meisten
·
Punkte tatsächlich Mittelpunkt sind (0xB7).Probieren Sie es online!
Gut...
Erläuterung
Es scheint am einfachsten zu sein, das Layout zuerst mit nur einem Zeichen zu erstellen (
·
in diesem Fall) und dann das resultierende Layout mit den eingegebenen Zeichen zu füllen. Die Hauptgründe dafür sind, dass ich bei der Verwendung eines einzelnen Zeichens auf Rückverweise und Zeichenwiederholungen zurückgreifen kann, bei denen das direkte Layout der Eingabe teure Bilanzkreise erfordern würde.Obwohl es nicht viel aussieht, werden in dieser ersten Phase Leerzeichen aus der Eingabe entfernt.
Wir beginnen mit dem Voranstellen einer zusätzlichen Zeile mit
M
Mittelpunkten, wobeiM
die Länge der Eingabe (nach dem Entfernen von Leerzeichen) angegeben ist.Wenn es sich bei der Eingabe um ein einzelnes Zeichen handelte, wird der mittlere Punkt wieder entfernt. Dies ist ein unglücklicher Sonderfall, der in der nächsten Phase nicht behandelt wird.
Dies berechnet die erforderliche Seitenlänge
N
minus 1. So funktioniert das: Zentrierte hexagonale Zahlen haben die Form3*N*(N-1) + 1
. Da es sich um Dreieckszahlen handeltN*(N-1)/2
, bedeutet dies, dass sechseckige Zahlen das Sechsfache einer Dreieckszahl plus 1 sind. Dies ist praktisch, da das Zuordnen von Dreieckszahlen (die wirklich nur1 + 2 + 3 + ... + N
aus einer Regex bestehen) mit Vorwärtsreferenzen relativ einfach ist. Das(^·|\2·)*
stimmt mit der größten dreieckigen Zahl überein, die es kann. Als netter Bonus hält$2
dann der Index diese Dreieckszahl. Um es mit 6 zu multiplizieren, fangen wir es in Gruppen ein1
und gleichen es weitere 5 Mal ab. Wir stellen sicher, dass es mindestens zwei weitere·
mit dem·
und dem gibt·+
. Auf diese Weise erhöht sich der Index der gefundenen dreieckigen Zahl erst, wenn ein Zeichen mehr als eine zentrierte hexagonale Zahl vorhanden ist.Am Ende ergibt diese Übereinstimmung zwei weniger als die Seitenlänge des erforderlichen Sechsecks in der Gruppe
$2
, daher schreiben wir das zurück, zusammen mit einem weiteren Mittelpunkt, um zu erhaltenN-1
.Dies verwandelt unsere Reihe von
N-1
Mittelpunkten inN-1
Räume,2N-1
Mittelpunkte und andereN-1
Räume. Beachten Sie, dass dies die maximale Einrückung ist, gefolgt vom Durchmesser des Sechsecks, gefolgt von der erneuten Einrückung.Dies ist unangenehm lang, aber es gibt uns im Grunde nur alle überlappenden Übereinstimmungen, die entweder a)
2N-1
lang und in der ersten Zeile oder b) in der zweiten Zeile sind. Dies erweitert das Ergebnis der vorherigen Stufe in das vollständige, aber merkwürdig eingezogene Sechseck. ZB für die Eingabe würden12345678
wir erhalten:Aus diesem Grund mussten wir in der vorherigen Phase auch Leerzeichen anhängen.
Dies behebt den Einzug der Zeilen nach der Mitte, indem alle Zeilen, die kürzer als die vorherigen sind, wiederholt eingerückt werden (wobei nachfolgende Leerzeichen ignoriert werden).
Jetzt fügen wir nur einige Leerzeichen mit ein
Welches gibt uns:
Puh, das ist erledigt.
Zeit, die Eingabezeichenfolge in die mittleren Punkte einzufügen. Dies geschieht mit Hilfe einer Sortierstufe. Wir gleichen alle Mittelpunkte und jedes Zeichen in der letzten Zeile ab und sortieren sie nach dem Ergebnis der angegebenen Ersetzung. Diese Ersetzung ist für die Zeichen in der letzten Zeile und
·
für die mittleren Punkte leer. Daher werden die mittleren Punkte einfach bis zum Ende sortiert (da die Sortierung stabil ist). Dies verschiebt die eingegebenen Zeichen an die richtige Stelle:Nur noch zwei Dinge:
Dadurch werden die mittleren Punkte zu regelmäßigen Perioden.
Und das verwirft die letzte Zeile.
quelle
JavaScript (ES6), 144 Byte
Wobei
\n
das wörtliche Zeilenumbruchzeichen darstellt. Verwendet eine Technik zum Erstellen eines Sechsecks, die ich zuvor für mehrere andere Sechseck-Gitter- Antworten verwendet habe. Für ES7 ist die Quadratwurzelbildung etwas kürzer als der rekursive Ansatz:quelle
Python 3 , 144 Bytes
Probieren Sie es online!
Dabei wird für Sechsecke unterschiedlicher Größe eine unterschiedliche Menge an führenden Leerzeichen verwendet, die allgemeine Form bleibt jedoch erhalten.
quelle