Ihre Aufgabe: Geben Sie eine Ganzzahl ein n
und generieren Sie ein eingebettetes Sechseckmuster gemäß den folgenden Regeln bis zur n-ten Tiefe.
Ein eingebettetes Sechseck hat folgende Grundform: ( n=0
)
__
/ \
\__/
Eingebettete Sechsecke n=1
und n=2
:
____
/ \ \
/\__/ \
\ /
\____/
________
/ \ \ \
/\__/ \ \
/\ / \
/ \____/ \
\ /
\ /
\ /
\________/
Die Länge jeder Seite beträgt das Zweifache der Länge derselben Seite in der vorherigen Tiefe das Zweifache. Die obere und untere Seite haben eine Länge von 2 Zeichen, n=0
der Rest beginnt mit einer Länge von 1 Zeichen. Die nicht von oben nach unten verlaufenden Seitenlängen sollten 2^n
lang sein ( OEIS: A000079 ) und die Ober- und Unterseite sollten der Regel entsprechen 2^(n+1)
(gleiches OEIS).
Die aktuellen Sechsecke sind 0-indiziert. Sie können auch 1-indiziert verwenden, wenn Sie möchten.
Das ist Code-Golf , also gewinnt die kürzeste Antwort!
quelle
n
?Antworten:
Kohle ,
4029 BytesDank @Neil konnten 11 Bytes gespart werden, indem die while-Schleife unter anderem in eine for-Schleife geändert wurde
Probieren Sie es online!
Erklärung (veraltet)
Dieses Programm beginnt mit der Generierung des größten Sechsecks und führt die kleineren nacheinander in einer while-Schleife (1-indiziert) aus. Als Referenz
α
dient die Eingabenummer,β
die Variable, die enthält,2^(α-1)
undι
die sich wiederholende Variable in der Schleife.quelle
×_X²ι
dasselbe ist wie×__β
, und ein paar weitere Bytes durch Konvertieren von yourW
in aF
, wodurch auch vermieden wird, dass die eingegebene Nummer gespeichert werden muss. Probieren Sie es online! .Haskell ,
230217207 BytesBEARBEITEN:
#
gerecht sein könntemax
.zipWith
undp
könnte zu einem?
Operator zusammengeführt werden, und das würde ich (irgendwie!) Neu implementierenreplicate
.m
nimmt einInteger
und gibt ein zurückString
.Probieren Sie es online!
Wie es funktioniert
m
ist die Hauptfunktion. Es verwendet&
, um die Sechsecke mit der richtigen Polsterung zu erzeugen, und faltet sie dann zusammen mito
.l&t
Erzeugt ein kleines Sechseck mit Seitenlänget
, das innerhalb eines großen Sechsecks mit Seitenlänge gepolstert istl
, als Liste vonString
Linien.a
ist die oberste Linie des Sechsecks mit den Unterstrichen.b
ist eine Liste der anderen Zeilen in der oberen Hälfte des Sechsecks. Die Linien vonb
sind in der rechteckigen Polsterung zentriert. So kann der nächste Schritt ausgeführt werden.a
überlagerte oben aufb
mito
, dann umgekehrt (um sowohl von Linien und innerhalb jeder Zeile).c
Nimmt zwei Argumente, eine Liste von Längen und eine Zeichenfolge, und generiert eine Zeichenfolge, die so viele Kopien jedes Zeichens im Original enthält wie die entsprechende Länge, zc[1,3,2]"abc" == "abbbcc"
. Es wird verwendet&
, um die Zeilen zu generieren.o
Nimmt zwei Argumente, die Bilder als Zeilenlisten darstellen, und überlagert das erste, kleinere Argument mit dem zweiten.?
das erste Bild zweimal mit unendlich vielen Leerzeichen nach unten und rechts auffüllen und dann die entsprechenden Zeichen mit zusammenzippenmax
, wodurch das Nicht-Leerzeichen ausgewählt wird, falls es eines gibt.(f?e)l m
füllt eine Listel
mit unendlich vielen 'e'-Elementen auf und komprimiert dann die resultierende Liste und die Listem
mit derf
Funktion.quelle
(#)
kann seinmax
.p
zu speichern Bytes:o=max?' '?"";f?e=z f.(++repeat e)
. Könnte auch kürzer sein.(\n->(<$[1..n]))
istreplicate
.replicate
? Das ist nur peinlich. Ich bin es einfach zu gewohnt<$[1..n]
oder[1..n]>>
gewinne fast immer. Ich verstehe jedoch nicht, wie ich?
weiter kürzen soll . Ich habe bereits versucht,p
pointfree zu machen, und der++
ist einfach am falschen Ort und sprengt Dinge mitflip
.JavaScript (ES6), 258 Byte
Erläuterung: Bei Sechsecken nach dem ersten wird zuerst das vorherige Sechseck generiert und auf jeder Seite aufgefüllt (dies setzt voraus, dass die Ausgabe ein Rechteck ist). (Für die erste Überschrift wird ein Teil des Platzhalters erzeugt.) Die oberen und oberen Seiten des Sechsecks werden generiert und alle Leerzeichen mit dem vorherigen Sechseck zusammengeführt. (Es gibt einige Tricks, um die Sechsecke in eine Linie zu bringen. Dies wäre einfacher, wenn zusätzliche Ränder zulässig wären.) Die unteren Seiten des Sechsecks werden analog zu den oberen Seiten erzeugt, und der Boden des Sechsecks wird dann ausgefüllt. Es muss darauf geachtet werden, dass rechteckige Ausgaben, einschließlich einer nachgestellten Newline, zurückgegeben werden, damit die Rekursion funktioniert.
quelle
/
sind in der ASCII-Kunst sehr beliebt, und diereplace
Methode ist eine relativ kostengünstige Möglichkeit, sie in JavaScript zu generieren.1<<n>>1
: Schöne Symmetrie ;-)v
aber leider1
ist sie in keiner meiner üblichen Schriftarten symmetrisch.PHP, 337 Bytes
0 Indizierung
Probieren Sie es online!
Erweitert
quelle