Basit Lav Lambası


18

Giriş:

Sanırım herkes bir Lava Lambasının ne olduğunu biliyor, ancak yapmazlarsa:

resim açıklamasını buraya girin
(Görüntü kaynağı)

Temelde yarı saydam bir sıvı içinde balmumu içeren cam tüplerdir. Lamba açıldığında alt kısım ısıtılır, bu da yoğunlukta bir değişikliğe neden olur ve böylece balmumu üste doğru yüzer. Soğuduğunda tekrar düşer ve yukarıda gördüğümüz etkiye neden olur.

Lambanın, katı balmumunu sıvı balmumuna değiştirecek kadar yüksek sıcaklıkta yükselmesi genellikle 45-60 dakika sürer (lamba oda sıcaklığında bir alanda bulunuyorsa).

Yukarıdaki metnin bir kısmı için kaynak olarak da kullanılan Wikipedia hakkında daha fazla bilgi.

Meydan okuma:

nLava Lambasını açtığımızdan bu yana geçen dakika miktarını gösteren pozitif bir tamsayı verildiğinde , beş seviyedeki tamsayılara dayanarak Lava Lambasının rastgele bir durumunu çıktılayın.

Bu meydan okuma için Lava Lambasının toplamda 1000 birim balmumu içerdiğini ve balmumunun olabileceği beş seviyemiz olduğunu söyleyeceğiz.

1) n45'in altındaysa, Lava Lambası hala ısınmaktadır, bu nedenle çıktı 1000altta dört boş çizgi olacaktır :





1000

2) Eğer n Menzil içinde ise [45, 60), Lava Lambası, balmumunun hareket edebileceği kadar sıcaklıkta artmıştır, ancak henüz çok yüksek değildir. Balmumu üçüncü seviyeye kadar ve bu seviyeye kadar ulaşabilir.
3) Eğer nolan 60daha yüksek, balmumu beş seviyesinde herhangi bir olabilir.

Dolayısıyla n, girdi olarak pozitif tamsayı verildiğinde, yukarıdaki üç kuralı akılda tutarak rastgele bir durum çıkarırız.

Aşağıda bazı örnek çıktılar verilmiştir:

Herhangi olası çıkışlar nolduğunu >= 45:



523
106
371


913

87

Herhangi olası çıkışlar nolduğunu >= 60:

73
113
312
5
497
284
55
637

24

İçin sabit çıkış nolduğunu <= 44(ve herhangi bir olası çıkışn ):





1000

Zorluk kuralları:

  • Yukarıdaki seviye boş olmasa da boş çizgiler olabilir.
  • Sadece 0 herhangi bir hat üzerinde izin verilmez. Bunun yerine boş olmalıdır.
  • Çıktı biraz esnektir. Yukarıdaki gibi yeni satırla ayrılmış bir sonuç yerine bir liste / dizeler / nesneler dizisi çıktısı almanıza izin verilir. Dizeleri / nesneleri söylememin nedeni yukarıdaki kuraldan kaynaklanıyor. Boş hat olmalıdır "", null, []vb, ancak olamaz 0veya negatif bir tam sayıdır (ne de olabilir false(le) ["", "", 913, "", 87]için n >= 45). Çıktıyı tersine çevirmenize de izin verilir (Ie 1000\n\n\n\nyerine \n\n\n\n1000veya [87, null, 913, null, null]yerine[null, null, 913, null, 87] ).
  • Sayıların tümü tamsayı olmalıdır. 0Ondalık değer olarak ondalık sayılar olabilir , ancak sayıların hiçbirinde ondalık basamak olmamalıdır ve tamsayılar her zaman tam olarak toplanmalıdır 1000.
  • Dayalı tüm olası rasgele çıktılar nsıfırdan oluşma şansına sahip olmamalıdır.
  • Sondaki yeni bir satıra (bu nedenle altı çıkış satırı vardır) izin verilir.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart kurallar geçerlidirCevabınız için , bu nedenle STDIN / STDOUT, fonksiyon / yöntemi uygun parametreler ve dönüş tipi, tam programlar ile kullanmanıza izin verilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.


Boş bir seviye tek bir alanla temsil edilebilir mi?
Arnauld

@Arnauld Tabii. 0Negatif bir sayı dışında herhangi bir şey olabilir veya false.
Kevin Cruijssen

Çıktı her zaman 5 seviye n < 60mi?
Emigna

@Emigna Evet, çıktı her zaman 5 seviyedir. İçin n < 45sadece 1 seviye ancak dolu olduğu, (üst ya da alt sırayla Eğer çıkış o bağlı olarak) 1000. Beşten 45 <= n < 60üçü ve beşiyle birlikte n >= 60. Ancak çıktı her zaman beş 'satır' içerecektir.
Kevin Cruijssen

Yanıtlar:


5

MathGolf , 21 20 bayt

5º*♪{k[K∞╟(]m<Σ∞wΦ}σ

Çevrimiçi deneyin!

Bu benim yeni dilimdeki ilk cevabım. Çözümümü Emigna'nın 05AB1E çözümüne dayandırdım, ancak MathGolf'ün bazı özelliklerini biraz daha kısa yapmak için kullandım.

açıklama

5º*                   push 5, [0], multiply (yielding [0,0,0,0,0]
   ♪                  push 1000
    {                 start block
     k                push input as integer
      K∞              push 22 and double it, yielding 44
        ╟(            push 60 and decrease, yielding 59
          α           wrap last two elements in array, yielding [44,59]
           m<         map is less than, giving [0,0], [1,0] or [1,1]
             Σ        sum array, giving 0, 1 or 2
              ∞       double, giving 0, 2 or 4
               w      push random integer in range
                Φ     increase array element
                 }    execute for loop (loops 1000 times)
                  σ   convert to string and remove leading zeroes (implicit map)

Özellikler kendi başına bu meydan okuma için yerleşik değilse, rakip olmayan etiket gerekli olmayacaktır. Geçen yılın ortalarından beri rekabet etmek artık bir şey değil. Çok yeni olduğu için, diliniz için henüz çevrimiçi bir derleyici olmadığını varsayıyorum? Bunun yerine belki de doğrulama olarak bazı ekran görüntüleri (veya yayını çok fazla karıştıracaksa ekran görüntülerine bağlantılar) ekleyebilir misiniz? Dilinizin TryItOnline'a eklenip eklenemeyeceğini sormak için @Dennis 'ile iletişime geçirdim .
Kevin Cruijssen

2
@KevinCruijssen Geri bildiriminiz için teşekkür ederiz! Bazı ekran görüntüleri ekleyeceğim ve dili TIO'ya almak için çalışıyorum. Sürekli yeni özellikler eklemediğimi hissettiğimde Dennis'le iletişime geçeceğim.
maxb

Diliniz için bir oda yaratmayı düşündünüz mü ? Öğrenmekle çok ilgileniyorum!
Jo King

@JoKing ilgilendiğini duyduğuma sevindim! Bu hafta sonu bir oda yaratmaya çalışacağım. Dennis sayesinde dili sadece TIO'ya aldım, herkes için erişilebilir hale getirmeye çalışıyorum!
maxb

@JoKing MathGolf için bir oda oluşturdum . En kısa sürede herhangi bir soruya cevap vermeye çalışacağım, belgelerin biraz bitmediğini biliyorum.
maxb

8

Python 2 , 117 113 108 107 106 105 bayt

from random import*
def f(n):a=['']*5;exec"i=randint(0,(n>44)+(n>59)<<1);a[i]=(a[i]or 0)+1;"*1000;print a

Çevrimiçi deneyin!

Ters çevrilmiş bir liste döndürür (önce alt kısım)


Yorumlardaki stackoverflow yanıtından esinlenen sürüm (edgecases daha olasıdır):

Python 2 , 129 bayt

from random import*
def f(n):a=sorted([1000]*5+sample(range(1001)*5,(n>44)+(n>59)<<1));print[y-x or''for x,y in zip([0]+a,a)[:5]]

Çevrimiçi deneyin!


Kodunuzun nasıl çalıştığını tam olarak bilmiyorum, ancak her durumun sıfır olmayan bir şansı var mı? Tüm numaralarınız sırayla 3 veya 5 parçanın yanında 333ya da üzerinde durmaktadır 200. 0Veya yönünde herhangi bir artış / aykırı değer görmüyorum 1000. Yoksa 333ve yakınlarındaki tamsayılara kıyasla sadece astronomik olarak küçük (ama yine de sıfır olmayanlar) şansı 200?
Kevin Cruijssen

1
@KevinCruijssen 1000 lav ünitesinin her biri rastgele bir kutuya ( 0veya 0-2veya 0-4) konur ve sayılır. O zaman ikisinden birine girme şansı yoktur, ama çok küçüktür.
TFeld

Ah tamam, bu mantıklı. Şimdi kodunuzu daha iyi anlıyorum. Teşekkürler! Benden +1.
Kevin Cruijssen

7

JavaScript (ES6), 78 bayt

Boş seviyelerin boşlukla doldurulduğu ters çevrilmiş bir dizi döndürür.

t=>(a=[...'     '],g=k=>k?g(k-1,a[Math.random()*(t>59?5:t<45||3)|0]++):a)(1e3)

Çevrimiçi deneyin!

Yorumlananlar

t => (                      // t = input
  a = [...'     '],         // a[] = output array, initially filled with 5 spaces
  g = k =>                  // g = recursive function taking an iteration counter k
    k ?                     //   if k is not equal to zero:
      g(                    //     do a recursive call:
        k - 1,              //       decrement k
        a[                  //       update a[]:
          Math.random() * ( //         pick a random slot:
            t > 59 ? 5 :    //           among all 5 slots if t > 59
            t < 45          //           force the 1st slot if t < 45
            || 3            //           among the 3 first slots otherwise
          ) | 0             //         round the above result to an integer
        ]++                 //       increment the wax amount on this slot
      )                     //     end of recursive call
    :                       //   else:
      a                     //     stop recursion and return a[]
)(1e3)                      // initial call to g() with k = 1000

Aslında Python cevabı için yaptığım yorumla aynı sorum var : Her eyaletin sıfırdan farklı olma şansı var mı?
Kevin Cruijssen

1
1090

Rofl, göktaşıyla güzel benzetme. ;) Şimdi gerçekten yönteminizin Python cevabına benzediğini görüyorum, çünkü 1000'e kadar dizideki 3 veya 5 noktadan birine değerler koyar. Güzel cevap, benden +1.
Kevin Cruijssen

6

R , 85 84 bayt

function(n)write(ifelse(t<-table(cut(runif(1e3,2*(n<60)+3*(n<45),5),0:5)),t,""),1,1)

@Giuseppe sayesinde -1 bayt

Çevrimiçi deneyin!

Açıklama (ungolfed):

function(n){
      # Generate 1000 random uniform numbers in [5,5] (if n<45),
      # in [2,5] (if 45<=n<60) and in [0,5] (if n>=60).
    x = runif(1e3,2*(n<60)+3*(n<45),5) 
      # Code each by the number of the interval it falls in (0,1],(1,2]...(4,5]
    cx = cut(x,0:5)
      # Tabulate the intervals. Because cut() returns a factor,
      # zero counts are included 
    t = table(cx)
      # Vector-wise replace zero elements with "" and cat out, 1 per line.
    t1 = ifelse(t,t,"")
    write(t1,1,1)
}

Eğer NAboş satır / eleman olarak izin verilir, burada bir 77 bayt çözeltisi (var ! Çevrimiçi Deneyin ) veya bir 80 bayt çözeltisi ( ! Çevrimiçi deneyin eleman isimleri bir sorun varsa)
duckmayr

6

C (gcc) , 131 , 116 , 90 , 89 , 87 bayt

L(l,a,v,A){for(A=5,v=1e3;A--;v-=a)printf("%d\n"+!a*2,a=l>59|A<3&l>44?rand()%-~v:!A*v);}

Çevrimiçi deneyin!

Güncelleme : Orijinaldeki bir hata düzeltildi. Ek 15 bayt azaltarak yardımcı işlevinde kaynaşmış.

Güncelleme 2 : ErikF sayesinde -25 bayt.

Ceilingcat sayesinde güncelleme 3 : -1 bayt.

Degolf

L(l,a,v,A){
    for(A=5,v=1e3;A--;v-=a)
        printf("%d\n"+!a*2, // No clue how this works anymore, but it'll advance the pointer 
                            // to the string constant when a number shouldn't be printed.
        a=l>59|A<3&l>44?rand()%-~v // Random integer to print in [0, v]
        :!A*v); // If bottom layer, return remaining volume
}

puts()Baskıyı tek bir birleştirerek printf()ve çıkartmayı ilmek ucuna koyarak ortadan kaldırabilirsiniz . Ayrıca, srand()başlatmayı arayana koymanıza izin verildiğini düşünüyorum . Çevrimiçi deneyin!
ErikF

"Sıfır yok" kısıtlamasını kaçırdığımı fark ettim. İşte sabit sürüm: Çevrimiçi deneyin!
ErikF

Bazı son değişiklikler! Çevrimiçi deneyin!
ErikF

Harika; Ek bir bayt tarafından aşağı golf.

1
Ayrıca başardık! Python'u yendik!

5

05AB1E , 27 26 25 bayt

Adnan sayesinde bayt kurtardı . Kevin Cruijssen
sayesinde başka bir bayt kurtardı .

5Å0₄FD„,;ÇI‹O·ÝΩ©è>®ǝ]ε0Û

Çevrimiçi deneyin!

açıklama

5Å0                         # initialize with a list of 5 zeroes
   ₄F                       # 1000 times do:
     D                      # duplicate the list
      „,;ÇI‹                # check if the input is larger than 44 and/or 59
            O·              # sum and double, yielding (0,2 or 4)
             ÝΩ             # pick a random number between and 0 and the number above
               ©è           # get the count in that level
                 >          # increment it
                  ®ǝ        # insert it at the same position
                     ]      # end loop
                      ε0Û   # remove leading zeroes on each level

1
Güzel cevap! Ben kullandığınız yolu gibi 5Å0ve ǝve ε0Ûsonunda. Daha kısa bir şey bulmaya çalıştım, ama yapamıyorum. Ben bir şekilde hala golf olabilir hissediyorum var, ama şu anda görmüyorum (belki de göremez ve bu sadece rastgele bir duygu). •A–•60в, 44 59‚kısaltmak yerine 1 bayt daha uzun . Ve boş dizelerle s'yi ε0Ûdeğiştirmek 0de mümkün olan en kısa gibi görünüyor, çünkü 0K0 öğelerini tamamen kaldırıyor 0ve tüm sayılardaki herhangi bir rakamı kaldırıyor .
Kevin Cruijssen

1
@KevinCruijssen: Evet, daha kısa bir yol bulmak için baktım ve baktım 44 59‚, ama bulamıyorum ( •H|•2ôaynı sayı). Benim önceki çözüm (ayrıca 27 bayt) kullanılan 45ve 60farklı şekillerde üretmek daha kolay, ama her zaman değil 5 , girişine bağlı olarak 1 , 3 veya 5 seviyeleri çıktı olarak bu geçersiz olduğunu düşünüyorum .
Emigna

Ah, •H|•2ôgerçekten de akıllı bir yol, bunu düşünmemişti. Ve gerçekten de 5 satır vermelidir. Gerçekten önceki cevabınızı gördüm ve sadece 1 satır çıktı için yorum yapmak üzereydim n < 45, ama sonra sildiniz. 27 baytlık başka bir çözüm bulduğunuza sevindim. :)
Kevin Cruijssen

2
Bence ŽH|2ôaradığın şey bu mu?
Adnan

2
@KevinCruijssen Aynen böyle davranıyor. 05AB1E kullanarak önceki yanıtları kullanarak biraz araştırma yaptım ve bu yeniden yazımda eklediğim şeylerden biriydi. Şu anda başka kullanım durumu yok.
Adnan

4

JavaScript (Node.js) , 87 86 bayt

f=(n,w=1e3,s=5,r=n<45|n<60&s<4|s<2?w:Math.random()*w|0)=>s?`${r||""}
`+f(n,w-r,s-1):""

Çevrimiçi deneyin!

83 baytlık çözüm ( (n/15-2|0)*s<4) ayrılmıştır, çünkü daha büyük olup olmadığını kontrol etmem gerekir n.

GÜNCELLEME: Evet, (n/15-2|0)*s<4 çünkü büyük için işe yaramadı nçünkü nyeterince büyük toplamı 1000 varamaması yapar.


4

PHP, 92 bayt

$i=5;for($n=1e3;$i--;$n-=$x)echo($x=rand($i?0:$n,$i<($argn<60?$argn<45?:3:5)?$n:0))?:"","
";

Pipo ile çalıştırın -Rveya çevrimiçi deneyin .


3

Temiz , 215 bayt

import StdEnv,Math.Random,Text
? ::!Int->Int
?_=code{ccall time "I:I"
}
$n#l=take(max(2*min(n/15-2)2)0+1)(genRandReal(?0))
#l=map toInt[1E3*e/sum l\\e<-l]
|sum l==1000=map(\v|v>0=v<+"\n"="\n")(l++repeat 0)%(0,4)= $n

Çevrimiçi deneyin!

Sonunda ithal daha rastgele tohum almak için daha kısa bir yol buldum Yani System._Unsafe, System.Timeve kullanma toInt(accUnsafe time)...
Ve çocuk codegolf ruhu içinde gerçekten bu - normalde değerlendirmeyi sağlamak için kullanılır Dünya devlet türünü görmezden, C çağrısı katıştırma böyle şeylerin sırası.


3

Java (JDK 10) , 121 117 113 111 bayt

m->{for(int w=1000,j,i=5;i-->0;w-=j=i>0?j*=Math.random():w,System.out.println(j<1?"":j))j=m>59|m>44&i<3?w+1:0;}

Çevrimiçi deneyin!

Yukarıya daha fazla balmumu koymak için önyargılıdır, ancak teorik olarak herhangi bir yasal balmumu düzenlemesinin ortaya çıkması mümkündür.

düzenleme: 4 bytes @KevinCruijssen tarafından kaydedildi

İnsan tarafından okunabilen Java'da:

(int minutes /* golfed variable m */) -> {
  int waxRemaining = 1000; // golfed variable w

  // golfed version goes from index 4 to 0 in a bit of a roundabout way
  // starting at 5 but decrementing right away
  for (int level = 4 /* golfed variable i */; level <= 0; level--) {
    // golfed variable j
    // the golfed version initializes this to (waxRemaining + 1)
    // in order to juice out some extra bytes during the Math.random() call
    int waxAtLevel = 0;

    // the golfed version does all of these ifs as ternary operations
    // and avoids using 2-character operators wherever possible
    // so e.g. "a == 0" becomes "a<1" and "a && b" becomes "a&b"
    // since here we are certain things can't be negative,
    // and took a good look at the Java operator precedence cheat-sheet
    // to make sure "&" and "|" would work properly to give a truthy value
    if (level == 0) {
      // if we are at the bottom level, just put the rest of the wax there
      waxAtLevel = waxRemaining;
    } else if (minutes >= 60 || (minutes >= 45 && level < 3)) {
      // otherwise if we are at a legal level put a random portion of the remaining wax there
      // note: the random portion can be between 0 and waxRemaining inclusive
      waxAtLevel = (int) (Math.random() * (waxRemaining + 1));
    }

    if (waxAtLevel > 0) {
      // only print the amount of way at this level if its greater than 0
      System.out.print(waxAtLevel);
    }
    System.out.println();

    waxRemaining -= waxAtLevel;
  }
}

2
Math.random()*(w+1)olabilir Math.random()*-~w-2 bayt. İşte ilgili ipucu referans olarak neden. . Güzel cevap! Benden +1. DÜZENLEME: Aslında, jgeçici olarak değişken olarak kullanılarak 2 bayt daha kaydedilebilir w+1(çünkü zaten yazdırma işleminden hemen sonra üzerine yazılacaktır) ve j*=Math.random()bunun yerine kullanımı (int)( 117 bayt ) gerekmez .
Kevin Cruijssen

@KevinCruijssen iyi! Ayrıca sadece &i>2durumun gerekli olmadığını fark ettim
SamYonnou

3

Güç kalkanı , 188 162 bayt

param($m);$t=0;$a=,0*5;$s=if($m-lt45){4}elseif($m-lt60){2}else{0};$s..4|%{$t+=$a[$_]=if($_-eq4){1e3-$t}elseif($t-ne1e3){Random(1000-$t)}}$a|%{if($_){$_}else{''}}

Çevrimiçi deneyin!

@Kevin Cruijssen tarafından -2 bayt-
isteğe bağlı Getb fiili kaldırarak -4 bayt
döngüsü kısaltarak ve boşlukları kaldırarak


Merhaba, PPCG'ye hoş geldiniz! Harika ilk cevap! Bazı temel testler yaptım ve her şey harika çalışıyor. Ben PowerShell hakkında zar zor bir şey biliyorum, ama değiştirmek mümkündür else{if($t-ne 1e3){Get-Random(1000-$t)}}için elseif($t-ne 1e3){Get-Random(1000-$t)}? elseifKodunuzda daha önce kullandığınızı görüyorum , bu size 2 bayt kazandırır. Ayrıca, Powershell'de golf için ipuçları veya <tüm dillerde> golf için ipuçları daha fazlası için ilham verebilir mi? Keyfini çıkarın! :)
Kevin Cruijssen

1
ifelse hakkında tamamen doğru. İşlemin başlangıcında diğer karşılığı kaldırıldı. Link biraz ilham verdi!
Edwin

2

Pascal (FPC) , 192190 bayt

var n,a:word;z:array[0..4]of word;begin read(n);if n>44then a:=a+3;if n>59then a:=a+2;Randomize;for n:=0to 999do inc(z[random(a)]);for n:=0to 4do if z[n]>0then writeln(z[n])else writeln end.

Çevrimiçi deneyin!

kullanma TFeld tarafından kutuları yöntem haline paketleme . Önce alt satırı sondaki satırsonu ile yazdırır.

Görünüşe göre FPC ile ilgili problemleri yok random(0) , bu yüzden orada alışılmadık bir ekleme var.


Benim orijinal gönderimi, 209 bayt aşağı golf:

var n,i,a,r:int32;begin read(n);if n>44then a:=a-2;if n>59then a:=a-2;r:=1000;Randomize;for i:=-3to-0do begin if i>a then begin n:=random(r+1);if n>0then write(n);r:=r-n;end;writeln;end;if r>0then write(r)end.

Çevrimiçi deneyin!


2

Kömür , 37 bayt

F²F²⊞υ∧‹³⁺ι÷Iθ¹⁵‽⊕⁻φΣ∨υω⊞υ⁻φΣυEυ⎇ιIιω

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

F²F²

İki kez, iki kez döngü. Alternatif olarak, aynı bayt sayısı için döngü indeksini 2'ye bölerdim.

‹³⁺ι÷Iθ¹⁵

Dış endeks artı sıcaklığın on beşte biri üçten büyükse ...

⊞υ∧...‽⊕⁻φΣ∨υω

... o zamana kadar toplamı içeren 1000'e kadar rastgele bir tamsayı itin. Ne yazık ki Kömür boş bir listenin toplamını hesaplayamıyor, bu yüzden bunun yerine boş dizeyi değiştirmek zorundayım.

⊞υ⁻φΣυ

Artan miktarı listeye itin.

Eυ⎇ιIιω

Listeyi dizeye dönüştürün, ancak sıfır yerine boş dizeyi kullanın.


2

Jöle , 28 bayt

>“,;‘SḤ‘µȷŻṗS⁼¥ƇȷX;0ẋ5¤ḣ5Yḟ0

Sonucu basan tam bir program (izin verildiği gibi baş aşağı).

Çevrimiçi deneyin! - buuygulama (1000)7yerinekullanılmak üzere değiştirildiȷçünkü uygulama golf-tastik olarak yavaş! (...içinn>59 bir listesi 1015 5-tüpler inşa edilir ve daha sonra filtrelenir, arasından seçim yapılır)

Nasıl?

>“,;‘SḤ‘µȷŻṗS⁼¥ƇȷX;0ẋ5¤ḣ5Yḟ0 - Main Link: integer, n
 “,;‘                        - list of code-page indices = [44,59]
>                            - greater than? (vectorises)
     S                       - sum (i.e. 0, 1 or 2)
      Ḥ                      - double (i.e 0, 2 or 4)
       ‘                     - increment (i.e. 1, 3 or 5)
        µ                    - start a new monadic link, call that x (i.e. f(x))
         ȷ                   - literal 1000
          Ż                  - zero-range = [0,1,2,...,1000]
           ṗ                 - Cartesian power (all tuples of length x using those numbers)
               Ƈ             - filter keep if:
              ¥              -   last two links as a dyad:
            S                -     sum
             ⁼  ȷ            -     equals 1000? (i.e. only valid tuples)
                 X           - random choice (get one of these tuples)
                      ¤      - nilad followed by link(s) as a nilad:
                   0         -   zero
                    ẋ5       -   repeat five times = [0,0,0,0,0]
                  ;          - concatenate     (e.g. [354,388,258,0,0,0,0,0])
                       ḣ5    - head to index 5 (e.g. [354,388,258,0,0])
                         Y   - join with newlines
                          ḟ0 - filter out zeros
                             - implicit print

1
" Çıktıyı tersine çevirmenize de izin veriliyor ( 1000\n\n\n\nyerine \n\n\n\n1000veya [87, null, 913, null, null]yerine [null, null, 913, null, 87]). " Evet, 28 baytlık sürümü kullanmadan da izin veriliyor .
Kevin Cruijssen

2

Dal , 126 bayt

Bu gerçekten eğlenceli bir mücadeleydi!

Bu kod içe aktarılması gereken bir makro oluşturur.

{%macro a(s,z=1000)%}{%for _ in 4..1%}{%set t=s>59or(s>44and _<3)?random(z):''%}{%set z=z-t%}{{t}}
{%endfor%}{{z}}{%endmacro%}

İçe aktarmak için şunu yapın:

{%- import 'macro.twig' as a -%}
{{- a.a(50) -}}

Bu hile yapmalı.

Https://twigfiddle.com/t4dfgy adresinde deneyebilirsiniz.
Uyarı : Sayfa boşlukları kaldırarak bir reklam eklemek zorunda kaldım- , doğru sayıda satır çıktığını kanıtlamak için satırın sonuna .

Düzenli bir kurulumda, yeni satırları sorunsuz görürsünüz.


2

Perl 6 , 62 bayt

{($!=1e3)||@,|((+$!-($!-=$!.rand+|0)||@)xx($_/15+|0)*2-4)[^4]}

Çevrimiçi deneyin!

Bir dize alan ve Nilboş bir liste içeren bir tamsayı listesi döndüren anonim bir kod bloğu ([] alan ve 0s yerine ) .

Açıklama:

{($!=1e3)||@,|((+$!-($!-=$!.rand+|0)||@)xx($_/15+|0)*2-4)[^4]}
{                                                            }  # Anonymous code block
 ($!=1e3)  # Initialise $! to 1000
                +$!-($!-=$!.rand+|0)     # Pick a random value from 0 to $!
                                    ||@  # Or an empty array if it is zero
            ,  (                       )xx  # Repeat this
                                          ($_/15+|0)*2-4  # The given value mapped to 0,2,4
             |(                                         )[^4] # Get the first four values
 ($!    )||@  # Where the first value is the leftover number in $! or an empty array

2

PHP ,113 108 99 97 93 bayt

<?php $i=$argv[1];while($a++<1e3){${r.rand(1,$i<60?$i<45?:3:5)}++;}echo"$r5
$r4
$r3
$r2
$r1";

Çevrimiçi deneyin!

@Titus sayesinde -11 bayt
-9 bayt çünkü her şey bir dize


2

J , 56 55 54 48 43 40 bayt

5{.1e3(2<@-/\[,0,~[:\:~?@$~)2*1#.>&44 59

Çevrimiçi deneyin!

FrownyFrog sayesinde -3 bayt


Biraz daha uzun olan, ancak buradaki yönteme göre tüm olasılıklar üzerinde mükemmel bir şekilde dağılımı garanti eden bir başka kavramsal olarak güzel yöntem :

J , 53 bayt

5$!.a:[:<@(+/);._1 0:,(1e3#1)({~#?#)@,0$~2*1#.>&44 59

Çevrimiçi deneyin!


$!.a:Sadece değil {.mi?
FrownyFrog

@FrownyFrog Teşekkürler. Mevcut olandan daha fazla eleman almanın "sıfır" dolgusuyla sonuçlandığını unutmuştum.
Jonah


1

Yakut , 62 55 bayt

->n{w=1000;[4,4,3,3].map{|r|r*15>n||w-=q=rand(w);q}<<w}

Çevrimiçi deneyin!

Testler 0-99 derece ile sınırlıdır, çünkü lav lambaları daha yüksek sıcaklıklarda tehlikeli olabilir :


Merhaba. Korkarım cevabınız geçersiz. Şu anda 0boş satırlar için var. Dizideki boş satır haricinde herhangi bir şey olabilir 0, falseya da negatif bir sayı. O olabilir Yani null, "", [], vb, ancak 0. Ruby'nin nesne dizileri / listeleri olup olmadığından emin değilsiniz, böylece 0s'yi başka bir şeye dönüştürebilirsiniz , ancak değilse bir dizi / liste döndürmek yerine bunları yazdırmanız gerekir.
Kevin Cruijssen

Düzeltildi, ama bence biraz fazla keyfi.
GB
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.