Herausforderung
Wir alle wissen um normale Weihnachtsbaum - aber wie etwa einen Upside-Down - Weihnachtsbaum ! Dies ist eine ziemlich einfache, weihnachtliche Herausforderung. Das Ziel dieser Herausforderung ist es, mich zu einem verkehrten ASCII-Weihnachtsbaum zu machen. Hier sind die Regeln für diese Herausforderung:
- Akzeptiere eine ungerade, positive ganze Zahl. Sie können davon ausgehen, dass es immer zwischen
7
und liegen wird51
. Die Basis des Baumes besteht aus den Zeichen:
___ \ / |
Die Spitze des Baumes (der Stern) besteht aus einem einzigen
*
.Jede Zeile des Baums wird mit dem Format erstellt,
<?>
in dem?
eine beliebige Anzahl von-
s angegeben ist. Wenn Sie beispielsweise eine Linie mit einer Länge5
erstellen, sollte diese Linie so sein<--->
. Oder wenn Sie eine Linie von Länge machen8
, sollte die Linie sein<------>
.So sollte der Körper des Baumes aufgebaut sein:
Nehmen Sie die ungerade Zahl
n
als Eingabe und erstellen Sie eine Linie mit dieser Länge.Subtrahiert
4
ausn
und eine Linie des Baumes, die Länge erstellen.Subtrahiert
2
ausn
und eine Linie des Baumes, die Länge erstellen.Dekrement
n
von2
. Fahren Sie danach, sofern nichtn
gleich5
, mit Schritt 2 fort.
Die Basis (siehe Schritt 2.), der Stern (siehe Schritt 3.) und jede Zeile des Baums (siehe Schritte 4. und 5.) sollten alle mit der ursprünglichen ungeraden Zahleneingabe (siehe Schritt 1.) als Maximum zentriert werden Breite.
Beispiele / Testfälle
odd number inputed: 7
___
\ /
|
<-----> line length -> 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 13
___
\ /
|
<-----------> line length -> 13
<-------> line length -> 13 - 4 = 9
<---------> line length -> 13 - 2 = 11
<-----> line length -> 11 - 4 = 7
<-------> line length -> 11 - 2 = 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 9
___
\ /
|
<-------> line length -> 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 17
___
\ /
|
<---------------> line length -> 17
<-----------> line length -> 17 - 4 = 13
<-------------> line length -> 17 - 2 = 15
<---------> line length -> 15 - 4 = 11
<-----------> line length -> 15 - 2 = 13
<-------> line length -> 13 - 4 = 9
<---------> line length -> 13 - 2 = 11
<-----> line length -> 11 - 4 = 7
<-------> line length -> 11 - 2 = 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
Regeln
- Es gelten Standardlücken .
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
repeat the above steps until the odd number minus 2 equals 5
- in der ersten Eingabe ist die ungerade Zahl 7 und 7-2 = 5, daher sollte der Baum sofort enden (ich weiß, was Sie meinen, aber es muss umformuliert werden)7
die minimale Eingabe ist, würden Sie zuerst die drei Baumlinien erstellen (Unterschritte .1.1, .1.2, .1.3), dann2
von der ungeraden Zahl subtrahieren und testen, ob sie gleich ist5
. Die Anweisung, zu überprüfen, ob die "ungerade Zahl minus 2 gleich 5" ist, ist am Ende, die anderen drei Schritte sollten zuerst ausgeführt werden. Aber um Ihren ersten Kommentar zu beantworten, wäre das in Ordnung.7
als Eingabe akzeptieren müssen oder ob Sie akzeptieren können4
, wie in der vierten ungeraden Zahl (oder3
ob es 0-indiziert ist).Antworten:
Python 3 ,
12712110510310098 BytesDies ist eine unbenannte Lambda-Funktion, die eine Liste von Zeilen zurückgibt:
Probieren Sie es online!
Der Hauptteil dieser Antwort besteht darin
(o-i+2-i%2*3)
, die Anzahl der Striche in einer Zeile zu ermitteln. Der Rest der Antwort besteht einfach darin, dies in die gewünschte ASCII-Kunst umzuwandeln.Vielen Dank an Herrn Xcoder für das Rasieren von 6 Bytes und das Besprechen von Golfspielen mit mir im Chat.
Vielen Dank auch an Lynn für Bemerken , das
3*(i%2)
sein kanni%2*3
, 2 Bytes kürzer!quelle
f
-stringso-i+2-i%2*3
spart zwei Bytes.C 163 Bytes
Probieren Sie es online!
Abgerollt:
quelle
Proton , 83 Bytes
Vielen Dank an FlipTack für das Speichern von 4 Bytes und für die Zusammenarbeit im Chat (wir bilden tatsächlich ein großartiges Team). Indirekt 2 Bytes dank Lynn gespeichert .
Probieren Sie es online!
quelle
Kohle , 28 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Drucken Sie die Basis.
Schleife von der Hälfte der eingegebenen Nummer auf 1 ab.
Drucken Sie zwei Zeilen, die erste mit einer Zeile mehr
-
als dem Schleifenindex, die zweite mit einer Zeile weniger.Spiegeln, um den Baum zu vervollständigen.
Platziere den Stern.
quelle
SOGL V0.12 ,
35 -30 BytesProbieren Sie es hier aus!
Verwendet Neils Charcoal-Algorithmus und nimmt die Eingabe als Index in die ungeraden Zahlen - also würde 13 der Eingabe 7 entsprechen
quelle
Netzhaut , 89 Bytes
Probieren Sie es online! Erläuterung: In der ersten Stufe wird die Eingabe in unär umgewandelt und a angehängt
>
. Die zweite Stufe ersetzt zwei-
s durch a<
, um die Leitungslänge zu korrigieren. Die dritte Stufe repliziert dann den Zweig, ist jedoch jedes Mal etwas kürzer, bis der Zweig nicht mehr weiter gekürzt werden kann. Die letzte Stufe fügt die Basis und den Stern hinzu.quelle
Javascript 506 Bytes
Golf-Version:
Ungolf-Version:
Verwendung:
console.log(tree(13)), console.log(tree(17)),
ES6 165 Bytes (von meinem Freund)
Golf-Version:
Ungolf-Version:
Verwendung:
p(31); p(17);
quelle
const
Stichwörter entfernen usw.PowerShell , 131 Byte
Probieren Sie es online!
Nun, das ist ein richtiges Durcheinander für alle, die nicht mit PowerShell vertraut sind. Mal sehen, wie gut ich erklären kann, wie es funktioniert.
Für die Erklärung werde ich verwenden
input = 17
.Wir beginnen ganz einfach mit dem Setzen der Hilfsvariablen
$i=2
und dem Setzen von$x
auf<something>
, wobei der<something>
Start als Bereich von der Eingabe$args
bis zur Eingabe5
erfolgt17,16,15,...,6,5
. Dieser Bereich wird in eine for-Schleife gepumpt.Bei jeder Iteration setzen wir die Hilfsvariable
$j
als Ergebnis einerif
Anweisungif($_%2){$i-2}else{($i++)}
. Wenn es seltsam ist$j=$i-2
, sonst$j=($i++)
. Dies, verbunden mit$i=2
am Anfang, gibt uns die Reihenfolge,0, 2, 1, 3, 2, 4, 3, 5...
die genau der Anzahl der Leerzeichen entspricht, die wir unserer Baumgrenze voranstellen müssen. ;-) Wir nehmen' '
und multiplizieren es mit dieser Zahl.Als nächstes brauchen wir unsere Filialen. Dies geschieht mit
'<'
plus dem Mittelteil'-'
multipliziert mit dem Ende'>'
. Die Multiplikation erfolgt durch Erkennen der-
Alternative in einem2, 5, 2, 5, 2...
Muster basierend auf der eingegebenen Nummer$_
, sodass wir aus einem Pseudoternär basierend auf diesem Muster auswählen.Zur weiteren Verdeutlichung sind hier die ersten Begriffe in jedem Abschnitt:
Also haben wir jetzt festgelegt
$x
, dass es sich um ein Array von Zweigen (dh Zeichenfolgen) handelt. Außerhalb der Schleife bauen wir nun unseren Baum "oben" mit der entsprechenden Anzahl von Feldern auf$y
, zeigen dann unsere Zweige$x
an und dann den Baum "unten" mit dem*
. Jedes dieser Elemente verbleibt in der Pipeline und die Ausgabe erfolgt implizit mit einem Zeilenumbruch zwischen den Elementen.quelle
JavaScript (ES6),
150 bis147 ByteCode-Snippet anzeigen
quelle
Canvas , 28 Bytes
Probieren Sie es hier aus!
Ein Port meiner SOGL-Antwort, der ein Port von Neils Charcoal-Antwort ist.
quelle
Mein Versuch bei JS ESGoogoltriplex.
Code-Snippet anzeigen
quelle