Étant donné un entier positif N ("viralité"), votre programme devrait créer un dessin ASCII d'un arbre avec deux branches de longueur N s'étendant vers le bas et / ou vers la droite à partir du coin supérieur gauche.
La direction prise par chaque branche après le premier astérisque peut être vers la droite ou vers le bas, et ce choix doit être fait au hasard 1 à chaque étape suivante.
Par exemple, étant donné une entrée de 5, la sortie pourrait ressembler à:
***
* ***
**
**
Les deux branches sont autorisées à se toucher (sur les cellules adjacentes), mais ne se chevauchent pas (sur la même cellule), de sorte que les éléments suivants ne seraient pas autorisés:
***
* *
*****
*
*
Exemples
Pour l'entrée 1
, la seule sortie possible est:
**
*
(Ceci sera présent dans toutes les sorties valides, car le fait que les deux branches empruntent le même chemin entraîneraient leur chevauchement.)
Les sorties possibles pour une entrée 3
comprennent:
***
* *
**
**
***
*
*
Pour l'entrée 7
:
****
* **
* **
*
***
*
Pour l'entrée 10
:
****
* *
*********
*
*****
Il s'agit de code-golf , donc la réponse valide la plus courte (en octets) l'emporte.
1. Cela devrait être uniformément aléatoire (c'est-à-dire une chance 50/50 de chaque direction), ou aussi proche de l'uniformément aléatoire que vous pouvez obtenir sur du matériel normal.
0
s et1
s au lieu d'espaces et d'astérisques?Réponses:
CJam ,
5851 octetsEssayez-le en ligne!
L'idée de base est que nous commençons par
[0 0]
puis ajoutons à plusieurs reprises 0 ou 1 à chaque élément (en veillant à ce qu'ils ne soient jamais égaux sauf au début pour éviter le chevauchement), en collectant tous les résultats intermédiaires.Nous créons ensuite un grand tableau de tableaux où chaque sous-tableau contient des
*
indices donnés par la paire correspondante dans le tableau d'origine et des espaces partout ailleurs.Cela donne des tranches diagonales de la matrice de sortie (où le déplacement de gauche à droite correspond au déplacement de haut en bas à droite dans la matrice réelle).
On peut alors utiliser
::a:.+
pour "dé-diagonaliser" et obtenir les lignes résultantes:la source
Fusain ,
3124 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. À l'origine, je pensais qu'il serait plus facile de faire la première étape au hasard, mais il s'est avéré être plus golfeur pour rendre la première branche prévisible. Explication:
Boucle deux fois, en utilisant la variable d'index
i
. (Cela itère en fait sur une liste implicite, il est donc sûr de muteri
à l'intérieur de la boucle.)Aller à l'origine de la toile.
N+1
Temps de boucle .Imprimez a
*
, mais laissez le curseur à droite ou en dessous du curseur en fonction de la valeur dei
.Rendre aléatoire la valeur de
i
pour la prochaine itération de la boucle interne.Si le caractère actuel est un
*
, cela signifie que nous sommes la deuxième branche et que nous sommes descendus au lieu de droite, alors montez à droite pour corriger cela. (La première branche commence toujours vers le bas, de sorte que la deuxième branche sera toujours au-dessus, ce qui signifie que nous devons seulement vérifier une collision verticale.)la source
N
branches non dimensionnées, mais deN-1
taille :)Java 10,
273272268239 octetsEssayez-le en ligne ici .
Merci à Kevin Cruijssen d' avoir joué au golf 29 octets.
Version non golfée:
la source
do{}
bit (et placé les entrées dans la première partie de la boucle for). PS: Dans votre réponse initiale,0.5
on aurait pu jouer au golf.5
aussi.Perl 5 ,
208124122 122118 octets118 octets sans retour à la ligne, indentation et commentaires. Prend N de stdin:
Essayez-le en ligne!
la source
2..$N
à1..shift
maintenant et j'ai également rasé quelques octets.<>
et en entrée au lieu desshift
arguments et ainsi que réorganiser vous appelezrand
pour éviter les parens. Vous ne devriez pas non plus avoir à boucler votre affectation@o
. J'ai essayé d'utiliser@b=([],[]);
ce qui semble fonctionner, mais je n'ai pas trop expérimenté donc j'ai peut-être raté un cas de bord là-bas. J'espère qu'ils vous aideront un peu!Python 2 , 204 octets
Essayez-le en ligne!
la source
Perl 5
-a
,97969392 octetsN'a pas de biais diagonal droit, bas ou off.
Essayez-le en ligne!
la source
PHP, 118 octets
nécessite PHP 5.4 ou une version ultérieure pour l'opérateur Elvis. Remplacez
?:
par?1:
pour l'ancien PHP.Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
$argBak=$argn=
$argn
. Dans un environnement réel,$argn
vient de STDIN si vous l'exécutez en tant que pipe avec-R
. Il exécutera ensuite le code pour chaque ligne d'entrée (mais je suis à peu près certain que PHP ne désactive pas les variables entre les deux; les exécutions consécutives explicites sont donc plus susceptibles d'éviter de mauvaises surprises.)Rouge ,
195190 octetsEssayez-le en ligne!
Lisible:
la source
Gelée ,
504341 octetsEssayez-le en ligne!
C'était vraiment amusant à écrire. Il pourrait y avoir une méthode beaucoup plus optimale. Il y a probablement aussi du golf à faire avec cette méthode.
Juste après avoir posté cela, j'ai réalisé que je pouvais utiliser à la
,þ`
place deaþ,""oþ`Ɗ
.la source
R ,
148142 octetsEssayez-le en ligne!
De plus, bien qu'il ne réponde pas aux spécifications de sortie, vous pouvez distinguer les deux branches: Essayez-le en ligne!
Explication:
En partant de l'index
1
, nous sélectionnons au hasard un mouvement à droite ou à gauche pour la brancher
en ajoutantn
ou1
, respectivement. Ensuite, nous sélectionnons un autre mouvement à droite ou à gauche pour la branchek
, et si elle se croisait oùr
va, nous sélectionnons l'autre direction. Ensuite, nous utilisonsr
etk
comme indices dansm
, définissant ces valeurs comme"*"
. En itérant lesn-1
temps, nous imprimons ensuite le résultat.la source
Gelée ,
3938 octetsEssayez-le en ligne!
Bien qu'apparemment sans rapport, il
d
est utile ici d'enregistrer un octet (par rapport à mon approche précédente).la source
Python 2 ,
191187176 176 octetsEssayez-le en ligne!
Python a un support natif pour les nombres complexes du formulaire
a+bj
; cela rend certains problèmes 2-D un peu plus faciles à résoudre ...la source