Prosta lampa lawowa

18

Wprowadzenie:

Myślę, że wszyscy wiedzą, co to jest lampa lawowa, ale w przypadku, gdy nie:

wprowadź opis zdjęcia tutaj
(Źródło obrazu)

Są to w zasadzie szklane rurki, które zawierają wosk w półprzezroczystej cieczy. Dolna część jest podgrzewana po włączeniu lampy, co powoduje zmianę gęstości, a wosk unosi się na górze. Kiedy ostygnie, ponownie spada, powodując efekt, który widzimy powyżej.

Zazwyczaj podstawa lampy potrzebuje około 45-60 minut, aby temperatura wzrosła wystarczająco wysoko, aby zmienić stały wosk na ciekły wosk (jeśli lampa znajduje się w obszarze o temperaturze pokojowej).

Więcej informacji na temat Wikipedii, która jest również używana jako źródło niektórych powyższych tekstów.

Wyzwanie:

Biorąc pod uwagę dodatnią liczbę całkowitą nwskazującą liczbę minut, które upłynęły od włączenia lampy Lava, generuj losowy stan lampy Lava na podstawie liczb całkowitych na pięciu poziomach.

W tym wyzwaniu powiemy, że lampa Lava zawiera łącznie 1000 jednostek wosku i mamy pięć poziomów, na których może znajdować się wosk.

1) Jeśli njest poniżej 45, lampa lawowa nadal się nagrzewa, więc na wyjściu będą cztery puste linie z 1000dolnym:





1000

2) Jeśli nznajduje się w tym zakresie, [45, 60)lampa lawy wzrosła do temperatury wystarczającej do poruszania się wosku, ale jeszcze nie jest bardzo wysoka. Wosk może osiągnąć poziom trzeci włącznie.
3) Jeśli njest 60wyższy lub wyższy, wosk może znajdować się na dowolnym z pięciu poziomów.

Więc biorąc pod uwagę dodatnią liczbę całkowitą njako dane wejściowe, wyprowadzimy stan losowy z uwzględnieniem trzech powyższych reguł.

Oto kilka przykładowych wyników:

Możliwe wyniki dla każdego, nktóry jest >= 45:



523
106
371


913

87

Możliwe wyniki dla każdego, nktóry jest >= 60:

73
113
312
5
497
284
55
637

24

Stałe wyjście dla ntego jest <= 44(i możliwe wyjście dla dowolnego n):





1000

Zasady konkursu:

  • Mogą być puste linie, nawet jeśli poziom nad nim nie jest pusty.
  • Po prostu 0nie jest dozwolone na żadnej linii. Zamiast tego powinien być pusty.
  • Dane wyjściowe są dość elastyczne. Możesz wyprowadzać listę / tablicę ciągów / obiektów zamiast wyniku rozdzielanego znakiem nowej linii, jak wyżej. Powód, dla którego mówię, że łańcuchy / obiekty wynika z powyższej reguły. Pusta linia powinna być "", null, [], itd., Ale nie może być 0lub liczba całkowita ujemna (ani nie może być false) (Ie ["", "", 913, "", 87]dla n >= 45). Możesz także odwrócić dane wyjściowe (tj. 1000\n\n\n\nZamiast \n\n\n\n1000lub [87, null, 913, null, null]zamiast [null, null, 913, null, 87]).
  • Wszystkie liczby powinny być liczbami całkowitymi. Mogą być ułamkami 0dziesiętnymi o wartości dziesiętnej, ale żadna z liczb nie powinna zawierać cyfr dziesiętnych, a liczby całkowite powinny zawsze sumować dokładnie 1000.
  • Wszystkie możliwe losowe wyjścia oparte na npowinny mieć niezerową szansę wystąpienia.
  • Końcowy nowy wiersz (więc jest sześć wierszy wyniku) jest dozwolony.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.
Kevin Cruijssen
źródło
Czy pusty poziom może być reprezentowany pojedynczą spacją?
Arnauld,
@Arnauld Sure. Może być czymkolwiek oprócz 0liczby ujemnej lub false.
Kevin Cruijssen
Czy wyjście zawsze ma 5 poziomów, nawet gdy n < 60?
Emigna,
@Emigna Tak, wyjście ma zawsze 5 poziomów. Jednak n < 45tylko 1 poziom jest wypełniony (górny lub dolny w zależności od kolejności, w jakiej go wypisujesz), czyli 1000. Z 45 <= n < 60trzema z pięciu i ze n >= 60wszystkimi pięcioma. Ale wynik zawsze będzie zawierał pięć „linii”.
Kevin Cruijssen

Odpowiedzi:

5

MathGolf , 21 20 bajtów

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

Wypróbuj online!

To jest moja pierwsza odpowiedź w moim nowym języku. Oparłem swoje rozwiązanie na rozwiązaniu Emigna 05AB1E, ale wykorzystałem kilka ciekawych funkcji MathGolf, aby nieco go skrócić.

Wyjaśnienie

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)
maxb
źródło
Jeśli funkcje same w sobie nie są wbudowane w to wyzwanie, niekonkurencyjny tag nie będzie konieczny. Od połowy ubiegłego roku niekonkurowanie nie jest już niczym. Ponieważ jest bardzo nowy, zakładam, że nie ma jeszcze kompilatora online dla twojego języka? Czy zamiast tego możesz dodać jakieś zrzuty ekranu (lub linki do zrzutów ekranu, jeśli zbyt mocno zaśmiecają one post) jako weryfikację? I skontaktowałbym się z @Dennis ', aby zapytać, czy Twój język może zostać dodany do TryItOnline .
Kevin Cruijssen
2
@KevinCruijssen Dzięki za opinię! Dodam kilka zrzutów ekranu i pracuję nad wprowadzeniem języka do TIO. Skontaktuję się z Dennisem, gdy tylko poczuję, że nie dodajemy nowych funkcji.
maks.
Czy zastanawiałeś się nad stworzeniem pokoju dla swojego języka? Jestem bardzo zainteresowany nauczeniem się tego!
Jo King,
@JoKing cieszę się, że jesteś zainteresowany! Spróbuję stworzyć pokój w ten weekend. Właśnie dostałem język na TIO dzięki Dennisowi, pracuję nad tym, aby był dostępny dla wszystkich!
maks.
@JoKing Stworzyłem pokój dla MathGolf . Postaram się odpowiedzieć na wszelkie pytania tak szybko, jak to możliwe, wiem, że dokumentacja jest nieco niedokończona.
maks.
8

Python 2 , 117 113 108 107 106 105 bajtów

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

Wypróbuj online!

Zwraca listę odwróconą (najpierw na dole)


Wersja inspirowana odpowiedzią stackoverflow w komentarzach (bardziej prawdopodobne są edgecases):

Python 2 , 129 bajtów

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

Wypróbuj online!

TFeld
źródło
Nie wiem dokładnie, jak działa Twój kod, ale czy każdy stan ma niezerową szansę wystąpienia? Wszystkie numery są unoszące się w pobliżu 333lub 200na 3 lub 5 części odpowiednio. Nie widzę żadnych skoków / wartości odstających w kierunku 0lub 1000. Czy są szanse dla tych po prostu astronomicznie małych (ale wciąż niezerowych) w porównaniu do liczb całkowitych bliskich 333i 200?
Kevin Cruijssen
1
@KevinCruijssen Każda z 1000 jednostek lawy jest umieszczana w losowym pojemniku ( 0lub 0-2lub 0-4) i liczona. Szanse na to, że nikt nie wejdzie w któreś z nich, są bardzo małe.
TFeld,
Ach, ok, to ma sens. Teraz również lepiej rozumiem twój kod. Dzięki! +1 ode mnie
Kevin Cruijssen
7

JavaScript (ES6), 78 bajtów

Zwraca odwróconą tablicę, w której puste poziomy są wypełnione spacją.

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

Wypróbuj online!

Skomentował

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
źródło
Mam takie samo pytanie jak w komentarzu do Pythona : Czy każdy stan ma niezerową szansę wystąpienia?
Kevin Cruijssen
1
1090
Rofl, niezła analogia do meteorytu. ;) Teraz naprawdę widzę, że twoja metoda jest podobna do odpowiedzi w Pythonie, ponieważ umieszcza wartości w jednym z 3 lub 5 miejsc w tablicy, do liczby 1000. Ładna odpowiedź, więc +1 ode mnie.
Kevin Cruijssen,
6

R , 85 84 bajtów

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

-1 bajt dzięki @Giuseppe

Wypróbuj online!

Objaśnienie (bez golfa):

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.Doe
źródło
Jeśli NAjest dozwolony jako pusty wiersz / element, oto rozwiązanie 77-bajtowe ( Wypróbuj online! ) Lub rozwiązanie 80-bajtowe ( Wypróbuj online! ), Jeśli nazwy elementów stanowią problem
duckmayr
6

C (gcc) , 131 , 116 , 90 , 89 , 87 bajtów

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

Wypróbuj online!

Aktualizacja : Naprawiono błąd w oryginale. Włączono funkcję pomocniczą, zmniejszając dodatkowe 15 bajtów.

Aktualizacja 2 : -25 bajtów dzięki ErikF.

Aktualizacja 3 : -1 bajtów dzięki pułapkowi cat.

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
}

źródło
Możesz wyeliminować puts(), łącząc drukowanie w jeden printf()i umieszczając odejmowanie na końcu pętli. Ponadto myślę, że możesz srand()zainicjować dzwoniącego. Wypróbuj online!
ErikF
Zrozumiałem, że brakowało mi ograniczenia „zero zer”. Oto poprawiona wersja: Wypróbuj online!
ErikF
Kilka ostatnich poprawek! Wypróbuj online!
ErikF
Świetny; Grałem w golfa o dodatkowy bajt.
1
Zrobiliśmy to! Pokonaliśmy Pythona!
5

05AB1E , 27 26 25 bajtów

Oszczędność bajtu dzięki Adnanowi .
Zaoszczędził kolejny bajt dzięki Kevin Cruijssen .

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

Wypróbuj online!

Wyjaśnienie

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
źródło
1
Niezła odpowiedź! Lubię sposób, w jaki zostały wykorzystane 5Å0i ǝ, i ε0Ûna końcu. Próbowałem wymyślić coś krótszego, ale nie jestem w stanie. Mam wrażenie, że można w jakiś sposób grać w golfa, ale obecnie go nie widzę (być może nie jest to możliwe i jest to tylko przypadkowe uczucie). •A–•60вjest o 1 bajt dłuższy niż 44 59‚zamiast krótszy. I ε0Ûzastąpić 0sz pustych strun również wydaje się być jak najkrótszy, gdyż 0Kpo prostu usuwa 0-przedmioty i całkowicie usuwa cyfrę 0we wszystkich liczb.
Kevin Cruijssen
1
@KevinCruijssen: Tak, szukałem krótszego sposobu na zrobienie tego 44 59‚, ale nie mogę go znaleźć ( •H|•2ôto ta sama liczba). Moje poprzednie rozwiązanie (również 27 bajtów), stosowane 45i 60które są łatwiejsze do wytworzenia w różny sposób, ale myślę, że był nieważny wyjściowych 1 , 3 lub 5 poziomów w zależności od wejścia nie zawsze 5 .
Emigna,
Ach, •H|•2ôto rzeczywiście sprytny sposób, nie myślałem o tym. I rzeczywiście powinien generować 5 linii. Rzeczywiście widziałem twoją poprzednią odpowiedź i miałem zamiar skomentować, że wypisała tylko 1 linię n < 45, ale potem ją usunąłeś. Cieszę się, że znalazłeś kolejne 27-bajtowe rozwiązanie. :)
Kevin Cruijssen
2
Myślę, że ŽH|2ôtego szukasz?
Adnan
2
@KevinCruijssen Działa dokładnie tak. Przeprowadziłem badania przy użyciu poprzednich odpowiedzi przy użyciu 05AB1E i była to jedna z rzeczy, które dodałem w przepisywaniu. Obecnie nie ma innych przypadków użycia.
Adnan,
4

JavaScript (Node.js) , 87 86 bajtów

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

Wypróbuj online!

83-bajtowe rozwiązanie ( (n/15-2|0)*s<4) jest zarezerwowane jako pierwsze, ponieważ muszę sprawdzić, czy jest większy n.

AKTUALIZACJA: Tak, (n/15-2|0)*s<4nie działało, ponieważ dla większych, nponieważ nwystarczająco duży sprawia, że ​​suma nie osiąga 1000.

Shieru Asakoto
źródło
4

PHP, 92 bajty

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

Uruchom jako potok z -Rlub spróbuj online .

Tytus
źródło
3

Czysty , 215 bajtów

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

Wypróbuj online!

Więc mam w końcu znalazł krótszą drogę, aby uzyskać losowych niż importu System._Unsafe, System.Timea za pomocą toInt(accUnsafe time)...
I chłopiec jest to naprawdę w duchu codegolf - Osadzanie wezwanie do C, ignorując typ państwa światowego zwykle używane w celu zapewnienia oceny porządek takich rzeczy.

Obrzydliwe
źródło
3

Java (JDK 10) , 121 117 113 111 bajtów

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

Wypróbuj online!

Jest tendencyjny do nakładania większej ilości wosku u góry, ale teoretycznie możliwe jest pojawienie się dowolnego prawnego układu wosku.

edycja: 4 bajty zostały zapisane przez @KevinCruijssen

W czytelnej dla ludzi Javie:

(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
źródło
2
Math.random()*(w+1)może być Math.random()*-~wdla -2 bajtów. Tutaj odpowiednia wskazówka jako odniesienie dlaczego. . Niezła odpowiedź! +1 ode mnie EDYCJA: Właściwie, można zapisać jeszcze 2 bajty, używając jzmiennej tymczasowej jako zmiennej w+1(ponieważ i tak zostanie ona nadpisana zaraz po wydruku) i użyj jej j*=Math.random()zamiast tego, abyś nie potrzebował rzutowania na (int)( 117 bajtów ).
Kevin Cruijssen
@KevinCruijssen nice! Zauważyłem też, że &i>2warunek nie jest konieczny
SamYonnou
3

PowerShell , 188 162 bajtów

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

Wypróbuj online!

-2 bajty @Kevin Cruijssen
-4 bajty przez usunięcie opcjonalnego komendy Get- czasownik
-20 bajtów poprzez zwarcie pętli i usunięcie spacji

Edwin
źródło
Cześć, witamy w PPCG! Świetna pierwsza odpowiedź! Przeprowadziłem podstawowe testy i wszystko wydaje się działać świetnie. Wiem, ledwo coś o PowerShell, ale jest to możliwe, aby zmienić else{if($t-ne 1e3){Get-Random(1000-$t)}}się elseif($t-ne 1e3){Get-Random(1000-$t)}? Widzę, że użyłeś elseifwcześniej kodu, więc powinno to zaoszczędzić 2 bajty. A może może Wskazówki dotyczące gry w golfa w PowerShell lub Wskazówki dotyczące gry w golfa w <wszystkich językach> mogą dać trochę inspiracji na więcej? Miłego pobytu! :)
Kevin Cruijssen
1
całkowicie poprawne co do ifelse. Usunięto jego inny odpowiednik wcześniej w tym procesie. Link też dał trochę inspiracji!
Edwin,
2

Pascal (FPC) , 192 190 bajtów

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.

Wypróbuj online!

Zastosowanie metody pakowania do pojemników firmy TFeld . Drukuje najpierw dolny wiersz ze znakiem nowej linii.

Wygląda na to, że FPC nie ma problemów random(0), więc dodałem tam niezwykłe elementy.


Moje oryginalne zgłoszenie, golfem do 209 bajtów:

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.

Wypróbuj online!

AlexRacer
źródło
2

Węgiel drzewny , 37 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

F²F²

Pętla dwa razy, dwa razy. Alternatywnie mógłbym podzielić liczbę całkowitą indeksu pętli przez 2 dla tej samej liczby bajtów.

‹³⁺ι÷Iθ¹⁵

Jeśli indeks zewnętrzny plus piętnasta temperatura jest większa niż trzy ...

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

... następnie przesuń losową liczbę całkowitą do 1000 włącznie - jak do tej pory. Niestety węgiel drzewny nie może obliczyć sumy pustej listy, więc zamiast tego muszę zastąpić pusty ciąg.

⊞υ⁻φΣυ

Wciśnij pozostałą kwotę do listy.

Eυ⎇ιIιω

Konwertuj listę na ciąg znaków, ale użyj pustego ciągu zamiast zera.

Neil
źródło
2

Galaretka , 28 bajtów

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

Pełny program drukujący wynik (do góry nogami, jak to było dozwolone).

Wypróbuj online! - zmieniono to na użycie7zamiastȷ(1000), ponieważ implementacja jest powolna pod względem golfowym! (...dlan>59 Lista 1015 5-krotek jest budowany, a następnie filtrowany, z którego można wybrać)

W jaki sposób?

>“,;‘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
źródło
1
Możesz także odwrócić dane wyjściowe (tj. 1000\n\n\n\nZamiast \n\n\n\n1000lub [87, null, 913, null, null]zamiast [null, null, 913, null, 87]). ” Tak, możesz używać wersji 28-bajtowej bez .
Kevin Cruijssen
2

Gałązka , 126 bajtów

To było naprawdę zabawne wyzwanie!

Ten kod tworzy makro, które należy zaimportować.

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

Aby go zaimportować, wykonaj następujące czynności:

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

To powinno załatwić sprawę.

Możesz to wypróbować na https://twigfiddle.com/t4dfgy
Uwaga : Z powodu usuwania białych znaków na stronie byłem zmuszony dodać- na końcu wiersza, aby udowodnić, że wyświetla on prawidłową liczbę wierszy.

Podczas zwykłej instalacji po prostu zobaczysz nowe wiersze bez problemów.

Ismael Miguel
źródło
2

Perl 6 , 62 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera ciąg znaków i zwraca listę liczb całkowitych z Nillub pustą listą ( []) zamiast 0s.

Wyjaśnienie:

{($!=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
źródło
2

PHP ,113 108 99 97 93 bajty

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

Wypróbuj online!

-11 bajtów dzięki @titus
-9 bajtów, ponieważ wszystko jest ciągiem

Einacio
źródło
2

J , 56 55 54 48 43 40 bajtów

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

Wypróbuj online!

-3 bajty dzięki FrownyFrog


Kolejna miła pod względem koncepcyjnym metoda, która jest nieco dłuższa, ale gwarantuje idealnie równomierny rozkład we wszystkich możliwościach, według metody tutaj :

J , 53 bajty

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

Wypróbuj online!

Jonasz
źródło
Nie jest $!.a:tak {.?
FrownyFrog
@FrownyFrog Dzięki. Zapomniałem, że pobranie większej liczby elementów niż jest dostępnych, powoduje wypełnienie „zero”.
Jonasz
1

Rubin , 62 55 bajtów

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

Wypróbuj online!

Testy są ograniczone do 0-99 stopni, ponieważ lampy lawowe mogą być niebezpieczne w wyższych temperaturach:

GB
źródło
Cześć. Obawiam się, że twoja odpowiedź jest nieprawidłowa. Obecnie ma 0dla pustych linii. Puste wiersze w tablicy może być wszystko z wyjątkiem 0, falselub liczbą ujemną. Więc to może być null, "", [], itd., Ale nie 0. Nie jestem pewien, czy Ruby ma tablice / listy obiektów, więc możesz przekształcić je 0w coś innego, ale jeśli nie, będziesz musiał je wydrukować zamiast zwracać tablicę / listę.
Kevin Cruijssen
Naprawiono, ale myślę, że to trochę zbyt arbitralne.
GB