Geben Sie bei einer Ganzzahl ein umgedrehtes Zelt aus.
Die Eingabe bestimmt sowohl die Größe des Zeltes (absoluter Wert) als auch, ob sich der Eingang auf der linken Seite (negative Zahlen) oder auf der rechten Seite (positive Zahlen) befindet.
If input = -1:
____
\/_/
If input = -2:
________
\ / /
\/___/
If input = -3:
____________
\ / /
\ / /
\/_____/
If input = 1:
____
\_\/
If input = 2:
________
\ \ /
\___\/
If input = 3:
____________
\ \ /
\ \ /
\_____\/
et cetera
Beachten Sie, dass die Oberseite des Zeltes (dh die letzte Zeile) 2 * abs(input) - 1
Unterstriche aufweist.
Es darf keine führenden Leerzeichen geben, sodass die erste Zeile direkt mit einem Unterstrich beginnt.
Angenommen, die Eingabe wird niemals sein 0
.
Ihr Code sollte so kurz wie möglich sein.
Diese Herausforderung basiert auf einer Chat-Mini-Herausforderung von Helka Homba , die unter den Bedingungen der Calvin Hobbies Public License für echte Herausforderungen verwendet werden darf .
3
?Antworten:
MATL ,
55535251 BytesProbieren Sie es online!
Erläuterung
N
Bezeichnen wir die Eingabe. Der Code läuft in drei Schritten ab.Zunächst wird die erste Zeile mit
4*N
Unterstrichen als Zeichenfolge erstellt und angezeigt (wodurch sie aus dem Stapel entfernt wird).Zweitens wird der "Rahmen" des Zeltes mit den beiden Arten von Schrägstrichen gebaut. Dazu wird ein numerisches 2D-Array erstellt, das die beiden Arten von Schrägstrichen und für den Raum enthält
1
und diesen2
entspricht0
.Dies geschieht durch Verketten von vier Matrizen:
abs (N)
;2
in der Antidiagonale enthält;Die vertikale Verkettung dieser vier Matrizen ergibt am
N=3
Beispiel der folgenden4*N × N
Matrix:(der transponiert wie das Zelt aussieht).
Wir kümmern uns nun um das Vorzeichen der Eingabe. Wenn es positiv ist, transponieren wir einfach die obige Matrix und den Index in den String
'\/ '
. Die Indizierung basiert auf 1 und ist modular. Sie1
wird'\'
,2
wird'/'
und0
wird zur' '
Erzeugung des 2D-Zeichen-ArraysWenn andererseits die Eingabe negativ ist, wird die
4*N × N
Matrix vertikal umgedreht und arithmetisch negiert , wodurch erzeugt wirdIndex
-1
bezieht sich nun auf'/'
und-2
auf'\'
. Das heißt, die beiden Arten von Schrägstrichen wurden nach Bedarf vertauscht. Durch erneutes Transponieren und Indizieren in den String'\/ '
erhält man also das umgekehrte Zelt:Drittens müssen Unterstriche in einen Teil der letzten Zeile des 2D-Zeichen-Arrays eingefügt werden. Die horizontale Position dieser Linie hängt vom Vorzeichen der Eingabe und ihrer Länge ab
abs(N)
.Sobald die entsprechenden Leerzeichen durch Unterstriche ersetzt wurden, wird das Ergebnis implizit unterhalb der ersten Zeile von Unterstrichen angezeigt, die bereits im ersten Schritt angezeigt wurde.
quelle
Javascript (ES6), 139 Byte
Baut das Zelt rekursiv auf:
Ungolfed und kommentiert
Beispiele
quelle
Python 2,
143 141 139 138137 Bytes-2 Byte dank @ Sp3000 (keine Notwendigkeit, exec in Python 2 in Klammern zu setzen)
-1 Byte dank @ Sp3000 (Verwendung
cmp
)Teste es bei ideone
Zuerst sehen wir, ob
n
negativ ist und machen,d
+1
ob es ist und-1
wenn nicht.Dann wählen wir die beiden Schrägstriche aus
a
undb
verwenden sied
so, dassa='\', b='/'
wannn
positiv unda='/', b='\'
wannn
negativ ist.Als nächstes legen wir fest,
s=abs(n)
was durch erreicht werden kanns=n*d
.Dann berechnen wir die Anzahl von
_
oben (unten im Bild), die auch die Anzahl vonan der Seite des Zeltes ist
x=2*s-1
.Dann berechnen wir die Anzahl von
_
an der Basis des Zeltes (oben im Bild) und speichern sie so, wiey=4*s
sie in der Schleife verwendet wird, um den Rest des Zeltes zu erstellen.Nun drucken wir den Zeltboden mit
print'_'*y
.Dann drucken wir den Rest des Zeltes aus, indem wir print-
s
Anweisungen mit einer Schleifenvariablen ausführeni
,0
die initialisiert wird und1
für jede print-Anweisung um inkrementiert wird .Der Rest des Zeltes hat dann
y-3-x-i-i
Räume in der Tür undx
Räume in der Karosserie, bis die Oberseite erreicht ist, wenns-i>1
False ausgewertet wird und das_
von auswählt'_ '
.Bei einem positiven Zelt mit linker Tür ist das gesamte Zelt, mit Ausnahme der führenden Felder, von hinten nach vorne, so dass es umgekehrt ist, während das positive Zelt mit „rechter Tür“ nicht vorhanden ist
[::d]
.quelle
cmp(0,0)
kehrt leider zurück0
Python 2, 121 Bytes
Nur eine Menge Zeichenfolgenformatierung.
quelle
C #
215214 BytesBei vorheriger Verwendung besteht die Möglichkeit, einige Bytes zu speichern
using s=string;
.Das wären 15 (using) + 184 (method) = 199 Bytes.
quelle
var
in der for-Schleife auf ändernstring
, können Sie das entfernen Sekundevar
(einschließlich Speicherplatz zum Speichern des Bytes). Sovar f
wirdstring f
und;var p=
wird,p=
.TSQL, 195 Bytes
Golf gespielt:
Ungolfed:
Geige
quelle
V , 66 Bytes
Probieren Sie es online!
Dies ist eine ziemlich naive Herangehensweise, daher werde ich versuchen, sie später noch weiter zu vertiefen. Diese Lösung enthält nicht druckbare Zeichen. Hier ist ein Hexdump:
quelle
05AB1E , 52 Bytes
Erläuterung
Probieren Sie es online!
quelle
PowerShell v2 +,
217205190187184 BytesÜbernimmt die Eingabe
$b
als Ganzzahl. Wenn dies$b
negativ ist, müssen Sie es explizit mit Parens umgeben, um es entsprechend umzuwandeln (siehe Beispiele). Andernfalls wird PowerShell es für einen String halten.Unabhängig davon, in welche Richtung das Zelt zeigt, ist die erste Zeile dieselbe, eine Reihe von Unterstrichen. eigentlich genau
4*abs(input)
viele von ihnen. Diese Nummer wird auch$a
zur späteren Verwendung gespeichert . Zusätzlich wenden wir uns, nachdem wir den absoluten Wert von$b
gespeichert haben$a
, zu$b
zu einem Booleschen für sein Vorzeichen und wählen unsere in$y
und gespeicherten Schrägstriche aus$z
.In der nächsten Zeile wird die Ausgabe erstellt und formuliert, und sie ist doozy. Lassen Sie uns sie also aufschlüsseln.
Wir indizieren im Wesentlichen in ein Array aus zwei Elementen
(big long calculations saved into $x)
oder$x
basierend auf$b
.Die Berechnungen beziehen sich auf den Aufbau des Zeltkörpers. Wir fahren ab
1..$a|%{...}
. Bei jeder Iteration konstruieren wir eine Linie des Zeltkörpers. Wir beginnen mit einer Anzahl von Leerzeichen, die der Zeile # entsprechen, in der wir uns befinden-1
, damit sie linksbündig ausgerichtet ist. Das wird$w
für später gespeichert und mit dem entsprechenden Schrägstrich ($ z, basierend auf$b
), dann der Türrahmen-Anzahl von Leerzeichen, dann dem anderen Schrägstrich$y
, dann entweder Unterstrichen oder Leerzeichen, je nachdem, ob wir uns in der unteren Zeile befinden oder nicht, verknüpft. dann ein weiterer Schrägstrich$y
und schließlich die entsprechende Anzahl von nachgestellten Leerzeichen ($w
), um eine rechteckige Zeichenfolge zu erstellen. Das resultierende Array von Zeichenfolgen wird in gespeichert$x
.Wenn die linke Hälfte des Feldes ausgewählt wird (dh,
$b
ist ,False
da der Eingang positiv war), dann müssen wir eine Schleife durch$x
und jede Position rückwärts - dies ist , wo die hinteren Plätze ins Spiel kommen; Dies ermöglicht es uns, die Linien einfach umzukehren, anstatt Entfernungen neu zu berechnen.Wenn
$b
jaTrue
, dann die rechte Hälfte des Arrays$x
wird stattdessen ausgewählt.In beiden Fällen enthält die Pipeline jetzt ein Array von Zeichenfolgen. Implizite Ausgabe über
Write-Output
erfolgt bei Programmabschluss mit Standard-Zeilenumbruch zwischen Elementen.Beispiele
quelle
Haskell,
187184183 BytesIch bin der Meinung, dass dies kein großartiges Ergebnis für Haskell ist, daher sind Verbesserungsvorschläge willkommen.
Ungolfed
quelle
main
so hinzufügen , dass esstdin
als Eingabe akzeptiert wird ?:
Zeichen zu verwenden. dh wechseln"\\" ++ entrance...
zu'\\':entrance
.|1>0=(2*(n-i-1))%' '
zu|q<-2*(n-i-1)=q%' '
.C
240207193 BytesDieses Mal habe ich die Funktion g (...) optimiert, um eine einzelne for-Schleife zu verwenden.
Dieses Mal ist Makro X als Funktion g (...) besser dran, und da y und z Parameter in einem neuen Bereich sind, kann ich sie im Bereich von g einfach dekrementieren.
Testen Sie mit dieser Hauptfunktion; Dies sollte deutlich kleiner ausfallen.
quelle
C #
241231 BytesDank @Kevin Cruijssen 10 Bytes gespart
Alte Version:
Ursprünglich hatte das
new string(...)
alsFunc<char,int,string>
aber ein Byte mit dem Konstruktor gespeichert. Ich wünschteint
->char
war implizitIch bin mir ziemlich sicher, dass meine Mathematik auch irgendwie repariert werden kann, aber ich kann es nicht sehen
quelle
int
bevorz=
durch sie die for-Schleife ergänzt:int j=0,z
. Und da Siestring
ziemlich viel verwenden, können Sie es mit Aliasusing s=System.String;
So wird die Summe:using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
( 231 Bytes )Swift 2.2 421 Bytes
Nun ... Dies war ein Versuch.
Golf gespielt:
UnGolfed:
quelle
PHP, 143 Bytes
renn mit
php -r '<code>' <parameter>
Nervenzusammenbruch
quelle
Batch, 289 Bytes
Übernimmt die Eingabe für STDIN. Beginnt mit der Erstellung einer Folge von
2*(abs(n)-1)
Unterstrichen. Dies wird dann mit weiteren 4 Unterstrichen für den Zeltboden wiederholt. Der Rest des Zeltes besteht dann aus einem Einzug (der in jeder Zeile um 1 erhöht wird), a\
, der Mitte des Zeltes und a/
. Die Mitte des Zeltes beginnt als2*(abs(n)-1)
Leerzeichen plus eines\
oder/
plus eines Leerzeichens (das ich in Markdown nicht darstellen kann) plus eines weiteren2*(abs(n)-1)
Leerzeichens. Ich verwende die Unterstreichungszeichenfolge erneut und ändere sie der Einfachheit halber in Leerzeichen, ändere die Leerzeichen dann jedoch wieder in Unterstriche für die letzte Zeile. Jede Zeile entfernt zwei Leerzeichen von einer Seite der Mitte des Zeltes, obwohl es etwas golfer ist, die beiden Leerzeichen zuerst an den Anfang der Zeichenfolge zu verschieben, falls erforderlich.quelle
Canvas , 25 Bytes
Probieren Sie es hier aus!
quelle