Code Golf: Ihre eigene horizontale Haustier-ASCII-Schlange

29

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:

  1. Es werden genau 5 Zeichenzeilen gedruckt
  2. 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
  3. Ihre Schlange beginnt in Zeile 3
  4. 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
  5. Ihre Schlange muss nicht jede einzelne Zeile besuchen.
Scoots
quelle
5
Willkommen bei PPCG! Dies ist eine gute erste Herausforderung.
Giuseppe
Müssen wir zur Klarstellung, wenn wir am Rande sind, einheitlich auswählen (auf derselben Linie bleiben) und (zu einer anderen Linie gehen) oder können wir ungleichmäßige Gewichte haben?
Giuseppe
Müssen wir von den Rändern aus die gleiche Linie gleichmäßig aufnehmen?
Giuseppe
2
Mmm ... zumindest die Beschränkung auf 5 Zeilen hindert die Leute daran, die Antworten der anderen mit einer angehängten Transponierung zu stehlen.
Magic Octopus Urn
9
Zählt eine physische Drehung des Monitors um 90 ° als Byte? : D
Eric Duminil

Antworten:

11

JavaScript (ES6), 98 Byte

7 Bytes gespart dank @KevinCruijssen

Gibt ein Array mit 5 Zeichenfolgen zurück.

f=(y=2,a=[...'  0  '])=>a[0][29]?a:f(y+=(Math.random()*(y%4?3:2)|0)-!!y,a.map((v,i)=>v+=i-y&&' '))

Probieren Sie es online!

Kommentiert

f = (                       // given:
  y = 2,                    //   y = current line (0-indexed)
  a = [...'  0  ']          //   a[] = array of 5 lines
) =>                        //
  a[0][29] ?                // if all columns have been processed:
    a                       //   stop recursion and return a[]
  :                         // else:
    f(                      //   do a recursive call with:
      y += (                //     the updated value of y, to which we add -1, 0 or 1:
        Math.random() *     //       pick a random value in [0,1)
        (y % 4 ?            //         if y is neither 0 or 4:
          3                 //             multiply it by 3
        :                   //           else:
          2                 //             multiply it by 2
        ) | 0               //       force an integer value
      ) - !!y,              //     subtract either 0 or 1
      a.map((v, i) =>       //     for each value v at position i in a[]:
        v += i - y && ' '   //       append either '0' if i = y or a space otherwise
      )                     //     end of map()
    )                       //   end of recursive call
Arnauld
quelle
Sie können das löschen dund ((y%4?3:2)|0)-(y>0)für -6 Bytes verwenden. Probieren Sie es online aus.
Kevin Cruijssen
Korrektur: -7 Bytes. Die 1in new Random(...)ist standardmäßig natürlich implizit .. Online ausprobieren.
Kevin Cruijssen
@ KevinCruijssen Danke! ( !!yAnstatt (y>0)2 weitere Bytes zu speichern.)
Arnauld
7

Kohle , 28 Bytes

P|   F³⁰«0≡ⅉ²M‽²↑±²M‽²↓M⊖‽³↓

Probieren Sie es online!Link ist eine ausführliche Version des Codes. Erläuterung:

P|   

Drucken Sie etwas Abstand, um 5 Zeilen Ausgabe zu erzwingen.

F³⁰«

30 mal wiederholen.

0

Drucken Sie eine Null (und bewegen Sie sich horizontal).

≡ⅉ²M‽²↑

Wenn die Y-Koordinate 2 ist, bewegen Sie sich zufällig um 0 oder 1 nach oben.

±²M‽²↓

Wenn es -2 ist, gehe nach dem Zufallsprinzip um 0 oder 1 nach unten.

M⊖‽³↓

Bewegen Sie sich ansonsten nach dem Zufallsprinzip um -1, 0 oder 1 nach unten.

Neil
quelle
6

Perl, 68 Bytes

perl -E '$%=2;s:$:$n++%5-$%&&$":emg,$%-=!!$%+rand!($%%4)-3for($_=$/x4)x30;say'

Das fühlt sich überhaupt nicht optimal an.

Tonne Hospel
quelle
5

Gelee , 24 Bytes

3µ’o1r‘«5¥$Xµ30СṬ€o⁶z⁶Y

Probieren Sie es online!

Erläuterung

3µ'o1r '«5 ¥ $ Xµ30СР€ o⁶z⁶Y || Niladic volles Programm.
                         ||
3 || Ausgehend von 3 ...
 µ µ30 || ... 30 mal ausführen ...
               С || ... und sammle die Ergebnisse in einer Liste.
  'o1r' «5 ¥ $ X || - | Monadische "Helfer" -Funktion.
  'o1 || - | Die aktuelle Ganzzahl, dekrementiert ODER 1.
     r X || - | Nimm einen zufälligen Gegenstand aus dem Bereich von ^ bis ...
      '«5 || - | ... Die Zahl wird erhöht und auf 5 begrenzt (verwendet das Maximum).
         ¥ $ || - | Syntaxelemente. Wird zum Gruppieren von Links verwendet.
                 Ṭ € || Unwuth jeder.
                   o⁶ || Logisches ODER mit einem einzelnen Leerzeichen.
                     z⁶ || Mit Zwischenräumen transponieren.
                       Y || Join von Newlines.
Mr. Xcoder
quelle
5

Python 3, 144 Bytes

@Ruts, @Turksarama und @mypetlion waren sehr hilfreich bei der Reduzierung von Bytes

import random
m=[list(' '*30)for y in range(5)]
l=2
for i in range(1,30):
 m[l][i]=0
 l+=random.randint(~-(l<1),l<4)
for j in m:
  print(*j)

Werde versuchen, dies zu verbessern. Eine lustige Herausforderung!

hausgemacht
quelle
3
Wechseln Sie l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else lzu l+=random.randint(~-(l<1),l<4), um 31 Byte zu speichern.
mypetlion
1
Sie sollten in der Lage sein, viele Leerzeichen und Zeilenumbrüche zu entfernen.
Mr. Xcoder
1
Wechseln Sie m=[[' 'for x in R(w)]for y in R(h)]zu m=[list(' '*w)for y in R(h)], um 7 Byte zu speichern.
Mypetlion
2
In Python booleaneine Unterklasse von int. So Falsekann anstelle von verwendet 0und Trueersetzt werden 1. Das~ ist ein unärer Operator für bitweise notund der -Operator kippt das Vorzeichen (multiplizieren mit -1). So ~-(False)bewertet zu -1und ~-(True)bewertet zu 0.
mypetlion
1
Weisen Sie Ihre anfängliche 0 in Ihrer Schleife zu und setzen Sie l nach der Zuweisung. Dies erspart Ihnen eine ganze Zeile ( m[2][0]=0ist weg) und 2 Bytes in der for-Schleife ( for i in R(1,30):wird for i in R(30):). Sie müssen auch l neu berechnen, nachdem Sie die 0 eingestellt haben. Dies sollte Sie auf 144 Bytes bringen.
Turksarama
4

R , 120 114 Bytes

m=matrix
r=m(" ",30,5)
x=3
for(i in 1:30){r[i,x]=0;x=x+sample(-1:1,1,,m(c(0,rep(1,13)),3)[,x])}
write(r,"",30,,"")

Danke an @ Giuseppe für die zusätzlichen 6 Bytes!

Verwendet eine Wahrscheinlichkeitstabelle wie folgt:

> matrix(c(0,rep(1,13)),3)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    1
[2,]    1    1    1    1    1
[3,]    1    1    1    1    0
Warning message:
In m(c(0, rep(1, 13)), 3) :
  data length [14] is not a sub-multiple or multiple of the number of rows [3]

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] ( sampledie 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!

Plannapus
quelle
114 Bytes
Giuseppe
@ Giuseppe Danke! Es gab in der Tat keinen Grund, es zu
aliasen
3

SOGL V0.12 , 22 21 Bytes

3ā'∑∫⁵╗ž⁴H1ΧGI5χ⁴-ψ+;

Probieren Sie es hier aus!

Erläuterung:

3                      push 3
 ā                     push an empty array - the canvas
  '∑∫                  30 times do, pushing counter            | stack = 3, [], 1
     ⁵                   duplicate the Y coordinate            | stack = 3, [], 1, 3
      ╗ž                 at those coordinates insert "+"       | stack = 3, ["","","+"]
        ⁴                duplicate from below                  | stack = 3, ["","","+"], 3
         H               decrease                              | stack = 3, [...], 2
          1Χ             maximum of that and 1                 | stack = 3, [...], 2
            G            get the item 3rd from top             | stack = [...], 2, 3
             I           increase it                           | stack = [...], 2, 4
              5χ         minimum of that and 5                 | stack = [...], 2, 4
                ⁴-       subtract from the larger a copy of the smaller value | stack = [...], 2, 2
                  ψ      random number from 0 to pop inclusive | stack = [...], 2, 2
                   +     add those                             | stack = [...], 4
                    ;    and get the array back ontop          | stack = 4, ["","","+"]

                         implicitly output the top item - the array, joined on newlines
dzaima
quelle
3

Japt, 31 29 Bytes

Gibt ein Array von Zeilen zurück.

30ÆQùU±[2V=Jõ VVJò]mö i3 gUÃy

Probier es aus

Zottelig
quelle
3

Japt , 26 Bytes

30ÆQùU=U?5õ f_aU <2Ãö :3Ãy

Online testen!

ETHproductions
quelle
2

Python 2 , 127 Bytes

from random import*
s=['']*5
n=3
r=range(5)
exec"for i in r:s[i]+=' 0'[i==n]\nn=choice(r[n and~-n:n+2])\n"*30
print'\n'.join(s)

Probieren Sie es online!

Stange
quelle
2

Oktave mit Statistikpaket, 99 Bytes

Es funktioniert auch in MATLAB mit der Statistics Toolbox.

p=3;for k=1:29
p=[p;p(k)+fix(randsample(setdiff([1 pi 5],p(k)),1)-3)/2];end
disp(['' (p==1:5)'+32])

Probieren Sie es online!

Luis Mendo
quelle
2

SmileBASIC, 107 105 103 89 Bytes

FOR I=0TO 29FOR J=0TO 5LOCATE I,J?" 0"[Y+2==J]NEXT
Y=Y+RND(3)-1D=Y/3>>0Y=Y-D-D*RND(2)NEXT
NEXT

Diese Antwort ist aufgrund der (wörtlichen) Randfälle interessanter als die vertikale.

64 Bytes ohne Leerzeichen:

FOR I=0TO 29LOCATE,Y+2?0;
Y=Y+RND(3)-1D=Y/3>>0Y=Y-D-D*RND(2)NEXT

Ich habe auch ein paar Variationen von Zeile 2 mit der gleichen Länge gefunden:

Y=Y+RND(3)-1D=Y/3>>0Y=Y-D-D*RND(2)NEXT
Y=Y+RND(3)-1D%=Y/3Y=Y-D%-D%*RND(2)NEXT
Y=Y+RND(3)-1Y=Y-Y DIV 3*(RND(2)+1)NEXT
Y=Y+RND(3)-1Y=Y/3OR.Y=Y-D-D*RND(2)NEXT

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.

12Me21
quelle
2

Java 8, 177 170 Bytes

v->{int a[][]=new int[5][30],c=0,r=2;for(;c<30;r+=Math.random()*(r%4>0?3:2)-(r>0?1:0))a[r][c++]=1;String R="";for(int[]y:a){for(int x:y)R+=x<1?" ":"~";R+="\n";}return R;}

-7 Bytes dank @ OlivierGrégoire .

Erläuterung:

Probieren Sie es online aus.

v->{                // Method with empty unused parameter and String return-type
  int a[][]=new int[5][30],
                    //  Integer-matrix of size 5x30
      c=0,          //  Column, starting at index 0
      r=2;          //  Row, starting at index 2
  for(;c<30;        //  Loop `c` 30 times
      r+=Math.random()*(r%4>0?3:2)-(r>0?1:0))
                    //    After every iteration: change `r` with -1,0,1 randomly
                    //     If `r` is 0: random [0;2)-0 → 0,1
                    //     If `r` is 4: random [0;2)-1 → -1,0
                    //     If `r` is 1,2,3: random [0:3)-1 → -1,0,1
    a[r][c++]=1;    //   Fill the cell at indices `r,c` from 0 to 1
  String R="";      //  Result-String, starting empty
  for(int[]y:a){    //  Loop over the rows of the matrix
    for(int x:y)    //   Inner loop over the individual column-cells of the matrix
      R+=x<1?       //    If the value of the cell is still 0:
          " "       //     Append a space
         :          //    Else (it's 1):
          "~";      //     Append the character
    R+="\n";}       //   After every row, Append a new-line
  return R;}        //  Return the result-String
Kevin Cruijssen
quelle
1
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0) um ein paar Bytes zu sparen.
Olivier Grégoire
@Oliviergrégoire ich dachte ich hätte das schon gemacht, aber anscheinend nicht. Vielleicht habe ich es kürzlich in einer anderen Antwort gemacht ..: S Danke!
Kevin Cruijssen
2

C (GCC) , 134 130 Bytes

r,x,y=3,a[31],m;f(){for(x=0;x<31;x++){m?putchar(x==30?10:a[x]-m?32:48):(a[x]=y);r=rand();y+=y==1?r%2:y==5?-r%2:1-r%3;}++m<6&&f();}

Probieren Sie es online!

MaSi
quelle
Willkommen bei PPCG!
Martin Ender
Vielen Dank! Die Verwendung von putchar anstelle von printf spart 4 Bytes.
MaSi
1

Python 3 , 123 Bytes

from random import*
i,*a=2,
exec("a+=i,;i+=randint(-(i>0),i<4);"*30)
for x in range(5):print(''.join(' 0'[x==i]for i in a))

Probieren Sie es online!

Generieren Sie ein Array von Ganzzahlen und konvertieren Sie es dann in jede Zeile.

Python 2 , 120 Bytes

from random import*
i=2;a=[]
exec"a+=i,;i+=randint(-(i>0),i<4);"*30
for x in range(5):print''.join(' 0'[x==i]for i in a)

Probieren Sie es online!

Für Py2 können redundante Parens für execund printentfernt werden, die Syntax in der 2. Zeile ist jedoch ungültig.

Outgolfing sowohl Py2 Einreichung von Rod und Py3 Einreichung von Linemade .

Bubbler
quelle
1

Ruby , 98 77 Bytes

->{a=(0..4).map{" "*30}
x=2
30.times{|i|a[x][i]=?@
x+=rand(3-17[x])-30[x]}
a}

Probieren 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 amit [" "*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 wie Dals 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 ich iMid-Loop wieder verwende, anstatt eine Reihe von Debug-Warnungen zu ignorieren.

Ich hätte auch gerne ein paar Bytes mit gespart loop{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 amit (0..4).mapstatt 5.times, nochmals vielen Dank an Eric Duminil .

->{
  a = (0..4).map{ " " * 30 }      # a is the return array: 5 strings of 30 spaces
  x = 2                           # x is the snake position
  30.times{ |i|                   # For i from 0 to 29
    a[x][i] = ?@                  #   The ith position of the xth row is modified
    x += rand(3 - 17[x]) - 30[x]  #   Using bit logic, add rand(2 or 3) - (0 or 1)
  }
  a                               # Return the array of strings
}
benj2240
quelle
Guter Start. Keine Notwendigkeit für ein Inneres loop. Sie können das Inkrement mit rand(2+14[x])-30[x]oder berechnen rand -(30[x])..15[x]. Es gibt wahrscheinlich eine kürzere Version. Trotzdem sind -20 Bytes nicht schlecht! Probieren Sie es online!
Eric Duminil
1 Byte weniger mit x,a=2,(0..4).map{" "*30}. Probieren Sie es online!
Eric Duminil
1
Wow, 30[x]ist ein toller Trick! Vielen Dank!
benj2240
1

Perl 6 , 85 Bytes

.join.say for [Z] ((' ',' ',0,' ',' '),{.rotate(set(0,+?.[0],-?.[4]).pick)}...*)[^30]

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 seine rotateMethode aufgerufen wird, wobei der Versatz zufällig aus einer Menge ausgewählt wird, die Folgendes enthält 0: 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 jeder joinin eine einzelne Zeichenfolge zerlegt und mit ausgegeben wird say.

Sean
quelle
1

Scala, 207 Bytes

val b=Array.fill(150)('.')
def s(y:Int,x:Int)={val r=Random.nextInt(6)
val z=y+(if(y>3)-r%2
else if(y<1)r%2
else r/2-1)
b(z*30+x)='$'
z}
(3/:(0 to 28))(s(_,_))
b.mkString("").sliding(30,30).foreach(println)

Probe:

...................$$$...$.$$.
.$$$..............$...$.$.$...
$...$$$..$...$$.$$.....$......
.......$$.$.$..$..............
...........$..................

entgolfet:

val buf = List.fill(150)('.').toBuffer
def setRowCol (y:Int, x:Int): Int = {
  val r = Random.nextInt(6)
  val z = y + (
    if (y>3) 
        -(r%2)
    else if (y<1) 
        (r%2)
    else 
        r/2-1
  )
  buf (z * 30 + x) = '$'
  z
}
(3 /: (0 to 28)(setRowCol (_, _))
println 
buf.mkString ("").sliding(30,30).foreach(println)

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. :)

Benutzer unbekannt
quelle
Ja, falsches Beispielbild. Es tut. :)
Benutzer unbekannt
Scala Rocks! oh .. Code Golf .. falscher Anwendungsfall es erscheint .. Wie zum Teufel ist es vorbei geschleift java?
Javadba
@javadba: Hast du auf den try itLink 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.
Benutzer unbekannt
Lassen Sie scala auf den Rückgabetyp int schließen: 4 weitere Zeichen wurden gespeichert.
Benutzer unbekannt
Also geht es jetzt für Java in den Ballpark
Javadba
1

Perl, 83 101 Bytes

perl -E '$l=3;map{map$s[$_-1].=/$l/?0:" ",1..5;$l-=1-int 3*rand;$l=~y/60/51/}1..30;say for@s'

Neu: Ohne Wahrscheinlichkeitsfrage an den Grenzen:

perl -E '$l=3;map{map$s[$_-1].=/$l/?0:" ",1..5;$l=int($l<2?1+2*rand:$l>4?6-2*rand:$l-1+3*rand)}1..30;say for@s'

Ungolfed:

$l=3;                             #start line
map{
  map $s[$_-1].=/$l/?0:" ",1..5;  #0 at current char and line, space elsewhere
  $l-=1-int 3*rand;               #up, down or stay
  $l=int( $l<2 ? 1+2*rand
        : $l>4 ? 6-2*rand
        :        $l-1+3*rand )    #border patrol
}
1..30;                            #position
say for@s                         #output result strings/lines in @s
Kjetil S.
quelle
2
Ihre Grenzpatrouille gibt nicht die richtige Wahrscheinlichkeit von 50%, am Rande zu bleiben.
Ton Hospel
0

PowerShell , 133 Byte

$a=(,' '*30),(,' '*30),(,' '*30),(,' '*30),(,' '*30);$l=2;0..29|%{$a[$l][$_]=0;$l+=0,(1,($x=1,-1),$x,$x,-1)[$l]|Random};$a|%{-join$_}

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 $lauf 2(dies wird für die Zeile verwendet, in der sich das vorherige Schlangensegment befand). Dann geht es weiter von 0bis 29.

Bei jeder Iteration setzen wir unser Schlangenelement auf 0. Dann indizieren wir in ein kompliziertes Array Get-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 $aund -joinihre inneren Elemente zu jeweils einer einzelnen Zeichenfolge. Diese fünf Zeichenfolgen Write-Outputverbleiben in der Pipeline, und das Implizite gibt uns kostenlose Zeilenumbrüche.

AdmBorkBork
quelle
0

Clojure, 123 Bytes

Hier kommen die Eltern:

(let[l(take 30(iterate #(max(min(+(-(rand-int 3)1)%)4)0)3))](doseq[y(range 5)](doseq[x l](print(if(= y x)0" ")))(println)))

Ungolfed-Version:

(let [l (take
       30
       (iterate
        #(max
          (min
           (+ (- (rand-int 3) 1) %)
           4)
          0)
        3))]
(doseq [y (range 5)]
  (doseq [x l]
    (print (if (= y x) 0 " ")))
  (println)))

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 doseqund aus den x und y ein kartesisches Produkt machen, aber dann weiß man nicht, wann man eine neue Zeile drucken soll.

Joshua
quelle
0

Python3 + numpy, 137 132 Bytes

Nicht die kürzeste Python-Einreichung, nicht die längste und definitiv nicht die schnellste.

from pylab import*
j=r_[2,:29]
while any(abs(diff(j))>1):j[1:]=randint(0,5,29)
for i in r_[:5]:print(''.join(' #'[c] for c in j==i))

Mit numpydem 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 berechnen j[1:]-j[:-1].

user2699
quelle
0

C (gcc), 80 76 72 71 Bytes

a[5][30],i,r;f(){for(r=2;i<30;r+=rand()%3-1)a[r=r>4?4:r<0?0:r][i++]=1;}

Probieren Sie es online!

vazt
quelle
Schlagen f(r)stattr;f()
ceilingcat
0

R , 95 Bytes

x=3;l=1:5
write(t(replicate(30,{y=ifelse(x-l,' ',0);x<<-sample(l[abs(x-l)<2],1);y})),'',30,,'')

Die nächste Zeile xwird immer aus Zeilen ausgewählt, die nicht mehr als 1 von der aktuellen Zeile entfernt sind ( l[abs(x-l)<2]). Die Verwendung replicateanstelle eines forZyklus spart einige Bytes, die für die Matrixinitialisierung und -manipulation benötigt werden, und erfordert die Verwendung des <<-Operators bei der Zuweisung zur globalen Variablen x.

Probieren Sie es online!

Robert Hacken
quelle
0

05AB1E , 25 Bytes

Y30F©ð5×0®ǝs<DÌŸ4ÝÃΩ}\)ζ»

Probieren Sie es online!

Erläuterung

Y                           # push the initial value 2
 30F                        # 30 times do
    ©                       # store a copy of the current value in register
     ð5×                    # push 5 spaces: "     "
        0®ǝ                 # insert 0 at the position of the current value
           s<DÌŸ            # push the range [current-1 ... current-1+2]
                4ÝÃ         # keep only numbers in [0 ... 4]
                    Ω       # pick one at random
                     }\     # end loop and discard the final value
                       )ζ   # transpose the list
                         »  # join by newlines
Emigna
quelle