Sehr stark von dieser Herausforderung inspiriert. Code Golf: Ihre eigene Haustier-ASCII-Schlange - Ich dachte, eine horizontale Ausrichtung würde eine zusätzliche Komplexitätsebene hinzufügen.
Ein Beispiel für eine horizontale Schlange:
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Und die Regeln sind:
- Es werden genau 5 Zeichenzeilen gedruckt
- Jede Zeile ist genau 30 Zeichen lang und besteht aus einer Kombination von Leerzeichen und dem Zeichen, mit dem Sie Ihre Schlange zeichnen möchten
- Ihre Schlange beginnt in Zeile 3
- Die nächste Zeile, die zum Zeichnen Ihrer Schlange verwendet werden soll, muss zufällig aus Ihrer aktuellen Zeile ausgewählt werden, eine Zeile darüber (falls Sie noch nicht in Zeile 1 sind) oder eine Zeile darunter (falls Sie noch nicht in Zeile 5 sind).
- Diese Entscheidungen müssen gleich gewichtet werden. Wenn Sie also in Zeile 1 sind, haben Sie eine 50% ige Chance, in Zeile 1 zu bleiben, und eine 50% ige Chance, in Zeile 2 zu wechseln. Wenn Sie in Zeile 2 sind, haben Sie eine 33% ige Chance, in Zeile 1 zu wechseln, a 33% Chance, in Zeile 2 zu bleiben oder 33% Chance, in Zeile 3 zu wechseln
- Ihre Schlange muss nicht jede einzelne Zeile besuchen.
Antworten:
JavaScript (ES6), 98 Byte
7 Bytes gespart dank @KevinCruijssen
Gibt ein Array mit 5 Zeichenfolgen zurück.
Probieren Sie es online!
Kommentiert
quelle
d
und((y%4?3:2)|0)-(y>0)
für -6 Bytes verwenden. Probieren Sie es online aus.1
innew Random(...)
ist standardmäßig natürlich implizit .. Online ausprobieren.!!y
Anstatt(y>0)
2 weitere Bytes zu speichern.)Kohle , 28 Bytes
Probieren Sie es online!Link ist eine ausführliche Version des Codes. Erläuterung:
Drucken Sie etwas Abstand, um 5 Zeilen Ausgabe zu erzwingen.
30 mal wiederholen.
Drucken Sie eine Null (und bewegen Sie sich horizontal).
Wenn die Y-Koordinate 2 ist, bewegen Sie sich zufällig um 0 oder 1 nach oben.
Wenn es -2 ist, gehe nach dem Zufallsprinzip um 0 oder 1 nach unten.
Bewegen Sie sich ansonsten nach dem Zufallsprinzip um -1, 0 oder 1 nach unten.
quelle
Perl, 68 Bytes
Das fühlt sich überhaupt nicht optimal an.
quelle
Gelee , 24 Bytes
Probieren Sie es online!
Erläuterung
quelle
R , 138 Bytes
Probieren Sie es online!
Handlich von Plannapus outgolfed
quelle
Python 3, 144 Bytes
@Ruts, @Turksarama und @mypetlion waren sehr hilfreich bei der Reduzierung von Bytes
Werde versuchen, dies zu verbessern. Eine lustige Herausforderung!
quelle
l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else l
zul+=random.randint(~-(l<1),l<4)
, um 31 Byte zu speichern.m=[[' 'for x in R(w)]for y in R(h)]
zum=[list(' '*w)for y in R(h)]
, um 7 Byte zu speichern.boolean
eine Unterklasse vonint
. SoFalse
kann anstelle von verwendet0
undTrue
ersetzt werden1
. Das~
ist ein unärer Operator für bitweisenot
und der-
Operator kippt das Vorzeichen (multiplizieren mit-1
). So~-(False)
bewertet zu-1
und~-(True)
bewertet zu 0.m[2][0]=0
ist weg) und 2 Bytes in der for-Schleife (for i in R(1,30):
wirdfor i in R(30):
). Sie müssen auch l neu berechnen, nachdem Sie die 0 eingestellt haben. Dies sollte Sie auf 144 Bytes bringen.R ,
120114 BytesDanke an @ Giuseppe für die zusätzlichen 6 Bytes!
Verwendet eine Wahrscheinlichkeitstabelle wie folgt:
wobei jede Spalte einem Fall entspricht, dh Spalte 1 wird ausgewählt, wenn sich die Schlange in Zeile 1 befindet, wobei die Wahrscheinlichkeiten 0, 1/2 und 1/2 für die Auswahl von -1 [nach unten gehen], 0 [still bleiben] und 1 [angegeben werden. go up] (
sample
die Wahrscheinlichkeiten werden automatisch auf 1 normiert), Spalte 2 für Zeile 2 gibt Wahrscheinlichkeiten 1/3, 1/3 und 1/3 usw. an.Probieren Sie es online!
quelle
SOGL V0.12 ,
2221 BytesProbieren Sie es hier aus!
Erläuterung:
quelle
Japt,
3129 BytesGibt ein Array von Zeilen zurück.
Probier es aus
quelle
Japt , 26 Bytes
Online testen!
quelle
Python 2 , 127 Bytes
Probieren Sie es online!
quelle
Oktave mit Statistikpaket, 99 Bytes
Es funktioniert auch in MATLAB mit der Statistics Toolbox.
Probieren Sie es online!
quelle
Japt , 28 Bytes
9 Bytes gespart dank ETHproductions
Probieren Sie es online!
quelle
SmileBASIC,
10710510389 BytesDiese Antwort ist aufgrund der (wörtlichen) Randfälle interessanter als die vertikale.
64 Bytes ohne Leerzeichen:
Ich habe auch ein paar Variationen von Zeile 2 mit der gleichen Länge gefunden:
Die Ganzzahldivision von Y / 3 wird verwendet, um zu überprüfen, ob Y außerhalb des gültigen Bereichs liegt, und um das Vorzeichen zu erhalten.
quelle
Java 8,
177170 Bytes-7 Bytes dank @ OlivierGrégoire .
Erläuterung:
Probieren Sie es online aus.
quelle
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
um ein paar Bytes zu sparen.C (GCC) ,
134130 BytesProbieren Sie es online!
quelle
Python 3 , 123 Bytes
Probieren Sie es online!
Generieren Sie ein Array von Ganzzahlen und konvertieren Sie es dann in jede Zeile.
Python 2 , 120 Bytes
Probieren Sie es online!
Für Py2 können redundante Parens für
exec
undprint
entfernt werden, die Syntax in der 2. Zeile ist jedoch ungültig.Outgolfing sowohl Py2 Einreichung von Rod und Py3 Einreichung von Linemade .
quelle
Ruby ,
9877 BytesProbieren Sie es online!
Ein Lambda, das eine Reihe von Zeichenfolgen zurückgibt.
Mein erster Impuls war, die Spalten zu generieren und zu transponieren, aber es ist viel einfacher, diesen Schritt einfach zu vermeiden.
Ich hätte gern initialisieren
a
mit[" "*30]*5
, aber die flache Kopie der Saiten machen würde, was zu einer sehr fett, nicht-schlüpfrigen Schlange.Ich hätte eine Konstante wieD
als Inkrement verwenden können (für die gleiche Byteanzahl), aber Ruby hätte sich jedes Mal beschwert, wenn ich sie zugewiesen hätte. Ich habe beschlossen, die Lesbarkeit zu verringern, indem ichi
Mid-Loop wieder verwende, anstatt eine Reihe von Debug-Warnungen zu ignorieren.Ich hätte auch gerne ein paar Bytes mit gespartloop{x+=rand(3)-1;(0..4)===x&&break}
, aber das hätte zu einer Verzerrung der Kanten geführt: 1/3 Chance, nach innen zurückzukehren, 1/3 Chance, zu bleiben, und 1/3 Chance, die Grenzen zu überschreiten eine Weile, bevor irgendwann zufällig wieder hineingelaufen wird (das heißt "bleiben").-20 Bytes: Verwenden Sie Ruby's
Integer#[]
, um winzige Bedingungen zu erstellen und für alle 5 Positionen die richtige Bewegungsgewichtung sicherzustellen. Dies ersetzt ein Loop-Break-Muster (mit einer Wahrscheinlichkeit ungleich Null, dass es nicht zum Stillstand kommt) und sorgt für enorme Einsparungen. Danke, Eric Duminil !-1 Byte: Initialisieren
a
mit(0..4).map
statt5.times
, nochmals vielen Dank an Eric Duminil .quelle
loop
. Sie können das Inkrement mitrand(2+14[x])-30[x]
oder berechnenrand -(30[x])..15[x]
. Es gibt wahrscheinlich eine kürzere Version. Trotzdem sind -20 Bytes nicht schlecht! Probieren Sie es online!x,a=2,(0..4).map{" "*30}
. Probieren Sie es online!30[x]
ist ein toller Trick! Vielen Dank!Perl 6 , 85 Bytes
Probieren Sie es online!
Der Ausdruck in langen Klammern ist eine Lazy-Sequenz, die aus dem Anfangselement
(' ', ' ', 0, ' ', ' ')
, dem ersten vertikalen Streifen der Ausgabe, generiert wird . Jeder nachfolgende Streifen / jede nachfolgende Liste wird aus dem vorhergehenden erzeugt, indem seinerotate
Methode aufgerufen wird, wobei der Versatz zufällig aus einer Menge ausgewählt wird, die Folgendes enthält0
:1
(wenn das erste Element ungleich Null ist) und-1
(wenn das fünfte Element ungleich Null ist).Die Matrix horizontaler Streifen wird mit dem
[Z]
Operator transponiert und in eine Liste vertikaler Streifen umgewandelt, von denen jederjoin
in eine einzelne Zeichenfolge zerlegt und mit ausgegeben wirdsay
.quelle
Scala, 207 Bytes
Probe:
entgolfet:
Meine einzigartige Erfindung - nun, ich habe die anderen Lösungen bisher noch nicht gelesen - ist die Erzeugung eines Zufalls (6), der implizit aus zwei Zufällen (2 * 3) besteht. Wenn ich mich nicht an der Grenze befinde, benutze ich die Werte von r / 2 (0,1,2) und → (-1,0,1), um nach oben oder unten zu gehen. Wenn ich an der Grenze bin, kann ich den teuren Charakteranruf eines anderen Zufalls vermeiden und einfach das Modulo (2) nehmen, um zu entscheiden, ob ich bleiben oder gehen soll.
Schauen wir uns die anderen Lösungen an. :)
quelle
java
?try it
Link geklickt ? Kevin Cruijssen enthielt kein Boilerplate, das zum Kompilieren dieses Codes oder zum Ausführen in JShell erforderlich war, aber ich denke, das entspricht den Richtlinien - es könnte eine Metadiskussion geben. Wenn Sie möchten, können Sie versuchen, diesen Code zu reduzieren, indem Sie auch ein zweidimensionales Array verwenden. Eine zweite Idee ist, den Gleitcode am Ende zu reduzieren. Der Druck ist von Kevin versteckt. - Ja, Array gibt eine Verbesserung um 8.Perl,
83101 BytesNeu: Ohne Wahrscheinlichkeitsfrage an den Grenzen:
Ungolfed:
quelle
PowerShell , 133 Byte
Probieren Sie es online!
Konstruiert ein 2D-Array mit 30 Feldern Breite und 5 Linien Höhe. (NB - wenn jemand eine effektivere Methode zur Initialisierung dieses Arrays finden kann, werde ich Sie für immer <3.) Setzt die Hilfsvariable
$l
auf2
(dies wird für die Zeile verwendet, in der sich das vorherige Schlangensegment befand). Dann geht es weiter von0
bis29
.Bei jeder Iteration setzen wir unser Schlangenelement auf
0
. Dann indizieren wir in ein kompliziertes ArrayGet-Random
, das auswählt, ob wir nach oben oder unten gehen oder gleich bleiben. Das ist wieder in hinzugefügt$l
.Schließlich durchlaufen wir die fünf Elemente von
$a
und-join
ihre inneren Elemente zu jeweils einer einzelnen Zeichenfolge. Diese fünf ZeichenfolgenWrite-Output
verbleiben in der Pipeline, und das Implizite gibt uns kostenlose Zeilenumbrüche.quelle
Clojure, 123 Bytes
Hier kommen die Eltern:
Ungolfed-Version:
Erstellt eine Liste der verschiedenen Höhen des Schlangenkörpers und iteriert dann von 0 bis 4. Immer wenn eine Höhe mit der aktuellen Zeile übereinstimmt, wird eine 0 ausgegeben, andernfalls ein Leerzeichen. Das Übersteigen der Höhen kostet wirklich Bytes. Auch das Erkennen, wann eine neue Zeile in Ordnung ist, ist byteintensiver, als es sein sollte. Man könnte leicht eine einzelne schreiben
doseq
und aus den x und y ein kartesisches Produkt machen, aber dann weiß man nicht, wann man eine neue Zeile drucken soll.quelle
Python3 + numpy,
137132 BytesNicht die kürzeste Python-Einreichung, nicht die längste und definitiv nicht die schnellste.
Mit
numpy
dem Befehl diff von update wurden 5 Bytes gespart, um zu testen, ob die Schlange ein gültiges Muster ist, und um die Differenz manuell mit zu berechnenj[1:]-j[:-1]
.quelle
C (gcc),
80767271 BytesProbieren Sie es online!
quelle
f(r)
stattr;f()
R , 95 Bytes
Die nächste Zeile
x
wird immer aus Zeilen ausgewählt, die nicht mehr als 1 von der aktuellen Zeile entfernt sind (l[abs(x-l)<2]
). Die Verwendungreplicate
anstelle einesfor
Zyklus spart einige Bytes, die für die Matrixinitialisierung und -manipulation benötigt werden, und erfordert die Verwendung des<<-
Operators bei der Zuweisung zur globalen Variablenx
.Probieren Sie es online!
quelle
05AB1E , 25 Bytes
Probieren Sie es online!
Erläuterung
quelle