Faites pousser des fleurs!

11

Le printemps est arrivé récemment et c'est presque le moment où les fleurs commencent à germer. Je veux donc que vous les aidiez à grandir.

Ta tâche:

Étant donné deux nombres,, met n, les mfleurs de sortie sont placées au hasard sur une n*ngrille.

Une seule fleur ressemble à ceci:

&
|

La position d'une fleur est définie par son emplacement &. Lorsque vous placez deux fleurs au hasard, aucune ne peut être au même endroit. Si une fleur &chevauche une autre fleur |, affichez le &. La rangée inférieure de fleurs ne peut en contenir &.

L'entrée peut être sous la forme d'un nombre ou d'une chaîne, via l'une des méthodes standard.

La sortie peut être une liste de chaînes, chaque chaîne représentant une ligne de la grille ou une chaîne délimitée suivant la même directive que la liste. Méthodes standard de sortie. Les traînées sont autorisées et vous pouvez utiliser des onglets pour séparer vos fleurs. Notez que chaque grille doit être complètement remplie, avec des espaces ou quelque chose.

Notez que l'entrée sera toujours valide, vous pourrez toujours légalement insérer les mfleurs dans la grille npar n.

Cas de test:

Étant donné que seuls des cas de test très étroits peuvent être garantis, en raison de l'ensemble du bit de "placement aléatoire", ce sera le seul type de cas de test avec une réponse fournie. Mais je vais essayer toutes les soumissions en ligne pour m'assurer qu'elles sont valides en utilisant aussi certains cas de test.

L'entrée pour les cas de test est donnée dans le formulaire m, n.

Input: 2, 2
Output:

&&
||
--------------
Input: 6, 3
Output:

&&&
&&&
|||

Notez que la nouvelle ligne après le mot Output:dans les cas de test est facultative.

Autres cas de test:

  1. 1, 10
  2. 0, 100
  3. 5, 8
  4. 6, 3

Le golf de code ainsi le code le plus court gagne!

Merci à ComradeSparklePony d'avoir relevé ce défi et de l'avoir affiché dans la boîte cadeau du Père Noël secret !. Poteau de bac à sable

Christophe
la source
2
Lorsque vous dites "au hasard", tous les résultats possibles doivent-ils avoir une probabilité égale?
xnor

Réponses:

5

Gelée , 33 octets

²‘;⁹R¤ṬṖs⁸×’¤Ẋ€ṙ2B¤F€ZḄị“&|& ”s⁸Y

Essayez-le en ligne!

Comment?

²‘;⁹R¤ṬṖs⁸×’¤Ẋ€ṙ2B¤F€ZḄị“&|& ”s⁸Y - Main link: n, m        e.g. 3, 2
²                                 - square n                    9
 ‘                                - increment                   10
     ¤                            - nilad followed by link(s) as a nilad:
   ⁹                              -     link's right argument   2
    R                             -     range                   [1,2]
  ;                               - concatenate                 [10,1,2]
      Ṭ                           - untruth (1s at indexes)     [1,1,0,0,0,0,0,0,0,1]
       Ṗ                          - pop                         [1,1,0,0,0,0,0,0,0]
            ¤                     - nilad followed by link(s) as a nilad:
         ⁸                        -     link's left argument    3
           ’                      -     decrement               2
          ×                       -     multiply                6
        s                         - split into chunks           [[1,1,0,0,0,0],[0,0,0]]
             Ẋ€                   - shuffle €ach       (maybe:) [[0,1,0,0,1,0],[0,0,0]]
                  ¤               - nilad followed by link(s) as a nilad:
                2B                -     2 in binary             [1,0]
               ṙ                  - rotate (vectorises)         [[[0,0,0],[0,1,0,0,1,0]],[[0,1,0,0,1,0],[0,0,0]]]
                   F€             - flatten €ach                [[0,0,0,0,1,0,0,1,0],[0,1,0,0,1,0,0,0,0]]
                     Z            - transpose                   [[0,0],[0,1],[0,0],[0,0],[1,1],[0,0],[0,0],[1,0],[0,0]]
                      Ḅ           - from binary (vectorises)    [0,1,0,0,3,0,0,2,0]
                        “&|& ”    - literal                     ['&','|','&',' ']
                       ị          - index into                  [' ','&',' ',' ','&',' ',' ','|',' ']
                               ⁸  - link's left argument        3
                              s   - split into chunks           [[' ','&',' '],[' ','&',' '],[' ','|',' ']]
                                Y - join with newlines          [' ','&',' ','\n',' ','&',' ','\n',' ','|',' ']
                                  - implicit print
Jonathan Allan
la source
Mon esprit a été soufflé
Christopher
Avez-vous échangé les significations de met nou pourquoi le faites-vous square m? wth est un nilad ?
Titus
Ces 33 caractères ne sont-ils vraiment que 33 octets?
Titus
1
@Titus Je n'ai pas échangé les significations, j'ai échangé l'ordre d'entrée (et ce faisant, j'ai gâché l'explication), donc merci d'avoir compris cela. Une nilade (par opposition à une monade, une dyade ou ...) est une fonction qui ne prend aucune entrée et renvoie une valeur - car une telle constante est une nilade, tout comme une entrée unique pour une fonction ou un programme. Ce sont vraiment 33 octets différents - les caractères ne sont qu'un encodage des 256 octets que Jelly utilise comme liés par le mot octets dans l'en-tête.
Jonathan Allan
Tu m'as presque perdu rotate. Bon travail; excellente ventilation!
Titus
4

PHP (> = 7.1), 135 131 128 116 116 110 109 octets

for([,$m,$n]=$argv,$z=$q=$n*$n;$q;)echo" |&"[$m&&rand(0,--$z-$n)<$m?$s[$q]=2+!$m--:$s[$q+$n]/2],"
"[--$q%$n];

prend l'entrée des arguments de la ligne de commande; exécuter -nrou tester en ligne .

panne

for([,$m,$n]=$argv,     # import arguments
    $z=$q=$n*$n;        # $q = number of total fields, $z-$n = available for flowers
    $q;                 # loop $q down to 0
)   
    echo" |&"[              # print:
        $m&&rand(0,--$z-$n)<$m  # if (probability $m/($z-$n)), decrement $z
            ?$s[$q]=2+!$m--     # then index 2 (flower), set $s[$q], decrement $m
            :$s[$q+$n]/2        # else if flower above, then 1 (stalk), else 0 (space)
        ],
        "\n"[--$q%$n]           # print newline every $n characters
    ;
Titus
la source
1
Vous avez ajouté les octets pour le drapeau non?
Christopher
@Christopher -rest gratuit ; il indique à PHP d'exécuter du code à partir de l'argument de ligne de commande. -nréinitialise PHP aux paramètres par défaut.
Titus
1
@JonathanAllan La version prédéfinie semble dépendre de votre visite précédente; probablement un cookie.
Titus
3

Python 2 , 150 octets

from random import*
n,m=input()
b=[1]*m+[0]*(n*~-n-m)
shuffle(b)
for r in range(n):print''.join(' &|'[f^-s]for s,f in zip([0]*n+b,b+[0]*n)[r*n:r*n+n])

Essayez-le en ligne!

Comment?

Prend input()de STDIN et décompresse le tuple fourni (une chaîne séparée par des virgules d'entiers décimaux comme 3,6) dans net m.

Crée un n*(n-1)"parterre" long , ordonné et unidimensionnel b, en concaténant:
- une liste contenant une "fleur" [1]répétée m; et
- une liste contenant un "espace" [0]répété n*~-n-mfois *.

* L'opérateur têtard ~( ~x=-1-x) enregistre 2 octets n*~-n-mà la place de l'aspect plus normal n*(n-1)-m.

Mélange (en utilisant randomla shufflefonction de) ce parterre de fleurs pour placer les fleurs et les espaces au hasard parmi les n*(n-1)positions.

Parcourt les lignes indexées 0 r, et printschacune à son tour pour créer un parterre de fleurs bidimensionnel à partir de celui unidimensionnel ...

Le dernier n*nparterre de fleurs en deux dimensions ( ) a des tiges, sune rangée sous les capitules f, si et seulement s'il n'y a pas de capitule à montrer. Ceci est réalisé par XORing ( ^) favec -sfet ssont les 1s et 0s d'avant et en utilisant le résultat pour indexer dans la chaîne de longueur 3 ' &|':

f   s   f^-s   ' &|'[f^-s]
0   0    0     ' '
0   1   -1     '|'  < negative indexing used here
1   0    1     '&'
1   1   -2     '&'  < ...and here.

Pour obtenir fet sla zipfonction est utilisée avec deux copies du parterre de fleurs unidimensionnel, une avec ndes espaces de fuite (les capitules) et une avec ndes espaces de tête (les tiges). Le tout est créé pour chaque ligne (pour économiser des octets), et la ligne requise est découpée en utilisant [r*n:r*n+n].

Jonathan Allan
la source
2

Python 2 , 184 179 octets

from random import*
m,n=input()
s,a=' &'
l=[s]*n*-~n
while s.count(a)<m:x=randrange(n*n-n);l[x]=a;l[x+n]='|&'[l[x+n]==a];s='\n'.join(''.join(l[i*n:][:n])for i in range(n))
print s

Essayez-le en ligne!

ovs
la source
2

Python 2 , 129 octets

from random import*
n,m=input();d=n*n-n
s=''
while d+n:b=0<random()*d<m;m-=b;d-=1;s+=' |&'[-b|(s[~n:-n]=='&')]+'\n'[d%n:]
print s

Essayez-le en ligne!

Génère la chaîne de sortie un caractère à la fois. Choisit au hasard si la cellule actuelle est une fleur avec une probabilité égale au nombre mde fleurs restantes divisé par le nombre d'espaces restants. Ajoute une nouvelle ligne à tous les ncaractères. Une cellule vide est remplie d'une tige |si le symbole nde la fin est a &.

xnor
la source
1

PHP, 111 octets

for([,$b,$s]=$argv;$i<$s**2;)echo${+$i}="| &"[(rand(1,$s**2-$s-$i)>$b?0:$b--)>0?2:${$i-$s}!="&"],"\n"[++$i%$s];

Version en ligne

-1 octet pour une nouvelle ligne physique

une solution 115 octets en utilisant max

for([,$b,$s]=$argv;$i<$s**2;)echo${+$i}="&| "[rand(1,max($s**2-$s-$i,1))>$b?1+(${$i-$s}!="&"):!$b--],"\n"[++$i%$s];

De cette façon, avec 137 octets mélange la première partie de la chaîne

for([,$b,$s]=$argv,$a=str_shuffle(($p=str_pad)($p("",$b,_),$s**2-$s));$i<$s**2;)echo$a[$i]<_?" |"[$a[$i-$s]==_&$i>=$s]:"&","\n"[++$i%$s];
Jörg Hülsermann
la source
1

JavaScript (ES6), 157 octets

f=(n,m,a=[...(` `.repeat(n)+`
`).repeat(n)],r=Math.random()*-~n*~-n|0)=>m?(a[r]==` `?a[m--,r]=`&`:0,f(n,m,a)):a.map((c,i)=>c==` `&&a[i+~n]==`&`?`|`:c).join``
<div oninput=o.textContent=f(n.value,m.value)><input id=n type=number min=2 value=2><input id=m type=number min=1><pre id=o>

Explication: crée un tableau représentant la grille de fleurs et les nouvelles lignes. Recherche récursivement au hasard des carrés vides dans lesquels placer des fleurs jusqu'à ce que le nombre souhaité de fleurs soit atteint. Enfin, les tiges des fleurs sont générées là où il y a de la place pour elles.

Neil
la source
Pour une raison quelconque, cela génère une erreur lorsque n = 2 et m = 3.
Shaggy
@Shaggy C'est parce qu'il n'y a de place que pour 2 fleurs.
Neil
Ah, je le lisais à l'envers. Mes excuses.
Shaggy
1

Fusain , 27 octets

Nθ↷FN«J‽θ‽⊖θW⁼KK&J‽θ‽⊖θ&¬KK

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

Nθ

Entrée n.

Modifiez le sens d'impression par défaut vers le bas.

FN«

Entrez met bouclez plusieurs fois.

J‽θ‽⊖θ

Accédez à un emplacement aléatoire sur la grille.

W⁼KK&J‽θ‽⊖θ

S'il y a déjà une fleur, continuez à sauter vers des emplacements aléatoires jusqu'à ce qu'un endroit approprié soit trouvé.

&

Imprimez le capitule.

¬KK

Imprimez la tige s'il n'y a pas déjà un capitule en dessous.

Neil
la source