Astérisques viraux

9

É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 3comprennent:

***
* *
**
**
***
*
*

Pour l'entrée 7:

****
*  **
*   **
*
***
  *

Pour l'entrée 10:

****
*  *      
*********
  *
  *****

Il s'agit de , 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.

nicael
la source
Veuillez commenter si vous rencontrez des problèmes avec la consommation de mon long message - je peux peut-être raccourcir quelque chose (je vais essayer alors).
nicael
3
Apprenez simplement à vous y attendre. Parfois, c'est occupé comme tout diable. D'autres fois, c'est calme comme maintenant. N'oubliez pas, c'est aussi Pâques.
Zacharý
Je ne suis pas vraiment sûr de ce qui ne va pas avec mon message. Est-ce que celui qui a rétrogradé serait si gentil d'expliquer, s'il vous plaît?
nicael
1
IMO N est mieux décrit comme le temps: P
ASCII uniquement le
1
Peut-on renvoyer une matrice de 0s et 1s au lieu d'espaces et d'astérisques?
dylnan

Réponses:

5

CJam , 58 51 octets

[TT]{_2_m*\f.+{:-},mR}ri*]ee{~\)S*\{'*t}/}%::a:.+N*

Essayez-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.

[[0 0] [0 1] [0 2] [0 2] [1 3]]

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:

[ "**** "
  "*  *"
  "** "
  " *"
  ""     ]
Esolanging Fruit
la source
3

Fusain , 31 24 octets

F²«J⁰¦⁰F⊕θ«¿ι*↓*≔‽²ι¿KK↗

Essayez-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:

F²«

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 muter ià l'intérieur de la boucle.)

J⁰¦⁰

Aller à l'origine de la toile.

F⊕θ«

N+1Temps de boucle .

¿ι*↓*

Imprimez a *, mais laissez le curseur à droite ou en dessous du curseur en fonction de la valeur de i.

‽²ι

Rendre aléatoire la valeur de ipour la prochaine itération de la boucle interne.

¿KK↗

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

Neil
la source
C'est presque correct, mais il imprime des Nbranches non dimensionnées, mais de N-1taille :)
nicael
@nicael Désolé, corrigé.
Neil
Vous l'avez probablement déjà vu trop de fois, mais: 23 octets
ASCII uniquement le
3

Java 10, 273 272 268 239 octets

n->{var c=new char[++n][n];for(var d:c)java.util.Arrays.fill(d,' ');for(int i=0,j=0,k=0,l=0,r=0,s=0,t=0,u=0;n-->0;){c[i+=r][j+=s]=c[k+=t][l+=u]=42;do{r=t=2;r*=Math.random();t*=Math.random();s=r^1;u=t^1;}while(i+r==k+t&j+s==l+u);}return c;}

Essayez-le en ligne ici .

Merci à Kevin Cruijssen d' avoir joué au golf 29 octets.

Version non golfée:

n -> { // lambda taking an int as argument
    var c = new char[++n][n]; // the output; increment the virality since the root does not count
    for(var d : c) // for every line
        java.util.Arrays.fill(d,' '); // initialize it with spaces
    for(int i = 0, j = 0, // coordinates of the first branch
            k = 0, l = 0, // coordinates of the second branch
            r = 0, s = 0, // offsets for the first branch, one will be 0 and the other 1 always except for the first '*' where the two branches overlap
            t = 0, u = 0; // offsets for the second branch, one will be 0 and the other 1 always except for the first '*' where the two branches overlap
        n-- > 0; ) { // decrement virality and repeat as many times
        c[i+=r][j+=s] = c[k+=t][l+=u] = 42; // move according to offsets and place an '*' for each branch, 42 is ASCII code
        do { // randomly pick offsets for both branches
            r = t = 2; // Math.random() provides results in [0,1)
            r *= Math.random(); // flip a coin for the first branch
            t *= Math.random(); // flip another coin for the second
            s = r^1; // set s to 0 if r=1, to 1 if r=0
            u = t^1; // set u to 0 if t=1, to 1 if t=0
        } while(i+r==k+t&j+s==l+u); // repeat if the branches overlap
    }
    return c; // return the output
}
OOBalance
la source
239 octets (j'ai seulement changé les choses à l'intérieur du do{}bit (et placé les entrées dans la première partie de la boucle for). PS: Dans votre réponse initiale, 0.5on aurait pu jouer au golf .5aussi.
Kevin Cruijssen
@KevinCruijssen semble avoir besoin de travailler sur mes mathématiques. merci :-)
OOBalance
3

Perl 5 , 208 124 122 122 118 octets

118 octets sans retour à la ligne, indentation et commentaires. Prend N de stdin:

@b=1..2;                            #number of branches is 2
for(1..<>){                         #add length <> (the input) to each branch
  ($x,$y)=@$_                       #get where current branch has its tip now
 ,.5>rand?$x++:$y++                 #increase either x or y
 ,$o[$y][$x]++&&redo                #try again if that place is already occupied
 ,$_=[$x,$y]                        #register new tip of current branch
   for@b                            #...and do all that for each branch 
}
say map$_||!$i++?'*':$",@$_ for@o;  #output the branches

Essayez-le en ligne!

Kjetil S.
la source
Sympa, mais il imprime les branches 1 astérisque plus court qu'elles ne devraient l'être :)
nicael
Veuillez revoir les exemples dans mes questions :)
nicael
Oh, je suis passé 2..$Nà 1..shiftmaintenant et j'ai également rasé quelques octets.
Kjetil S.
1
Bonne réponse! Vous pouvez enregistrer quelques octets en utilisant <>et en entrée au lieu des shiftarguments et ainsi que réorganiser vous appelez randpour é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!
Dom Hastings
1
La page des astuces pour jouer au golf en Perl contient de bons conseils, assurez-vous de les consulter! Bonne chance et amusez-vous bien!
Dom Hastings
2

Python 2 , 204 octets

from random import*
N=input()
s=eval(`[[' ']*-~N]*-~N`)
s[0][0]='*'
I=x,y=1,0
J=X,Y=0,1
exec"s[y][x]=s[Y][X]='*';i,j,k,l=choice((J+I,I+I,I+J,J+J)[x-2<X:]);x+=i;y+=j;X+=k;Y+=l;"*N
for i in s:print`i`[2::5]

Essayez-le en ligne!

Erik le Outgolfer
la source
2

Perl 5 -a , 97 96 93 92 octets

N'a pas de biais diagonal droit, bas ou off.

#!/usr/bin/perl -a
@;=[1];map{$x=$y=0;map++(.5<rand?$x:$y)*$;[$y][$x]++&&redo,1.."@F"}1,2;say+($","*")[@$_]for@

Essayez-le en ligne!

Ton Hospel
la source
1

PHP, 118 octets

for($r="*",$w=$argn+2;$argn--;$r[$q+=rand(0,$r[$q+1]<"*")?:$w]=$r)$r[$p+=rand(!$i++,1)?:$w]=$r;echo wordwrap($r,$w-1);

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 -nRou l' essayer en ligne .

Titus
la source
1
Comment puis-je vérifier avec différentes entrées là-bas?
nicael
@nicael: Vous pouvez changer l'argument sur la ligne$argBak=$argn=
Galen Ivanov
D'accord! Je ne sais pas si c'est une bonne façon ou non d '"accepter" les entrées de cette façon, mais laissez la communauté décider en votant
nicael
@nicael Dans TiO, remplacez simplement la valeur de $argn. Dans un environnement réel, $argnvient 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.)
Titus
0

Rouge , 195 190 octets

func[n][g: func[s][i: 0 d: s while[i < n][b/(d): #"*"until[r: 1 if 1 = random 2[r: n + 1]b/(d + r) =#" "]d: d + r
i: i + 1]]b:""loop n[loop n[append b" "]append b"^/"]b/1: #"*"g n + 2 g 2 b]

Essayez-le en ligne!

Lisible:

f: func[n][
    g: func[s][
        i: 0
        d: s
        while[i < n][
            b/(d): #"*"
            until[
                r: 1 if 1 = random 2[r: n + 1]
                b/(d + r) = #" "
            ]
            d: d + r
            i: i + 1
        ]
    ]
    b: ""
    loop n[loop n[append b " "]append b "^/"]
    b/1: #"*"
    g n + 2
    g 2
    b
]
Galen Ivanov
la source
0

Gelée , 50 43 41 octets

2ḶẊ⁸С+\‘Ṗ
⁸ÇU;Ǥ⁻Q$¿
‘,þ`⁼€þÇS+»þ`Ị$ị⁾* 

Essayez-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 de aþ,""oþ`Ɗ.

dylnan
la source
0

R , 148 142 octets

n=scan();`~`=sample;o=r=k=1;l=c(1,n);for(i in 1:n){r=r+l~1;t=l~1;k=k+"if"(k+t-r,t,l[l!=t]);o=c(o,r,k)};write(c(" ","*")[1:n^2%in%o+1],1,n,,"")

Essayez-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 branche ren ajoutant nou 1, respectivement. Ensuite, nous sélectionnons un autre mouvement à droite ou à gauche pour la branche k, et si elle se croisait où rva, nous sélectionnons l'autre direction. Ensuite, nous utilisons ret kcomme indices dans m, définissant ces valeurs comme "*". En itérant les n-1temps, nous imprimons ensuite le résultat.

Giuseppe
la source
0

Gelée , 39 38 octets

ḣ2+\€Ẏ
2Rd¤ṗẊÇ⁻Q$$¿Ç0,0ṭ‘Ṭ€×þ/$€Sị⁾* Y

Essayez-le en ligne!

Bien qu'apparemment sans rapport, il dest utile ici d'enregistrer un octet (par rapport à mon approche précédente).

user202729
la source
0

Python 2 , 191 187 176 176 octets

from random import*
n=input()
p,q=c=1,1j;s={p,q,0}
exec'z=choice(c);q,p=p+[z,1+1j-z][p+z in s],q;s|={q};'*2*~-n
R=range(n+1)
for y in R:print''.join(' *'[y+x*1jin s]for x in R)

Essayez-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 ...

Chas Brown
la source