Einführung
Dies ist eine ziemlich unkomplizierte. Wir werden eine Schlange in ASCII zeichnen. Dies wurde von dem alten Schlangenspiel inspiriert, bei dem man die Früchte einsammeln und kontinuierlich wachsen muss.
Definition
Zeichnen Sie bei einer positiven ganzen Zahl N, die die Länge der Schlange angibt, eine Schlange so, dass sie einen Körper von n sowie einen Kopf und einen Schwanz hat.
Teile:
- Kopf:
<, >, ^, v
- Schwanz:
@
- Vertikale:
|
- horizontal:
-
Alle Ecken sollten mit einem \
bzw. zufrieden sein /
. Es sei denn, der Kopf endet an einer Ecke. In diesem Fall hat der Kopf <, >, ^, v
Vorrang in der Richtung, in der sich die Schlange kräuselt. dh für das Beispiel mit der Länge 1 wird es gegen den Uhrzeigersinn gedreht und so wird der Kopf auf diese Weise gedreht. Für eine Lösung im Uhrzeigersinn wäre es rechts >
.
Die Schlange muss in der Mitte mit ihrem Schwanz beginnen, kann aber in jede Richtung nach außen gehen, die Sie entweder im oder gegen den Uhrzeigersinn wählen. Es muss sich auch eng um sich selbst wickeln, da es sich kreisförmig nach außen ausdehnt.
Beispiel
/--\
|/\|
||@|
|\-/
\--->
Wo @
ist der Schwanz und Startposition. Wie oben zu sehen, beginnt der Schwanz in der Mitte und steigt nach links gegen den Uhrzeigersinn nach außen.
Hier ist die Länge 19
plus ein Schwanz und ein Kopf.
Als weiteres Beispiel ist hier die Länge 1
:
<\
@
Gewinnen
Dies ist Codegolf, daher gewinnt die Antwort mit der geringsten Anzahl von Bytes mit der Zeit, um als Bindungsunterbrecher verwendet zu werden.
Habe Spaß!
@---->
. Sie beabsichtigen wahrscheinlich strengere Bedingungen bezüglich der Schlangenform. Machen Sie auch deutlich, wie viel Leerzeichen zulässig sind oder nicht@
ist die Mitte (eventuell Leerzeichen hinzufügen, um es so zu machen), "rechts" als Richtung deklarieren und nur mit dem Kopf nach unten zeigen und dies im Uhrzeigersinn deklarieren. Ihre Begriffe mögen Ihnen klar erscheinen, aber sie sind tatsächlich mehrdeutig. Mir ist klar, dass Sie wahrscheinlich eine so eng wie möglich zusammengerollte Schlange meinen, aber das sollten SieAntworten:
MATL ,
8583 BytesUnd ich dachte, ein
spiral
eingebauter Code würde zu einem kurzen Code führen ...Probieren Sie es online!
Erläuterung
Sei N bezeichnen die Eingabe. Wir werden einen Längenvektor erzeugen
ceil(sqrt(N+2))^2
, dh das kleinste perfekte Quadrat, das gleich oder größer als N +2 ist. Dieser Vektor wird mit numerischen Werten gefüllt, zu einer Spirale gerollt (daher muss seine Länge ein perfektes Quadrat sein), und dann werden die numerischen Werte durch Zeichen ersetzt.Lassen n jeden Schritt von 1 bezeichnen in der Mitte der Spirale beginnt. Die Schritte, in denen sich die Schlange dreht, sind durch n 2 +1 (das heißt: 2, 5, 10, ...) für
\
Symbole und n 2 + n +1 (das heißt: 3, 7, 13, ...) gegeben. für/
. Die Schritte zwischen a\
und a/
sollten sein-
, und die zwischen a/
und a\
sollten sein|
.Der Vektor wird so erstellt, dass er
1
an den Wendepunkten (2,3,5,7,10,13 ...) und0
im Rest enthält. Die Parität der kumulativen Summe gibt an, ob jeder Eintrag ein-
oder ein sein soll|
. Addiert man 1 zu diesem Ergebnis, erhält man einen Vektor, der1
(für|
) oder2
(für-
) enthält. Aber das macht die Wendepunkte selbst zu1
oder2
zu. Die Wendepunkte, deren Positionen wir kennen, werden also überschrieben: Positionen n 2 +1 werden mit3
und Positionen n 2 + n +1 werden mit gefüllt4
. Der Schwanz und der Kopf sind ebenfalls Sonderfälle: Das erste Element des Vektors (Schwanz) wird auf +2 (Kopf) gesetzt5
und das Element mit dem Index N gesetzt6
. Schließlich werden Elemente mit Indizes über N +2 auf gesetzt0
.Am Beispiel der Eingabe N = 19 haben wir nun einen Vektor mit der Länge 25:
Wir müssen diesen Vektor in eine Spirale rollen. Dazu verwenden wir eine eingebaute Funktion, die eine Spiralmatrix erzeugt, gefolgt von einer Reflexion und einer Transposition, um Folgendes zu erzeugen:
Indizieren des Vektors mit der Matrix ergibt
wo
0
entspricht Raum1
entspricht|
,2
um-
,3
um\
,4
auf/
,5
zu@
, und6
auf den Kopf.Um zu wissen , welche die vier Zeichen
^
,<
,v
, oder>
der Kopf haben sollte, verwenden wir die kumulative Summe von Wendepunkten , dass wir vorher berechnet. Insbesondere gibt der vorletzte Wert dieser kumulativen Summe (dh der N + 1-te Wert) Modulo 4 an, welches Zeichen für den Kopf verwendet werden soll. Wir nehmen den vorletzten Wert der kumulativen Summe, nicht das letzte Mal, wegen der Anforderung „ wenn die Kopfenden an einer Ecke der Kopf<
,>
,^
,v
Priorität in Richtung nimmt die Schlange zusammengerollt“. Für das Beispiel N = 19 ist der Kopf>
.Jetzt können wir eine Zeichenfolge , die alle die Schlange Zeichen, einschließlich der entsprechenden Zeichen für den Kopf an der sechsten Position bauen:
'|-\/@> '
. Wir indizieren diese Zeichenfolge dann mit der obigen Matrix (die Indizierung basiert auf 1 und ist modular, damit der Platz an letzter Stelle bleibt), was ergibtquelle
Python 2,
250233191 Bytesrepl.it
Zeichnen Sie die Schlange, indem Sie die gesamte Schlange um 90 ° im Uhrzeigersinn drehen und das untere Segment hinzufügen. Auf diese Weise befindet sich die Schlange immer im Gegenuhrzeigersinn.
Das neue Segment beginnt immer mit
\
und hat-
als Körper selbst für Seiten und/
-
für ungeradee Seiten. Die Segmente Größen (ohne Ecken) sind0
,1
,1
,2
,2
,3
... , die istfloor(side/2)
.Wenn das Segment das letzte ist, werden die überschüssigen Zeichen entfernt, der Kopf hinzugefügt und Leerzeichen hinzugefügt.
quelle
'\/'[m]
,'-|'[m]
und'>v'[m]
print
und entfernen''.join
JavaScript (ES6), 193
201 203 215 220 224Bearbeiten gespeichert 4 thx @Arnauld Bytes
EDIT2 geändert Logik, nicht die aktuellen Schritten für x und y zu speichern, nur um sie von der aktuellen Richtung erhalten
Edit3 ein paar Bytes gespeichert zu haben, habe ich beschlossen , sie für eine bessere Verwaltung des leeren Raum zu verwenden
Edit4 8 Bytes gespart, die nicht genau den Beispielen zur Kopfrichtung folgen - wie andere Antworten
Die aktuelle Version funktioniert mit Chrome, Firefox und MS Edge
Diese Antwort gibt einige nachgestellte und führende Leerzeichen (und Leerzeilen).Etwas weniger golfen
quelle
(' ')
mit` `
und('@')
durch`@`
[ Array[1], Array[1] ]
, währendArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 Byte
ES6-Version für einfache Tests:
quelle
Perl,
111 -110 BytesBeinhaltet +1 für
-p
Gib die Größe auf STDIN an
snake.pl
:quelle
Batch, 563 Bytes
Erläuterung: Sonderfälle 1 wie der Rest des Codes erfordern eine Schlangenbreite von mindestens zwei. Berechnet als Nächstes das größte Viertelquadrat (entweder ein genaues Quadrat oder ein Rechteck 1, das breiter als hoch ist), dessen Fläche kleiner als die Länge der Schlange ist. Die Schlange wird in dieses Rechteck gewickelt, beginnend in der unteren linken Ecke und endend mit dem Schwanz in der Mitte, und die verbleibende Länge wird unter dem Boden des Rechtecks verlaufen. Das Rechteck wird tatsächlich durch einfaches Ersetzen von Zeichenfolgen generiert. Die meiste Zeit wird jede Linie aus der vorherigen Linie erzeugt, indem die Diagonalen um einen Schritt verschoben werden. Natürlich muss auch der Schwanz behandelt werden, und es gibt leichte Unterschiede, je nachdem, ob die Höhe des Rechtecks gerade oder ungerade ist.
quelle
Python 2.7, A WHOPPING 1230 Bytes
Ich bin neu im Python- und Codegolf, aber ich hatte das Gefühl, ich musste meine eigene Frage beantworten und mich schämen. Viel Spaß beim Arbeiten!
https://repl.it/Dpoy
quelle