Perl, 92 90 89 84 octets
Comprend +1 pour -n
Donnez de la hauteur sur STDIN:
perl -M5.010 bolt.pl <<< 15
bolt.pl
:
#!/usr/bin/perl -n
map{$_=$;until$;=$_,s/.6|3.?/53|16*rand/eg,/3|6/>/36/;say y|3615|\\/ |r}(1x$_.6)x$_
Explication
Si vous appelez le décalage du point de départ 0 (un point est au coin d'une case de caractère), alors sur la ligne suivante, vous pouvez être allé à gauche ou à droite (ou non) et vous pouvez vous retrouver avec des points sur les décalages -1,1
. La ligne suivante donne -2,0,2
les décalages possibles, etc. Ils diffèrent tous par 2. Si vous appelez ensuite le caractère en bas à gauche d'un point pair et le caractère en bas à droite impair, vous pouvez étendre cela à l'attribution de pair ou impair à chaque position de caractère sur une rangée telle que l'alternance paire et impaire (en fait, tout l'avion est carrelé en damier). Une position paire peut avoir un /
ou
, une position impaire peut avoir un \
ou
.
Le caractère juste avant a /
est dans une position étrange, il pourrait donc être soit \
ou
, mais \/
est interdit, donc seul
est possible. De même, le caractère après a \
doit être un
(en supposant que la ligne est remplie avec suffisamment d'espaces à gauche et à droite pour que les limites de ligne ne soient pas un problème). Ainsi, un éclair continue sur la ligne suivante toujours directement en dessous de a \
ou en dessous de a /
. Dans les deux cas , le point le plus bas se trouve au milieu et la rangée suivante peut avoir l' une
, /
, \
ou /\
directement en dessous du sommet 2 caractères. Donc, pour générer la ligne suivante, je peux simplement remplacer tout \
ou/
par l'une de ces 4 extensions avec une probabilité égale (vous pouvez également remplacer indépendamment le premier caractère par
ou /
et le deuxième caractère par
ou \
). En perl, vous pouvez le faire avec quelque chose comme:
s#\\ | /#(" "," \\","/ ","/\\")[rand 4]#eg
Si la ligne résultante contient cependant \/
(interdit rejoindre) ou non /
ou \
à tous (dies de boulons et ne parvient pas à fond) , le résultat est invalide. Dans ce cas, je jette toute la rangée et j'essaye simplement à nouveau. Une continuation valide existe toujours et si vous essayez assez souvent, une sera trouvée (par exemple, tout meurt à l'exception d'un flux). Il s'agit d'une distribution de probabilité légèrement différente de l'algorithme anti-chevauchement suggéré, mais je pense que c'est en fait mieux car il n'a pas de biais directionnel. La validité peut être testée de manière golfique en utilisant
m#\\|/#>m#\\/#
Le problème ici est que la substitution aléatoire est tellement looooong et que toutes ces \
échappées mangent aussi des octets. J'ai donc décidé de créer mes lignes à l'aide de chaînes de chiffres et de remplacer les chiffres appropriés par
, /
et \
juste avant l'impression. Le remplacement aléatoire de base est
53|16*rand
ce qui donne un de 53
, 55
, 61
ou 63
avec une probabilité égale. J'interprète ensuite 5
et 1
comme
, 3
comme \
et 6
comme /
. Cela explique l'impression de la ligne:
say y|3615|\\/ |r
Dans une compétition de golf sérieuse, je commencerais maintenant à explorer systématiquement des formules magiques alternatives, mais cela devrait être assez bon (dans les 3 octets optimaux)
Le reste des composantes du programme:
1x$_.6
Cela initialise $_
(voir la carte suivante) les espaces de hauteur suivis de a /
. Il s'agit d'une ligne invisible au-dessus de la première en cours d'impression et garantit que le champ est suffisamment large pour que le boulon ne puisse jamais manquer d'espace à gauche
map{ ... ; say ...}(1x$_.6)x$_
Je vais traiter cette même hauteur initiale de chaîne en imprimant une nouvelle ligne à chaque fois
$_=$;until$;=$_,...
Enregistrez la ligne actuelle dans $;
. Si le remplacement s'avère invalide, restaurez $_
depuis$;
s/.6|3.?/53|16*rand/eg
Faites la substitution réelle. Je n'ai pas à vérifier ce qui est avant /
ou après \
car ce doit être un espace. Ceci est pratique car l'espace peut être représenté par 1
ou 5
. Étant donné que j'ai seulement rempli la chaîne à gauche, l'espace après le \
peut encore être absent, alors rendez ce caractère facultatif
/3|6/>/36/
Vérifiez si la nouvelle ligne est valide
Stay safe and have fun golfing!
Peut-être aussi précisez que si EAS frappe, abandonnez tout et suivez les ordres! Le code de golf n'est pas votre priorité dans une telle situation.