Lampu Lava Sederhana

18

Pengantar:

Saya pikir semua orang tahu apa itu Lampu Lava, tetapi jika mereka tidak:

masukkan deskripsi gambar di sini
(Sumber gambar)

Mereka pada dasarnya tabung gelas yang berisi lilin dalam cairan tembus. Bagian bawah dipanaskan ketika lampu dihidupkan, menyebabkan perubahan kepadatan dan dengan demikian lilin mengapung ke atas. Ketika dingin, ia jatuh lagi, menyebabkan efek yang kita lihat di atas.

Biasanya membutuhkan waktu sekitar 45-60 menit untuk alas lampu naik pada suhu yang cukup tinggi untuk mengubah lilin padat menjadi lilin cair (jika lampu terletak di area pada suhu kamar).

Informasi lebih lanjut tentang Wikipedia, yang juga digunakan sebagai sumber untuk beberapa teks di atas.

Tantangan:

Dengan bilangan bulat positif yang nmenunjukkan jumlah menit yang telah berlalu sejak kami menyalakan Lampu Lava, menghasilkan keadaan acak Lampu Lava berdasarkan bilangan bulat pada lima level.

Untuk tantangan ini, kami akan mengatakan Lampu Lava berisi total 1000 unit lilin, dan kami memiliki lima tingkat di mana lilin itu berada.

1) Jika di nbawah 45, Lampu Lava masih memanas, sehingga output akan menjadi empat baris kosong dengan 1000di bagian bawah:





1000

2) Jika nberada dalam kisaran [45, 60)Lampu Lava telah meningkat dalam suhu yang cukup untuk lilin untuk bergerak, tetapi belum terlalu tinggi. Lilin dapat mencapai hingga dan termasuk tingkat ketiga.
3) Jika nadalah 60atau lebih tinggi, lilin bisa berada di salah satu dari lima tingkat.

Jadi, dengan bilangan bulat positif nsebagai input, kami akan menampilkan keadaan acak dengan mempertimbangkan tiga aturan di atas.

Berikut adalah beberapa contoh output:

Output yang mungkin untuk semua nitu adalah >= 45:



523
106
371


913

87

Output yang mungkin untuk semua nitu adalah >= 60:

73
113
312
5
497
284
55
637

24

Output konstan untuk nitu adalah <= 44(dan kemungkinan output untuk apa saja n):





1000

Aturan tantangan:

  • Mungkin ada baris kosong, meskipun level di atasnya tidak kosong.
  • Tidak 0diizinkan di jalur apa pun. Seharusnya kosong saja.
  • Outputnya agak fleksibel. Anda diizinkan untuk mengeluarkan daftar / larik string / objek alih-alih hasil dibatasi baris baru seperti di atas. Alasan saya mengatakan string / objek adalah karena aturan di atas. Baris kosong harus "", null, [], dll, tapi tidak bisa 0atau bilangan bulat negatif (juga tidak bisa false) (Ie ["", "", 913, "", 87]untuk n >= 45). Anda juga diizinkan untuk membalik output (Yaitu 1000\n\n\n\nbukan \n\n\n\n1000atau [87, null, 913, null, null]bukan [null, null, 913, null, 87]).
  • Semua angka harus bilangan bulat. Dapat berupa desimal dengan 0nilai desimal, tetapi tidak ada angka yang harus memiliki angka desimal, dan bilangan bulat harus selalu dijumlahkan dengan tepat 1000.
  • Semua kemungkinan output acak berdasarkan nharus memiliki peluang yang tidak nol terjadi.
  • Baris baru yang tertinggal (jadi ada enam jalur output) diizinkan.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.
Kevin Cruijssen
sumber
Bisakah level kosong diwakili dengan satu ruang?
Arnauld
@Arnauld Tentu. Dapat berupa apa saja kecuali untuk 0, angka negatif, atau false.
Kevin Cruijssen
Apakah output selalu 5 level, bahkan kapan n < 60?
Emigna
@ Emigna Ya, output selalu 5 level. Hanya untuk n < 451 level yang diisi (atas atau bawah tergantung pada urutan Anda memasukkannya), yaitu 1000. Dengan 45 <= n < 60tiga dari lima, dan dengan n >= 60lima. Tetapi output akan selalu mengandung lima 'baris'.
Kevin Cruijssen

Jawaban:

5

MathGolf , 21 20 byte

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

Cobalah online!

Ini adalah jawaban pertama saya dalam bahasa baru saya. Saya mendasarkan solusi saya pada solusi 05AB1E Emigna, tetapi menggunakan beberapa fitur MathGolf yang rapi untuk membuatnya sedikit lebih pendek.

Penjelasan

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)
maks
sumber
Jika fitur itu sendiri tidak dibangun untuk tantangan ini, tag yang tidak bersaing tidak akan diperlukan. Sejak pertengahan tahun lalu non-bersaing bukan lagi suatu hal. Karena ini sangat baru, saya berasumsi belum ada kompiler online untuk bahasa Anda? Mungkinkah Anda malah menambahkan beberapa tangkapan layar (atau tautan ke tangkapan layar jika itu akan mengacaukan posting terlalu banyak) sebagai verifikasi? Dan saya akan menghubungi @Dennis 'untuk menanyakan apakah bahasa Anda dapat ditambahkan ke TryItOnline .
Kevin Cruijssen
2
@KevinCruijssen Terima kasih atas umpan baliknya! Saya akan menambahkan beberapa tangkapan layar, dan saya sedang berusaha untuk mendapatkan bahasa ke TIO. Saya akan menghubungi Dennis begitu saya merasa bahwa saya tidak terus-menerus menambahkan fitur baru.
Maks
Sudahkah Anda mempertimbangkan untuk membuat ruang untuk bahasa Anda? Saya sangat tertarik mempelajarinya!
Jo King
@JoKing senang mendengar Anda tertarik! Saya akan mencoba membuat kamar akhir pekan ini. Saya baru saja dapat bahasa di TIO berkat Dennis, saya sedang berupaya membuatnya dapat diakses oleh semua orang!
Maks
@ JoKing, saya membuat ruang untuk MathGolf . Saya akan mencoba menjawab pertanyaan apa pun sesegera mungkin, saya tahu dokumentasinya agak belum selesai.
Maks
8

Python 2 , 117 113 108 107 106 105 byte

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

Cobalah online!

Mengembalikan daftar terbalik (pertama di bawah)


Versi yang terinspirasi oleh jawaban stackoverflow di komentar (edgecases lebih mungkin):

Python 2 , 129 byte

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

Cobalah online!

TFeld
sumber
Saya tidak tahu persis bagaimana kode Anda bekerja, tetapi apakah setiap negara bagian memiliki peluang yang tidak nol untuk terjadi? Semua nomor Anda melayang di dekat 333atau 200untuk 3 atau 5 bagian masing-masing. Saya tidak melihat adanya duri / outlier terhadap 0atau 1000. Atau apakah peluang bagi mereka yang secara astronomis kecil (tetapi masih nol) dibandingkan dengan bilangan bulat dekat 333dan 200?
Kevin Cruijssen
1
@KevinCruijssen Setiap 1000 unit lava dimasukkan ke dalam bin acak ( 0atau 0-2atau 0-4), dan dihitung. Kemungkinan tidak ada dari keduanya masuk ke sana, tetapi sangat kecil.
TFeld
Ah ok, itu masuk akal. Sekarang saya juga sudah memahami kode Anda. Terima kasih! +1 dari saya.
Kevin Cruijssen
7

JavaScript (ES6), 78 byte

Mengembalikan array yang terbalik di mana level kosong diisi dengan spasi.

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

Cobalah online!

Berkomentar

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
Arnauld
sumber
Saya sebenarnya memiliki pertanyaan yang sama dengan komentar yang saya buat untuk jawaban Python : Apakah setiap negara bagian memiliki peluang yang tidak nol untuk terjadi?
Kevin Cruijssen
1
1090
Rofl, analogi yang bagus dengan meteorit. ;) Saya sekarang memang melihat bahwa metode Anda mirip dengan jawaban Python dalam hal menempatkan nilai di salah satu dari 3 atau 5 tempat dalam array, hingga hitungan 1000. Jawaban yang bagus, jadi +1 dari saya.
Kevin Cruijssen
6

R , 85 84 byte

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

-1 byte terima kasih kepada @Giuseppe

Cobalah online!

Penjelasan (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)
}
J.Apakah
sumber
Jika NAdiizinkan sebagai baris / elemen kosong, inilah solusi 77 byte ( Coba online! ) Atau solusi 80 byte ( Coba online! ) Jika nama elemennya bermasalah
duckmayr
6

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

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);}

Cobalah online!

Pembaruan : Memperbaiki bug dalam aslinya. Menyatu dalam fungsi pembantu, mengurangi 15 byte tambahan.

Perbarui 2 : -25 byte berkat ErikF.

Perbarui 3 : -1 byte berkat ceilingcat.

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
}

sumber
Anda dapat menghilangkannya puts()dengan menggabungkan pencetakan menjadi satu printf()dan menempatkan pengurangan ke ujung lingkaran. Juga, saya pikir Anda diizinkan untuk memasukkan srand()inisialisasi ke penelepon. Cobalah online!
ErikF
Saya menyadari bahwa saya melewatkan batasan "tidak nol". Ini versi tetapnya: Coba online!
ErikF
Beberapa perubahan terakhir! Cobalah online!
ErikF
Bagus; Saya memutarnya dengan byte tambahan.
1
Juga, kami berhasil! Kami mengalahkan Python!
5

05AB1E , 27 26 25 byte

Menyimpan satu byte, terima kasih kepada Adnan .
Menyimpan byte lain berkat Kevin Cruijssen .

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

Cobalah online!

Penjelasan

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
Emigna
sumber
1
Jawaban bagus! Saya suka cara Anda menggunakan 5Å0dan ǝ, dan ε0Ûpada akhirnya. Saya mencoba untuk membuat sesuatu yang lebih pendek, tetapi saya tidak bisa. Saya punya perasaan itu entah bagaimana masih bisa golf, tapi saya saat ini tidak melihatnya (mungkin tidak bisa dan itu hanya perasaan acak). •A–•60вlebih panjang 1 byte daripada 44 59‚bukannya lebih pendek. Dan ε0Ûuntuk mengganti 0s dengan string kosong juga tampaknya menjadi yang sesingkat mungkin, karena 0Kcukup menghapus 0-item sepenuhnya dan menghilangkan angka apa pun 0di semua angka.
Kevin Cruijssen
1
@KevinCruijssen: Ya, saya sudah mencari dan mencari cara yang lebih singkat 44 59‚, tetapi saya tidak dapat menemukannya ( •H|•2ôjumlah yang sama). Solusi saya sebelumnya (juga 27 byte) yang digunakan 45dan 60yang lebih mudah untuk menghasilkan dengan cara yang berbeda, tapi saya pikir itu tidak valid karena output level 1 , 3 atau 5 tergantung pada input dan tidak selalu 5 .
Emigna
Ah, •H|•2ômemang juga cara yang cerdas, belum memikirkan hal itu. Dan memang harus menghasilkan 5 baris. Saya melihat jawaban Anda sebelumnya dan akan berkomentar hanya menghasilkan 1 baris untuk n < 45, tetapi kemudian Anda menghapusnya. Senang Anda telah menemukan solusi 27-byte lainnya. :)
Kevin Cruijssen
2
Saya pikir ŽH|2ôapa yang Anda cari?
Adnan
2
@KevinCruijssen Kerjanya persis seperti itu. Melakukan penelitian menggunakan jawaban sebelumnya menggunakan 05AB1E dan ini adalah salah satu hal yang saya tambahkan dalam penulisan ulang. Itu tidak memiliki kasus penggunaan lain saat ini.
Adnan
4

JavaScript (Node.js) , 87 86 byte

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):""

Cobalah online!

Solusi 83-byte ( (n/15-2|0)*s<4) disediakan terlebih dahulu karena saya perlu memeriksa yang lebih besar n.

UPDATE: Ya, (n/15-2|0)*s<4tidak berhasil karena untuk yang lebih besar nkarena ncukup besar membuat jumlah gagal mencapai 1000.

Shieru Asakoto
sumber
4

PHP, 92 byte

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

Jalankan sebagai pipa dengan -Ratau coba online .

Titus
sumber
3

Bersih , 215 byte

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

Cobalah online!

Jadi saya akhirnya menemukan cara yang lebih pendek untuk mendapatkan benih acak daripada mengimpor System._Unsafe, System.Timedan menggunakan toInt(accUnsafe time)...
Dan anak laki-laki itu benar-benar dalam semangat codegolf - menanamkan panggilan ke C, mengabaikan jenis negara dunia yang biasanya digunakan untuk memastikan evaluasi urutan hal-hal seperti itu.

Suram
sumber
3

Java (JDK 10) , 121 117 113 111 byte

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

Cobalah online!

Itu bias terhadap menempatkan lebih banyak lilin di dekat bagian atas, tetapi secara teori dimungkinkan untuk setiap pengaturan lilin yang legal muncul.

sunting: 4 byte disimpan oleh @KevinCruijssen

Di Java yang dapat dibaca manusia:

(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;
  }
}
SamYonnou
sumber
2
Math.random()*(w+1)bisa Math.random()*-~wuntuk -2 byte. Berikut tip yang relevan sebagai referensi mengapa. . Jawaban bagus! +1 dari saya. EDIT: Sebenarnya, 2 byte lagi dapat disimpan dengan menggunakan jvariabel sementara sebagai untuk w+1(karena itu akan ditimpa segera setelah di cetak lagi pula) dan gunakan j*=Math.random()sebagai gantinya sehingga Anda tidak akan memerlukan cetakan untuk (int)( 117 byte ).
Kevin Cruijssen
@KevinCruijssen bagus! Saya juga baru memperhatikan bahwa &i>2kondisinya tidak perlu
SamYonnou
3

Powershell , 188 162 byte

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{''}}

Cobalah online!

-2 bytes oleh @Kevin Cruijssen
-4 bytes dengan menghapus Get- kata kerja opsional
-20 bytes dengan memperpendek loop dan menghapus spasi

Edwin
sumber
Hai, selamat datang di PPCG! Jawaban pertama yang bagus! Saya melakukan beberapa pengujian dasar, dan semuanya tampak bekerja dengan baik. Saya tahu hampir tidak apa-apa tentang Powershell, tetapi apakah itu mungkin untuk mengubah else{if($t-ne 1e3){Get-Random(1000-$t)}}ke elseif($t-ne 1e3){Get-Random(1000-$t)}? Saya melihat Anda telah menggunakan elseifkode sebelumnya, jadi ini akan menghemat 2 byte. Juga, mungkin Tips untuk bermain golf di Powershell atau Tips untuk bermain golf di <semua bahasa> mungkin memberikan inspirasi untuk lebih banyak? Selamat menikmati! :)
Kevin Cruijssen
1
benar-benar benar tentang ifelse. Dihapus rekannya yang lain sebelumnya dalam proses. Link juga memberikan inspirasi!
Edwin
2

Pascal (FPC) , 192 190 byte

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.

Cobalah online!

Menggunakan metode packing ke dalam tong oleh TFeld . Mencetak baris bawah terlebih dahulu dengan baris baru tambahan.

Tampaknya FPC tidak memiliki masalah dengan random(0) , jadi saya memiliki beberapa penambahan yang tidak biasa di sana.


Kiriman asli saya, golf hingga 209 byte:

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.

Cobalah online!

AlexRacer
sumber
2

Arang , 37 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

F²F²

Ulangi dua kali, dua kali. Atau saya bisa integer membagi indeks lingkaran dengan 2 untuk jumlah byte yang sama.

‹³⁺ι÷Iθ¹⁵

Jika indeks luar ditambah lima belas suhu lebih besar dari tiga ...

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

... lalu dorong bilangan bulat acak hingga dan termasuk 1000 - jumlahnya sejauh ini. Sayangnya Charcoal tidak dapat menghitung jumlah daftar kosong jadi saya harus mengganti string kosong sebagai gantinya.

⊞υ⁻φΣυ

Dorong jumlah yang tersisa ke daftar.

Eυ⎇ιIιω

Konversikan daftar menjadi string, tetapi gunakan string kosong alih-alih nol.

Neil
sumber
2

Jelly , 28 byte

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

Program lengkap mencetak hasilnya (terbalik, seperti yang diizinkan).

Cobalah online! - ini diubah untuk digunakan7daripadaȷ(1000) karena implementasinya lambat secara golf! (...untukn>59 Daftar 1015 5-tupel dibangun dan kemudian disaring, dari mana untuk memilih)

Bagaimana?

>“,;‘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
Jonathan Allan
sumber
1
" Anda juga diizinkan untuk membalik output (Yaitu 1000\n\n\n\nbukannya \n\n\n\n1000atau [87, null, 913, null, null]bukannya [null, null, 913, null, 87]). " Jadi ya, Anda diizinkan untuk menggunakan versi 28-byte tanpa .
Kevin Cruijssen
2

Ranting , 126 byte

Ini benar-benar tantangan yang menyenangkan!

Kode ini menciptakan makro yang harus diimpor.

{%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%}

Untuk mengimpornya, lakukan saja ini:

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

Ini harus melakukan trik.

Anda dapat mencobanya di https://twigfiddle.com/t4dfgy
Pemberitahuan : Karena halaman menghapus spasi putih, saya terpaksa menambahkan -di akhir baris, untuk membuktikan bahwa itu menghasilkan jumlah baris yang benar.

Pada instalasi reguler, Anda hanya akan melihat baris baru tanpa masalah.

Ismael Miguel
sumber
2

Perl 6 , 62 byte

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

Cobalah online!

Blok kode anonim yang mengambil string dan mengembalikan daftar bilangan bulat, dengan Nilatau daftar kosong ( []) sebagai ganti0 s.

Penjelasan:

{($!=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
Jo King
sumber
2

PHP ,113 108 99 97 93 byte

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

Cobalah online!

-11 byte terima kasih kepada @titus
-9 byte karena semuanya adalah string

Einacio
sumber
2

J , 56 55 54 48 43 40 byte

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

Cobalah online!

-3 byte terima kasih kepada FrownyFrog


Lain metode konseptual yang bagus yang sedikit lebih lama tapi menjamin distribusi sempurna seragam atas segala kemungkinan, per metode di sini :

J , 53 byte

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

Cobalah online!

Jonah
sumber
Tidak $!.a:hanya {.?
FrownyFrog
@FrownyFrog Terima kasih. Saya lupa bahwa mengambil lebih banyak elemen daripada yang tersedia menghasilkan isian "nol".
Jonah
1

Ruby , 62 55 byte

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

Cobalah online!

Tes terbatas pada 0-99 derajat, karena lampu lava bisa berbahaya pada suhu yang lebih tinggi:

GB
sumber
Hai yang disana. Saya khawatir jawaban Anda tidak valid. Saat ini ada 0untuk baris kosong. Baris kosong dalam array bisa berupa apa saja kecuali untuk 0, falseatau angka negatif. Jadi bisa null, "", [], dll, tapi tidak0 . Tidak yakin apakah Ruby memiliki array-array / daftar sehingga Anda dapat mengubah 0s menjadi sesuatu yang lain, tetapi jika tidak, Anda harus mencetaknya alih-alih mengembalikan array / daftar.
Kevin Cruijssen
Memperbaiki, tapi saya pikir itu agak terlalu sewenang-wenang.
GB