Bazı Çiçekler Büyütün!


11

Bahar son zamanlarda geldi ve neredeyse çiçeklerin filizlenmeye başladığı zamandır. Bu yüzden onların büyümesine yardım etmenizi istiyorum.

Senin görevin:

Verilen iki sayı, mve n, çıktı mçiçekleri rastgele bir n*nızgara üzerine yerleştirilir .

Tek bir çiçek şöyle görünür:

&
|

Bir çiçeğin konumu, bulunduğu yere göre tanımlanır &. İki çiçeği rastgele yerleştirirken, hiçbiri aynı yerde olamaz. Bir çiçek If &başka çiçek en örtüşür |, görüntüler &. Çiçeklerin alt sırası hiç içermeyebilir &.

Giriş, standart yöntemlerden herhangi biri aracılığıyla bir sayı veya dize olarak olabilir.

Çıktı dizelerin bir listesi olabilir, her dize kılavuzun bir satırını temsil eder veya listeyle aynı yönergeyi izleyen sınırlandırılmış bir dize olabilir. Standart çıktı yöntemleri. Sondaki ne olursa olsun izin verilir ve çiçeklerinizi ayırmak için sekmeleri kullanabilirsiniz. Her ızgaranın boşluk veya başka bir şeyle tamamen doldurulması gerektiğini unutmayın.

Not girişi her zaman geçerli olacağını, her zaman yasal olarak sığdırmak mümkün olacak miçine çiçek nile nızgara.

Test senaryoları:

Tüm "rastgele yerleştirme" bitinden dolayı sadece çok sıkı test durumları garanti edilebildiğinden, bu, verilen bir cevaba sahip tek tür test vakası olacaktır. Ancak bazı test durumlarını kullanarak geçerli olduklarından emin olmak için tüm gönderimleri çevrimiçi olarak deneyeceğim.

Test senaryoları için girdi formunda verilmiştir m, n.

Input: 2, 2
Output:

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

&&&
&&&
|||

Output:Test durumlarında sözcükten sonraki yeni satırın isteğe bağlı olduğunu unutmayın.

Diğer test örnekleri:

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

Kod golf çok kısa kod kazanır!

Bu meydan okumayı yaptığınız ve Gizli Noel Baba'nın hediye kutusunda paylaştığınız için ComradeSparklePony'e teşekkür ederiz !. Korumalı alan yayını


2
"Rastgele" dediğinizde, olası her sonucun eşit olasılığa sahip olması gerekir mi?
xnor

Yanıtlar:


5

Jöle , 33 bayt

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

Çevrimiçi deneyin!

Nasıl?

²‘;⁹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

Aklım patladı
Christopher

Anlamlarını mı değiştirdin mve nneden yapıyorsun square m? bir nilad nedir?
Titus

Bu 33 karakter gerçekten sadece 33 bayt mı?
Titus

1
@Titus Anlamları değiştirmedim, giriş sırasını değiştirdim (ve bunu yaparken açıklamayı berbat ettim), bu yüzden yakaladığınız için teşekkürler. Bir nilad, (bir monad, bir dyad veya ... aksine), hiçbir girdi almayan ve bir değer döndüren bir fonksiyondur - bir sabit, bir fonksiyon veya programa tek bir girdi gibi. Bunlar gerçekten 33 farklı bayttır - karakterler, Jelly'in başlıktaki bayt kelimesi ile bağlantılı olarak kullandığı 256 baytlık bir kodlamadır .
Jonathan Allan

Beni neredeyse kaybettin rotate. İyi iş; mükemmel arıza!
Titus

4

PHP (> = 7.1), 13513112115110110 109 bayt

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

komut satırı bağımsız değişkenlerinden girdi alır; ile çalıştırın -nrveya çevrimiçi test edin .

Yıkmak

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
    ;

1
Bayrağa bayt eklediniz değil mi?
Christopher

@Christopher -rücretsizdir ; PHP'ye komut satırı bağımsız değişkeninden kod çalıştırmasını söyler. -nPHP'yi varsayılan ayarlara sıfırlar.
Titus

1
@JonathanAllan Oradaki sürüm ön ayarı önceki ziyaretinize bağlı gibi görünüyor; muhtemelen bir çerez.
Titus

3

Python 2 , 150 bayt

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

Çevrimiçi deneyin!

Nasıl?

Alır input()STDIN'den ve sağlanan tuple (virgül gibi ondalık tamsayılar dizesi ayrı paketten çıkarır 3,6içine) nve m.

Birleştirerek sıralı, tek boyutlu n*(n-1)uzun bir "çiçeklik" oluşturur b:
- [1]tekrarlanan "çiçek" içeren bir liste m; ve
- [0]tekrarlanan "boşluk" içeren bir liste n*~-n-m*.

* İribaş operatörü ~( ~x=-1-x) n*~-n-mdaha normal görünüm yerine 2 bayt kaydeder n*(n-1)-m.

(Kullanarak karıştırır random'in shufflefonksiyonu) bu arasında rastgele çiçek ve boşluk yer Flowerbed n*(n-1)pozisyonları.

0 dizinli satırlardan geçer rve printsher biri tek boyutlu olandan iki boyutlu bir çiçek yatağı oluşturmak için ...

Son iki boyutlu ( n*n) çiçek tarhında, sçiçek başlarının altında bir sıra f, sadece ve gösterilecek çiçek başı yoksa sap vardır. Bu dışlayarak (elde edilir ^) file -sburada fve svardır 1ler ve 0önce ve uzunluk 3 dizeye indeksine sonucu kullanarak s ' &|':

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

Elde etmek için fve işlev tek boyutlu flowerbed iki kopya ile bir ile birlikte kullanılır sonunda boşluk (çiçek başları) ve bir gelen boşluklar (sapları). Her şey (baytları kaydetmek için) her satır için oluşturulur ve gerekli satır kullanılarak dilimlenir .szipnn[r*n:r*n+n]


2

Python 2 , 184 179 bayt

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

Çevrimiçi deneyin!


2

Python 2 , 129 bayt

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

Çevrimiçi deneyin!

Çıktı dizesini her seferinde bir karakter oluşturur. Mevcut hücrenin mkalan çiçek sayısına, kalan boşluk sayısına bölünmesine eşit bir çiçek olup olmadığını rastgele seçer . Her nkaraktere yeni satır ekler . Boş hücre, bir sapı ile doldurulur |sembol eğer nucundan bir olduğunu &.


1

PHP, 111 Bayt

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

Çevrimiçi sürüm

-1 Fiziksel bir Yeni Satır için Bayt

max kullanarak bir çözüm 115 bayt

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

137 Byte ile bu şekilde dizenin ilk bölümünü karıştırır

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

1

JavaScript (ES6), 157 bayt

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>

Açıklama: Çiçek ızgarasını ve satırsonlarını temsil eden bir dizi oluşturur. Yinelenen rastgele, istenen çiçek sayısına ulaşılana kadar çiçek yerleştirmek için boş kareler arar. Sonunda çiçeklerin sapları, onlar için yer olan yerlerde üretilir.


Nedense n = 2 ve m = 3 olduğunda bu hata verir.
Shaggy

@Shaggy Çünkü 2 çiçek için sadece yer var.
Neil

Ah, yanlış şekilde okuyordum. Özür.
Shaggy

1

Kömür , 27 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

Nθ

Giriş n.

Varsayılan yazdırma yönünü aşağıya değiştirin.

FN«

mBirçok kez giriş ve döngü.

J‽θ‽⊖θ

Izgara üzerinde rastgele bir konuma atlayın.

W⁼KK&J‽θ‽⊖θ

Zaten bir çiçek varsa, uygun bir nokta bulunana kadar rastgele yerlere atlamaya devam edin.

&

Çiçek kafasını yazdırın.

¬KK

Aşağıda bir çiçek başlığı yoksa sapı yazdırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.