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:
- Exactement 5 lignes de caractères sont imprimées
- 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
- Votre serpent commence à la ligne 3
- 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
- Votre serpent n'a pas besoin de visiter chaque ligne.
Réponses:
JavaScript (ES6), 98 octets
7 octets enregistrés grâce à @KevinCruijssen
Renvoie un tableau de 5 chaînes.
Essayez-le en ligne!
Commenté
la source
d
et utiliser((y%4?3:2)|0)-(y>0)
pour -6 octets. Essayez-le en ligne.1
innew Random(...)
est implicite par défaut bien sûr .. Essayez-le en ligne.!!y
au lieu d'(y>0)
enregistrer 2 octets supplémentaires.)Fusain , 28 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Imprimez du rembourrage pour forcer 5 lignes de sortie.
Répétez 30 fois.
Imprimez un zéro (et déplacez-vous horizontalement).
Si la coordonnée Y est 2, remontez au hasard de 0 ou 1.
Si c'est -2, descendez au hasard de 0 ou 1.
Sinon, descendez au hasard de -1, 0 ou 1.
la source
Perl, 68 octets
Cela ne semble pas du tout optimal.
la source
Gelée , 24 octets
Essayez-le en ligne!
Explication
la source
R , 138 octets
Essayez-le en ligne!
Handgolfé par plannapus
la source
Python 3, 144 octets
@Ruts, @Turksarama et @mypetlion ont été très utiles pour réduire les octets
Je vais essayer de m'améliorer. Défi amusant!
la source
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.m=[[' 'for x in R(w)]for y in R(h)]
àm=[list(' '*w)for y in R(h)]
pour enregistrer 7 octets.boolean
une sous-classe deint
.False
Peut donc être utilisé à la place0
etTrue
peut remplacer1
. L'~
opérateur est unaire pour le bit à bitnot
et l'-
opérateur retourne le signe (multiplier par-1
). Donc,~-(False)
évalue à-1
et~-(True)
évalue à 0.m[2][0]=0
disparue) et 2 octets sur la boucle for (for i in R(1,30):
devientfor i in R(30):
). Vous devrez également recalculer l après avoir défini le 0. Cela devrait vous prendre à 144 octets.R ,
120114 bytesMerci à @Giuseppe pour les 6 octets supplémentaires!
Utilise une table de probabilités comme suit:
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] (
sample
normaliser 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!
la source
SOGL V0.12 ,
2221 octetsEssayez-le ici!
Explication:
la source
Japt,
3129 octetsRenvoie un tableau de lignes.
Essaye-le
la source
Japt , 26 octets
Testez-le en ligne!
la source
Python 2 , 127 octets
Essayez-le en ligne!
la source
Octave avec package de statistiques, 99 octets
Il fonctionne également dans MATLAB avec Statistics Toolbox.
Essayez-le en ligne!
la source
Japt , 28 octets
9 octets enregistrés grâce à ETHproductions
Essayez-le en ligne!
la source
SmileBASIC,
10710510389 bytesCette réponse est plus intéressante que la verticale à cause des cas de bord (littéraux).
64 octets, sans espaces d'impression:
J'ai également trouvé quelques variantes de la ligne 2 de même longueur:
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.
la source
Java 8,
177170 octets-7 octets grâce à @ OlivierGrégoire .
Explication:
Essayez-le en ligne.
la source
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
pour économiser quelques octets.C (gcc) ,
134130 octetsEssayez-le en ligne!
la source
Python 3 , 123 octets
Essayez-le en ligne!
Générez un tableau d'entiers, puis convertissez-le en chaque ligne.
Python 2 , 120 octets
Essayez-le en ligne!
Pour Py2, les parens redondants pour
exec
etprint
peuvent ê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 .
la source
Rubis ,
9877 octetsEssayez-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
a
avec[" "*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 commeD
l'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 lai
boucle médiane à avoir un tas d'avertissements de débogage à ignorer.J'aurais également aimé économiser quelques octets avecloop{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
a
avec(0..4).map
au lieu de5.times
, merci encore à Eric Duminil .la source
loop
. Vous pouvez calculer l'incrément avecrand(2+14[x])-30[x]
ourand -(30[x])..15[x]
. Il existe probablement une version plus courte. Pourtant, -20 octets n'est pas mauvais! Essayez-le en ligne!x,a=2,(0..4).map{" "*30}
. Essayez-le en ligne!30[x]
c'est un super truc! Merci!Perl 6 , 85 octets
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 sarotate
méthode, avec le décalage choisi au hasard dans un ensemble contenant0
,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 ensuitejoin
éditée en une seule chaîne et sortie avecsay
.la source
Scala, 207 octets
échantillon:
dégouliné:
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. :)
la source
java
?try it
lien? 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.Perl,
83101 octetsNouveau: Sans problème de probabilité aux frontières:
Non golfé:
la source
PowerShell , 133 octets
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
$l
sur2
(ceci est utilisé pour quelle ligne le segment de serpent précédent était sur). Boucle ensuite de0
à29
.À chaque itération, nous définissons notre élément serpent sur
0
. Ensuite, nous indexons dans un tableau compliqué avecGet-Random
qui 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
$a
et-join
leurs éléments intérieurs en une seule chaîne chacun. Ces cinq chaînes sont laissées sur le pipeline, et l'impliciteWrite-Output
nous donne gratuitement des nouvelles lignes.la source
Clojure, 123 octets
Voici les parens:
Version non golfée:
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.la source
Python3 + numpy,
137132 octetsPas la soumission de python la plus courte, pas la plus longue et certainement pas la plus rapide.
update L' utilisation de
numpy
la 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 avecj[1:]-j[:-1]
.la source
C (gcc),
80767271 octetsEssayez-le en ligne!
la source
f(r)
place der;f()
R , 95 octets
La ligne suivante
x
est toujours choisie parmi les lignes qui ne sont pas à plus de 1 de la ligne actuelle (l[abs(x-l)<2]
). L'utilisationreplicate
au lieu d'unfor
cycle 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 globalex
.Essayez-le en ligne!
la source
05AB1E , 25 octets
Essayez-le en ligne!
Explication
la source