Züchte einige Blumen!

11

Der Frühling ist vor kurzem gekommen und es ist fast die Zeit, in der Blumen zu sprießen beginnen. Ich möchte, dass du ihnen beim Wachsen hilfst.

Deine Aufgabe:

Bei zwei Zahlen mund nwerden die mBlumen zufällig in einem n*nRaster platziert.

Eine einzelne Blume sieht so aus:

&
|

Die Position einer Blume wird dadurch definiert, wo sie sich &befindet. Wenn zwei Blumen zufällig platziert werden, können sich keine zwei an derselben Stelle befinden. Wenn sich eine Blume &mit der einer anderen Blume überschneidet |, zeigen Sie die &. Die untere Blumenreihe darf keine enthalten &.

Die Eingabe kann über eine der Standardmethoden als Zahl oder Zeichenfolge erfolgen.

Die Ausgabe kann eine Liste von Zeichenfolgen sein, wobei jede Zeichenfolge eine Zeile des Rasters darstellt, oder eine begrenzte Zeichenfolge, die derselben Richtlinie wie die Liste folgt. Standardausgabemethoden. Nachlaufende Whatevers sind erlaubt, und Sie können Tabs verwenden, um Ihre Blumen zu trennen. Beachten Sie, dass jedes Raster vollständig mit Leerzeichen oder Ähnlichem gefüllt sein muss.

Beachten Sie, dass die Eingabe immer gültig ist. Sie können die mBlumen immer legal in das nBy- nRaster einpassen.

Testfälle:

Da aufgrund des gesamten "Random Placement" -Bits nur sehr enge Testfälle garantiert werden können, ist dies die einzige Art von Testfall mit einer Antwort. Ich werde jedoch alle Einsendungen online testen, um sicherzustellen, dass sie auch in einigen Testfällen gültig sind.

Die Eingabe für die Testfälle erfolgt im Formular m, n.

Input: 2, 2
Output:

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

&&&
&&&
|||

Beachten Sie, dass der Zeilenumbruch nach dem Wort Output:in den Testfällen optional ist.

Andere Testfälle:

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

Code Golf so kürzester Code gewinnt!

Vielen Dank an ComradeSparklePony, dass Sie diese Herausforderung angenommen und in der Geschenkbox des geheimen Weihnachtsmanns veröffentlicht haben!. Sandkastenpfosten

Christopher
quelle
2
Wenn Sie "zufällig" sagen, muss jedes mögliche Ergebnis die gleiche Wahrscheinlichkeit haben?
xnor

Antworten:

5

Gelee , 33 Bytes

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

Probieren Sie es online aus!

Wie?

²‘;⁹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
quelle
Mein Verstand wurde geblasen
Christopher
Hast du die Bedeutungen getauscht mund noder warum square m? wth ist ein nilad ?
Titus
Sind diese 33 Zeichen wirklich nur 33 Bytes?
Titus
1
@Titus Ich habe die Bedeutungen nicht getauscht, ich habe die Eingabereihenfolge getauscht (und dabei die Erklärung durcheinander gebracht), also danke, dass du das verstanden hast. Ein Nilad (im Gegensatz zu einer Monade oder einer Dyade oder ...) ist eine Funktion, die keine Eingaben akzeptiert und einen Wert zurückgibt - eine solche Konstante ist ein Nilad, ebenso wie eine einzelne Eingabe für eine Funktion oder ein Programm. Dies sind wirklich 33 verschiedene Bytes - die Zeichen sind nur eine Codierung der 256 Bytes, die Jelly verwendet, wie durch die Wortbytes im Header verknüpft.
Jonathan Allan
Du hast mich fast verloren bei rotate. Gut gemacht; ausgezeichnete Aufteilung!
Titus
4

PHP (> = 7,1), 135 131 128 116 110 109 Bytes

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];

Nimmt Eingaben von Befehlszeilenargumenten entgegen. Laufen Sie mit -nroder testen Sie es online .

Nervenzusammenbruch

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
quelle
1
Sie haben die Bytes für das Flag hinzugefügt, oder?
Christopher
@Christopher -rist kostenlos ; Es weist PHP an, Code über das Befehlszeilenargument auszuführen. -nSetzt PHP auf die Standardeinstellungen zurück.
Titus
1
@ JonathanAllan Die dort voreingestellte Version scheint von Ihrem vorherigen Besuch abzuhängen. wahrscheinlich ein Keks.
Titus
3

Python 2 , 150 Bytes

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

Probieren Sie es online aus!

Wie?

Nimmt input()STDIN und entpackt das bereitgestellte Tupel (eine durch Kommas getrennte Folge von Dezimalzahlen wie 3,6) in nund m.

Erstellt ein geordnetes, eindimensionales n*(n-1)langes "Blumenbeet" bdurch Verketten von:
- einer Liste, die [1]wiederholt eine "Blume" enthält m; und
- eine Liste mit einem "Leerzeichen", das [0]mehrmals wiederholt n*~-n-mwird *.

* Der Kaulquappenoperator ~( ~x=-1-x) speichert 2 Bytes n*~-n-manstelle des normal aussehenden n*(n-1)-m.

Mischt (mit randomder shuffleFunktion) dieses Blumenbeet, um die Blumen und Zwischenräume zufällig zwischen den n*(n-1)Positionen zu platzieren.

Durchläuft die 0-indizierten Zeilen rund erstellt printsnacheinander ein zweidimensionales Blumenbeet aus dem eindimensionalen ...

Das letzte zweidimensionale ( n*n) Blumenbeet hat Stiele, seine Reihe unter den Blütenköpfen f, genau dann, wenn kein Blütenkopf zu zeigen ist. Dies wird erreicht, indem XORing ( ^) fmit -swo fund ssind die 1s und 0s von vor und das Ergebnis verwendet, um in die Zeichenfolge der Länge 3 zu indizieren ' &|':

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

Zu erhalten fund sdie zipFunktion wird mit zwei Kopien des eindimensionalen Blumenbeets verwendet, eine mit nnachlaufenden Leerzeichen (die Blütenköpfe) und eine mit nführenden Leerzeichen (die Stiele). Das Ganze wird für jede Zeile erstellt (um Bytes zu sparen), und die erforderliche Zeile wird mit herausgeschnitten [r*n:r*n+n].

Jonathan Allan
quelle
2

Python 2 , 184 179 Bytes

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

Probieren Sie es online aus!

ovs
quelle
2

Python 2 , 129 Bytes

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

Probieren Sie es online aus!

Erzeugt die Ausgabezeichenfolge zeichenweise. Wählt zufällig aus, ob die aktuelle Zelle eine Blume ist, deren Wahrscheinlichkeit der Anzahl mder verbleibenden Blumen geteilt durch die Anzahl der verbleibenden Leerzeichen entspricht. Fügt allen nZeichen eine neue Zeile hinzu . Eine leere Zelle wird mit einem Stamm gefüllt, |wenn das Symbol nam Ende a ist &.

xnor
quelle
1

PHP, 111 Bytes

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];

Online Version

-1 Byte für eine physische Newline

eine Lösung 115 Bytes mit 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];

Auf diese Weise wird mit 137 Bytes der erste Teil der Zeichenfolge gemischt

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
quelle
1

JavaScript (ES6), 157 Byte

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>

Erläuterung: Erstellt ein Array, das das Raster aus Blumen und Zeilenumbrüchen darstellt. Sucht rekursiv zufällig nach leeren Quadraten, in denen Blumen platziert werden sollen, bis die gewünschte Anzahl von Blumen erreicht ist. Schließlich werden die Stängel der Blumen dort erzeugt, wo Platz für sie ist.

Neil
quelle
Aus irgendeinem Grund löst dies einen Fehler aus, wenn n = 2 und m = 3 ist.
Shaggy
@ Shaggy Das liegt daran, dass nur Platz für 2 Blumen ist.
Neil
Ah, ich habe es falsch herum gelesen. Entschuldigung.
Shaggy
1

Holzkohle , 27 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

Nθ

Eingabe n.

Ändern Sie die Standarddruckrichtung nach unten.

FN«

So moft eingeben und schleifen.

J‽θ‽⊖θ

Springe zu einer zufälligen Stelle im Raster.

W⁼KK&J‽θ‽⊖θ

Wenn bereits eine Blume vorhanden ist, springen Sie weiter zu zufälligen Stellen, bis eine geeignete Stelle gefunden wurde.

&

Drucken Sie den Blumenkopf.

¬KK

Drucken Sie den Stiel aus, wenn sich darunter noch kein Blütenkopf befindet.

Neil
quelle