Code Golf: votre propre serpent horizontal ASCII pour animaux de compagnie

29

Très fortement inspiré par ce défi Code Golf: votre propre serpent ASCII pour animaux de compagnie - je pensais que le rendre horizontal ajouterait une couche supplémentaire de complexité.

Un exemple de serpent horizontal:

            0 0               
  0        0 0 000            
00 0     00       000 0      0
    000 0            0 0   00 
       0                000   

Et les règles sont les suivantes:

  1. Exactement 5 lignes de caractères sont imprimées
  2. Chaque ligne comporte exactement 30 caractères, composée d'une combinaison d'espaces et du personnage avec lequel vous choisissez de dessiner votre serpent
  3. Votre serpent commence à la ligne 3
  4. La ligne suivante à utiliser pour dessiner votre serpent doit être choisie au hasard dans votre ligne actuelle, une ligne au-dessus (si vous n'êtes pas déjà sur la ligne 1) ou une ligne en dessous (si vous n'êtes pas déjà sur la ligne 5).
    • Ces choix doivent être également pondérés. Donc, si vous êtes sur la ligne 1, vous avez 50% de chances de rester sur la ligne 1 et 50% de chances de passer à la ligne 2. Si vous êtes sur la ligne 2, vous avez 33% de chances de passer à la ligne 1, un 33% de chances de rester sur la ligne 2 ou 33% de chances de passer à la ligne 3
  5. Votre serpent n'a pas besoin de visiter chaque ligne.
Scoots
la source
5
Bienvenue chez PPCG! C'est un bon premier défi.
Giuseppe
Pour plus de précision, si nous sommes à la limite, devons-nous choisir uniformément (rester sur la même ligne) et (aller sur une ligne différente) ou pouvons-nous avoir des poids non uniformes?
Giuseppe
Et sur les bords, devons-nous ramasser / descendre / même ligne uniformément?
Giuseppe
2
Mmm ... au moins la limite de 5 lignes empêche les gens de voler les réponses de l'autre avec une transposition en annexe.
Urne de poulpe magique
9
La rotation physique du moniteur de 90 ° compte-t-elle comme un octet? : D
Eric Duminil

Réponses:

11

JavaScript (ES6), 98 octets

7 octets enregistrés grâce à @KevinCruijssen

Renvoie un tableau de 5 chaînes.

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&&' '))

Essayez-le en ligne!

Commenté

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
la source
Vous pouvez supprimer le det utiliser ((y%4?3:2)|0)-(y>0)pour -6 octets. Essayez-le en ligne.
Kevin Cruijssen
Correction: -7 octets. Le 1in new Random(...)est implicite par défaut bien sûr .. Essayez-le en ligne.
Kevin Cruijssen
@KevinCruijssen Merci! ( !!yau lieu d' (y>0)enregistrer 2 octets supplémentaires.)
Arnauld
7

Fusain , 28 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

P|   

Imprimez du rembourrage pour forcer 5 lignes de sortie.

F³⁰«

Répétez 30 fois.

0

Imprimez un zéro (et déplacez-vous horizontalement).

≡ⅉ²M‽²↑

Si la coordonnée Y est 2, remontez au hasard de 0 ou 1.

±²M‽²↓

Si c'est -2, descendez au hasard de 0 ou 1.

M⊖‽³↓

Sinon, descendez au hasard de -1, 0 ou 1.

Neil
la source
6

Perl, 68 octets

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

Cela ne semble pas du tout optimal.

Ton Hospel
la source
5

Gelée , 24 octets

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

Essayez-le en ligne!

Explication

3µ'o1r '«5 ¥ $ Xµ30СṬ € o⁶z⁶Y || Programme complet Niladic.
                         ||
3 || À partir de 3 ...
 µ µ30 || ... Exécuter 30 fois ...
               С || ... Et rassemblez les résultats dans une liste.
  «o1r» «5 ¥ $ X || - | Fonction "Helper" monadique.
  «o1 || - | Entier courant, décrémenté OU 1.
     r X || - | Prenez un élément aléatoire dans la plage de ^ à ...
      «« 5 || - | ... Le nombre incrémenté, plafonné à 5 (utilise le maximum).
         ¥ $ || - | Éléments de syntaxe. Utilisé pour regrouper les liens.
                 Ṭ € || Contre-vérité chacun.
                   o⁶ || OU logique avec un seul espace.
                     z⁶ || Transposer avec des espaces de remplissage.
                       Y || Rejoignez-nous par des nouvelles lignes.
M. Xcoder
la source
5

R , 138 octets

m=matrix(" ",30,5)
m[1,3]=0
x=3
s=sample
for(i in 2:30)m[i,x<-x+(-1)^(x==5)*s(0:1,1)*x%in%c(1,5)+(s(3,1)-2)*x%in%2:4]=0
write(m,"",30,,"")

Essayez-le en ligne!

Handgolfé par plannapus

Giuseppe
la source
5

Python 3, 144 octets

@Ruts, @Turksarama et @mypetlion ont été très utiles pour réduire les octets

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)

Je vais essayer de m'améliorer. Défi amusant!

linemade
la source
3
Passez l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else là l+=random.randint(~-(l<1),l<4)pour enregistrer 31 octets.
mypetlion
1
Vous devriez pouvoir supprimer un grand nombre d'espaces et de nouvelles lignes.
M. Xcoder
1
Passez m=[[' 'for x in R(w)]for y in R(h)]à m=[list(' '*w)for y in R(h)]pour enregistrer 7 octets.
mypetlion
2
En python, booleanune sous-classe de int. FalsePeut donc être utilisé à la place 0et Truepeut remplacer 1. L' ~opérateur est unaire pour le bit à bit notet l' -opérateur retourne le signe (multiplier par -1). Donc, ~-(False)évalue à -1et ~-(True)évalue à 0.
mypetlion
1
Attribuez votre 0 initial à l'intérieur de votre boucle et définissez l après l'affectation. Cela vous permet d'économiser une ligne entière ( m[2][0]=0disparue) et 2 octets sur la boucle for ( for i in R(1,30):devient for i in R(30):). Vous devrez également recalculer l après avoir défini le 0. Cela devrait vous prendre à 144 octets.
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,,"")

Merci à @Giuseppe pour les 6 octets supplémentaires!

Utilise une table de probabilités comme suit:

> 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]

où chaque colonne correspond à un cas, c'est-à-dire que la colonne 1 est choisie si le serpent est dans la ligne 1, donnant les probabilités 0, 1/2 et 1/2 pour choisir respectivement -1 [descendre], 0 [rester immobile] et 1 [ monter] ( samplenormaliser automatiquement les probabilités à 1), la colonne 2 de la ligne 2 donne les probabilités 1/3, 1/3 et 1/3, etc ...

Essayez-le en ligne!

plannapus
la source
114 octets
Giuseppe
@Giuseppe Merci! Il n'y avait en effet aucune raison de l'aliaser, et j'ai oublié d'utiliser le recyclage vectoriel pour ce 0 supplémentaire.
plannapus
3

SOGL V0.12 , 22 21 octets

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

Essayez-le ici!

Explication:

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
la source
3

Japt, 31 29 octets

Renvoie un tableau de lignes.

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

Essaye-le

Hirsute
la source
2

Python 2 , 127 octets

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)

Essayez-le en ligne!

Barre
la source
2

Octave avec package de statistiques, 99 octets

Il fonctionne également dans MATLAB avec 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])

Essayez-le en ligne!

Luis Mendo
la source
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

Cette réponse est plus intéressante que la verticale à cause des cas de bord (littéraux).

64 octets, sans espaces d'impression:

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

J'ai également trouvé quelques variantes de la ligne 2 de même longueur:

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

La division entière de Y / 3 est utilisée pour vérifier si Y est en dehors de la plage valide, ainsi que pour obtenir le signe.

12Me21
la source
2

Java 8, 177 170 octets

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 octets grâce à @ OlivierGrégoire .

Explication:

Essayez-le en ligne.

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
la source
1
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)pour économiser quelques octets.
Olivier Grégoire
@ OlivierGrégoire Je pensais l'avoir déjà fait, mais apparemment pas. Peut-être que je l'ai fait dans une autre réponse récemment ..: S Merci!
Kevin Cruijssen
2

C (gcc) , 134 130 octets

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();}

Essayez-le en ligne!

MaSi
la source
Bienvenue chez PPCG!
Martin Ender
Merci! L'utilisation de putchar au lieu de printf économise 4 octets.
MaSi
1

Python 3 , 123 octets

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

Essayez-le en ligne!

Générez un tableau d'entiers, puis convertissez-le en chaque ligne.

Python 2 , 120 octets

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)

Essayez-le en ligne!

Pour Py2, les parens redondants pour execet printpeuvent être supprimés, mais la syntaxe de la 2e ligne n'est pas valide.

Dépassement de la soumission Py2 par Rod et de la soumission Py3 par linemade .

Bubbler
la source
1

Rubis , 98 77 octets

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

Essayez-le en ligne!

Un lambda renvoyant un tableau de chaînes.

Mon impulsion initiale était de générer les colonnes et de les transposer, mais il est beaucoup plus facile d'éviter cette étape.

J'aurais aimé initialiser aavec [" "*30]*5, mais cela ferait des copies superficielles des cordes, résultant en un serpent très gras et non glissant.

J'aurais pu utiliser une constante comme Dl'incrément (pour le même nombre d'octets), mais Ruby se serait plainte à chaque fois que je l'ai assignée. J'ai décidé que je préférais réduire la lisibilité en réutilisant la iboucle médiane à avoir un tas d'avertissements de débogage à ignorer.

J'aurais également aimé économiser quelques octets avec loop{x+=rand(3)-1;(0..4)===x&&break}, mais cela aurait causé un biais sur les bords: 1/3 chance de revenir en arrière, 1/3 chance de rester et 1/3 chance de sortir des limites pour un certain temps avant de finalement revenir au hasard (c'est-à-dire "rester").

-20 octets: utilisez Ruby Integer#[]pour créer de minuscules conditionnels, assurant des pondérations de mouvement correctes pour les 5 positions. Cela remplace un modèle de rupture de boucle (avec une chance non nulle de ne pas s'arrêter) pour une économie énorme. Merci, Eric Duminil !

-1 octet: initialiser aavec (0..4).mapau lieu de 5.times, merci encore à 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
la source
Bon début. Pas besoin d'un intérieur loop. Vous pouvez calculer l'incrément avec rand(2+14[x])-30[x]ou rand -(30[x])..15[x]. Il existe probablement une version plus courte. Pourtant, -20 octets n'est pas mauvais! Essayez-le en ligne!
Eric Duminil
1 octet de moins avec x,a=2,(0..4).map{" "*30}. Essayez-le en ligne!
Eric Duminil
1
Wow, 30[x]c'est un super truc! Merci!
benj2240
1

Perl 6 , 85 octets

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

Essayez-le en ligne!

L'expression longue entre parenthèses est une séquence paresseuse générée à partir de l'élément initial (' ', ' ', 0, ' ', ' '), la première bande verticale de la sortie. Chaque bande / liste successive est générée à partir de la précédente en appelant sa rotateméthode, avec le décalage choisi au hasard dans un ensemble contenant 0, 1(si le premier élément est différent de zéro) et -1(si le cinquième élément est différent de zéro).

La matrice de bandes horizontales est transposée avec l' [Z]opérateur, la transformant en une liste de bandes verticales, chacune étant ensuite joinéditée en une seule chaîne et sortie avec say.

Sean
la source
1

Scala, 207 octets

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)

échantillon:

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

dégouliné:

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)

Mon invention unique - enfin, je n'ai pas lu les autres solutions jusqu'à présent, est de générer un Random (6) qui est implicitement deux Randoms, (2 * 3). Si loin de la frontière, j'utilise les valeurs de r / 2 (0,1,2) et → (-1,0,1) me dire, pour monter ou descendre. Si à la frontière, je peux éviter l'appel coûteux d'un autre personnage au hasard, et prendre le modulo (2), pour décider si je reste ou si je pars.

Voyons les autres solutions. :)

Utilisateur inconnu
la source
Oui, mauvaise image d'échantillon. Cela fait. :)
utilisateur inconnu
scala rochers! oh .. code golf .. mauvais cas d'utilisation, il apparaît .. Comment diable at-il été rodé java?
javadba
@javadba: Avez-vous cliqué sur le try itlien? Kevin Cruijssen n'a pas inclus de passe-partout, nécessaire pour compiler ce code ou pour l'exécuter dans JShell, mais je suppose que cela est conforme aux directives - il pourrait y avoir une méta-discussion. Si vous le souhaitez, vous pouvez essayer de réduire ce code, en utilisant également un tableau à deux dim. Une deuxième idée est de réduire le code glissant à la fin. Une méthode de carte? L'impression est cachée par Kevin. - Oui, Array donne une amélioration de 8.
utilisateur inconnu
Laissez scala déduire le type de retour int: 4 caractères supplémentaires enregistrés.
utilisateur inconnu
donc ça va entrer dans le stade pour java maintenant
javadba
1

Perl, 83 101 octets

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'

Nouveau: Sans problème de probabilité aux frontières:

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'

Non golfé:

$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.
la source
2
Votre patrouille frontalière ne donne pas la bonne probabilité de 50% pour rester sur le bord.
Ton Hospel
0

PowerShell , 133 octets

$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$_}

Essayez-le en ligne!

Construit un tableau 2D de 30 espaces de large par 5 lignes de haut. (NB - si quelqu'un peut trouver un moyen plus efficace d'initialiser ce tableau, je vous <3 pour toujours.) Définit la variable d'assistance $lsur2 (ceci est utilisé pour quelle ligne le segment de serpent précédent était sur). Boucle ensuite de 0à 29.

À chaque itération, nous définissons notre élément serpent sur 0 . Ensuite, nous indexons dans un tableau compliqué avec Get-Randomqui sélectionne si nous montons ou descendons ou restons les mêmes. C'est ajouté à nouveau $l.

Enfin, nous parcourons les cinq éléments de $aet -joinleurs éléments intérieurs en une seule chaîne chacun. Ces cinq chaînes sont laissées sur le pipeline, et l'implicite Write-Outputnous donne gratuitement des nouvelles lignes.

AdmBorkBork
la source
0

Clojure, 123 octets

Voici les parens:

(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)))

Version non golfée:

(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)))

Construit une liste des différentes hauteurs du corps de serpent, puis itère de 0 à 4. Chaque fois qu'une hauteur correspond à la ligne actuelle, elle imprime un 0, sinon un blanc. Ne pas laisser les hauteurs dépasser la frontière coûte vraiment des octets. Reconnaître également quand une nouvelle ligne est en ordre est plus gourmand en octets comme il se doit. On pourrait facilement écrire un single doseq, en faisant un produit cartésien des x et des y mais on ne sait pas quand imprimer une nouvelle ligne.

Joshua
la source
0

Python3 + numpy, 137 132 octets

Pas la soumission de python la plus courte, pas la plus longue et certainement pas la plus rapide.

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

update L' utilisation de numpyla commande diff a permis d'économiser 5 octets pour tester si le serpent est un modèle valide, par rapport au calcul manuel de la différence avec j[1:]-j[:-1].

user2699
la source
0

C (gcc), 80 76 72 71 octets

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;}

Essayez-le en ligne!

vazt
la source
Suggérer à la f(r)place der;f()
plafondcat
0

R , 95 octets

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

La ligne suivante xest toujours choisie parmi les lignes qui ne sont pas à plus de 1 de la ligne actuelle ( l[abs(x-l)<2]). L'utilisation replicateau lieu d'un forcycle permet d'économiser certains octets nécessaires à l'initialisation et à la manipulation de la matrice et nécessite l'utilisation de l' <<-opérateur lors de l'affectation à la variable globale x.

Essayez-le en ligne!

Robert Hacken
la source
0

05AB1E , 25 octets

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

Essayez-le en ligne!

Explication

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
la source