Спрощена лампова лампа


18

Вступ:

Я думаю, що всі знають, що таке лампа Лави, але у випадку, якщо вони цього не роблять:

введіть тут опис зображення
(Джерело зображення)

Це в основному скляні трубочки, які містять віск у напівпрозорій рідині. Нижня частина нагрівається при включенні лампи, викликаючи зміну щільності і, таким чином, віск пливе на верх. Коли він охолоне, він знову падає, викликаючи ефект, який ми бачимо вище.

Зазвичай для того, щоб основа основи лампи піднялася на досить високу температуру, потрібно змінити твердий віск на рідкий віск (якщо лампа розташована в районі кімнатної температури).

Більше інформації у Вікіпедії, яка також використовується як джерело для деяких текстів вище.

Виклик:

Давши додатне ціле число, що nвказує кількість хвилин, що минули з моменту ввімкнення лампи Лави, виведіть випадковий стан Лампи Лави на основі цілих чисел на п'яти рівнях.

Для цього завдання ми скажемо, що Лампа Лави містить 1000 одиниць воску загалом, і у нас є п'ять рівнів, де може знаходитися віск.

1) Якщо nнижче 45, лампа Лави все ще нагрівається, тому на виході буде чотири порожніх рядка з 1000нижньою частиною:





1000

2) Якщо nзнаходиться в діапазоні, [45, 60)лампа Лави підвищила температуру, достатню для переміщення воску, але ще не дуже високої. Віск може сягати до третього рівня і включати його.
3) Якщо nвона 60вище або вище, віск може бути на будь-якому з п’яти рівнів.

Отже, враховуючи ціле додатне ціле число n, ми виведемо випадковий стан з урахуванням трьох правил вище.

Ось кілька прикладів результатів:

Можливі виходи для будь-якого, nщо є >= 45:



523
106
371


913

87

Можливі виходи для будь-якого, nщо є >= 60:

73
113
312
5
497
284
55
637

24

Постійний вихід для nцього є <= 44(і можливий вихід для будь-якого n):





1000

Правила виклику:

  • Там можуть бути порожні рядки, навіть якщо рівень над ним не порожній.
  • Просто 0заборонено в жодному рядку. Натомість має бути порожнім.
  • Вихід є дещо гнучким. Вам дозволяється виводити список / масив рядків / об'єктів замість результату з обмеженням у новому рядку, як зазначено вище. Причина, по якій я кажу, що рядки / об'єкти, пов'язана з правилом вище. Порожній рядок повинна бути "", null, []і т.д., але не може бути 0або негативне ціле число ( і не може бути false) (тобто ["", "", 913, "", 87]для n >= 45). Вам також дозволяється повернути результат (тобто 1000\n\n\n\nзамість \n\n\n\n1000або [87, null, 913, null, null]замість [null, null, 913, null, 87]).
  • Усі числа повинні бути цілими числами. 0Десяткові знаки можуть бути як десятковими, але жодне з чисел не повинно мати десяткових цифр, а цілі числа завжди повинні точно дорівнювати 1000.
  • Усі можливі випадкові виходи на основі nповинні мати ненульовий шанс виникнення.
  • Новий рядок (тобто шість рядків виводу) дозволено.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також настійно рекомендується додавати пояснення до своєї відповіді.


Чи може бути представлений порожній рівень єдиним пробілом?
Арнольд

@Arnauld Звичайно. Може бути будь-що, крім 0, від’ємного числа, або false.
Кевін Кройсейсен

Вихід завжди 5 рівнів, навіть коли n < 60?
Емінья

@Emigna Так, вихід завжди 5 рівнів. Для n < 45тільки 1 рівень заповнений , однак (зверху чи знизу в залежності від того , ви виводите його), що 1000. І з 45 <= n < 60трьома з п’яти, і з n >= 60усіма п’ятьма. Але вихід завжди буде містити п'ять "рядків".
Кевін Кройсейсен

Відповіді:


5

MathGolf , 21 20 байт

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

Спробуйте в Інтернеті!

Це моя перша відповідь моєю новою мовою. Я базував своє рішення на рішенні 05AB1E Emigna, але використовував деякі акуратні особливості MathGolf, щоб зробити його трохи коротшим.

Пояснення

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)

Якщо функції самі по собі не є вбудованими для цього виклику, неконкурентний тег не знадобиться. З середини минулого року неконкурентос - це вже не річ. Оскільки це зовсім нове, я припускаю, що ще немає онлайн-компілятора для вашої мови? Чи можете ви замість цього, можливо, додати деякі скріншоти (або посилання на скріншоти, якщо це занадто захаращує публікацію) як перевірку? І я би звернувся до @Dennis ', щоб запитати, чи можна додати вашу мову до TryItOnline .
Кевін Круїссен

2
@KevinCruijssen Дякую за відгук! Я додам кілька скріншотів, і я працюю над тим, щоб передати мову TIO. Я зв’яжусь з Деннісом, як тільки відчую, що не постійно додаю нові функції.
maxb

Чи обдумали ви створити кімнату для своєї мови? Мені дуже цікаво це вивчити!
Jo King

@JoKing радий почути, що ти зацікавлений! Я спробую створити кімнату десь у ці вихідні. Я тільки що отримав мову на TIO завдяки Деннісу, я працюю над тим, щоб зробити її доступною для всіх!
maxb

@JoKing Я створив кімнату для MathGolf . Я спробую відповісти на будь-які запитання, як тільки зможу, я знаю, що документація трохи незавершена.
maxb

8

Python 2 , 117 113 108 107 106 105 байт

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

Спробуйте в Інтернеті!

Повертає перевернутий список (перший внизу)


Версія, натхненна відповіддю stackoverflow в коментарях (кращі випадки є більш імовірними):

Python 2 , 129 байт

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

Спробуйте в Інтернеті!


Я точно не знаю, як працює ваш код, але чи має кожен стан ненульовий шанс виникнення? Всі ваші номери ширяє поблизу 333або 200на 3 або 5 частин відповідно. Я не бачу жодних сплетів / відхилень у бік 0або 1000. Або шанси для тих, хто просто астрономічно малий (але все ще не нульовий) порівняно з цілими числами поблизу 333і 200?
Кевін Кройсейсен

1
@KevinCruijssen Кожен з 1000 лавових одиниць кладеться у випадковий відро ( 0або 0-2або 0-4) і підраховується. Шанси, що ніхто тоді не в'їде, не є, але дуже малі.
TFeld

Ну добре, це має сенс. Тепер я також краще розумію ваш код. Спасибі! +1 від мене.
Кевін Круїссен

7

JavaScript (ES6), 78 байт

Повертає зворотний масив, де порожні рівні заповнені пробілом.

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

Спробуйте в Інтернеті!

Прокоментував

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

У мене насправді є те саме запитання, що і коментар, який я зробив для відповіді Python : Чи має кожна держава ненульовий шанс виникнення?
Кевін Кройсейсен

1
1090

Rofl, приємна аналогія з метеоритом. ;) Зараз я дійсно бачу, що ваш метод схожий на відповідь Python в тому, що він ставить значення в одному з 3 або 5 точок у масиві, аж до підрахунку 1000. Приємна відповідь, тому +1 від мене.
Кевін Кройсейсен

6

R , 85 84 байт

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

-1 байт завдяки @Giuseppe

Спробуйте в Інтернеті!

Пояснення (необережений):

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

Якщо NAце дозволено як порожній рядок / елемент, ось 77-байтне рішення ( спробуйте його в Інтернеті! ) Або 80-байтне рішення ( Спробуйте в Інтернеті! ), Якщо імена елементів є проблемою
duckmayr

6

C (gcc) , 131 , 116 , 90 , 89 , 87 байт

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

Спробуйте в Інтернеті!

Оновлення : виправлена ​​помилка в оригіналі. Злитий у хелперній функції, зменшивши ще 15 байт.

Оновлення 2 : -25 байт завдяки ErikF.

Оновлення 3 : -1 байт завдяки скловолокну.

Дегольф

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(), об'єднавши друк в єдине ціле printf()і поклавши віднімання в кінець циклу. Крім того, я думаю, вам дозволено поставити srand()ініціалізацію в абонент. Спробуйте в Інтернеті!
ErikF

Я зрозумів, що пропустив обмеження "без нуля". Ось виправлена ​​версія: Спробуйте в Інтернеті!
ErikF

Деякі останні настрої! Спробуйте в Інтернеті!
ErikF

Чудовий; Я переграв його додатковим байтом.

1
Також ми це зробили! Ми побили Python!

5

05AB1E , 27 26 25 байт

Збережено байт завдяки Аднану .
Збережено ще один байт завдяки Кевіну Крейсейну .

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

Спробуйте в Інтернеті!

Пояснення

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
Гарна відповідь! Мені подобається те, як ти звик 5Å0і ǝ, і ε0Ûв кінці. Я намагався придумати щось коротше, але не можу. У мене є відчуття, що це якось все-таки можна пограти в гольф, але наразі я цього не бачу (можливо, це не може, і це просто випадкове почуття). •A–•60вна 1 байт довше, ніж 44 59‚замість коротшого. І ε0Ûзамінити 0s на порожні рядки також здається найкоротшим, оскільки 0Kпросто повністю видаляє 0-елементів і видаляє будь-яку цифру 0у всіх числах.
Кевін Кройсейсен

1
@KevinCruijssen: Так, я шукав і шукав, щоб знайти коротший спосіб роботи 44 59‚, але не можу його знайти ( •H|•2ôце той самий підрахунок). Моє попереднє рішення (також 27 байт), яке використовувалося 45і 60яке простіше генерувати різними способами, але я вважаю, що це було недійсним, оскільки воно виводило 1 , 3 або 5 рівнів залежно від введення, а не завжди 5 .
Емінья

А, •H|•2ôце справді розумний спосіб, не думав про це. І справді слід вивести 5 рядків. Я побачив вашу попередню відповідь і справді збирався прокоментувати її лише 1 рядок n < 45, але потім ви її видалили. Радий, що ви знайшли ще 27-байтне рішення. :)
Кевін Круїссен

2
Я думаю ŽH|2ô, що ви шукаєте?
Аднан

2
@KevinCruijssen Це діє саме так. Провели деякі дослідження з використанням попередніх відповідей за допомогою 05AB1E, і це було однією з речей, які я додав у переписуванні. Зараз немає інших випадків використання.
Аднан

4

JavaScript (Node.js) , 87 86 байт

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

Спробуйте в Інтернеті!

83-байтне рішення ( (n/15-2|0)*s<4) зарезервоване першим, тому що мені потрібно перевірити, чи є більші n.

ОНОВЛЕННЯ: Так, (n/15-2|0)*s<4не вийшло, оскільки для більшої, nоскільки nдосить велика, сума не досягає 1000.



3

Чисто , 215 байт

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

Спробуйте в Інтернеті!

Так що я , нарешті , знайшов більш короткий шлях , щоб отримати випадкове зерно , ніж імпортувати System._Unsafe, System.Timeі використовуючи toInt(accUnsafe time)...
І хлопчик це дійсно в дусі codegolf - вкладення виклику C, ігноруючи світовий тип стану зазвичай використовується для забезпечення оцінки порядок таких речей.


3

Java (JDK 10) , 121 117 113 111 байт

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

Спробуйте в Інтернеті!

Це упереджено ставити більше воску біля верху, але теоретично можливо, щоб з'явилося будь-яке правове розташування воску.

редагувати: 4 байти збережено @KevinCruijssen

На читаній людиною Java:

(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)може бути Math.random()*-~wдля -2 байт. Ось відповідна порада як посилання чому. . Гарна відповідь! +1 від мене. EDIT: Насправді, ще 2 байти можна зберегти, використовуючи jтимчасовий як змінну для w+1(оскільки він буде перезаписаний відразу після друку) та використовувати j*=Math.random()замість цього, так що вам не знадобиться трансляція (int)( 117 байт ).
Кевін Кройсейсен

@KevinCruijssen приємно! Також я щойно помітив, що ця &i>2умова не потрібна
SamYonnou

3

Powershell , 188 162 байт

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

Спробуйте в Інтернеті!

-2 байта від @Kevin Cruijssen
-4 байти, видаливши необов'язкове дієслово
-20 байт шляхом скорочення циклу та видалення пробілів


Привіт, Ласкаво просимо до PPCG! Чудова перша відповідь! Я зробив кілька базових тестувань, і все, здається, працює чудово. Я знаю майже нічого про Powershell, але це можна змінити , else{if($t-ne 1e3){Get-Random(1000-$t)}}щоб elseif($t-ne 1e3){Get-Random(1000-$t)}? Я бачу, що ви раніше використовували elseifсвій код, тому це повинно заощадити 2 байти. Також, можливо, Поради щодо гольфу в Powershell або Поради щодо гольфу на <всіх мовах> можуть дати щось натхнення для більше? Насолодитися перебуванням! :)
Кевін Круїссен

1
абсолютно правильний щодо іфельси. Раніше в процесі вилучено свого іншого аналога. Посилання теж надихнулося!
Едвін

2

Паскаль (FPC) , 192 190 байт

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.

Спробуйте в Інтернеті!

Використання методу упаковки в бункери за TFeld . Спочатку виводить нижній рядок із заднім рядком.

Здається, що з FPC не виникає проблем random(0), тому я маю там щось незвичне.


Моє оригінальне подання, зібране на 209 байт:

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.

Спробуйте в Інтернеті!


2

Вугілля деревне , 37 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

F²F²

Петля двічі, двічі. Крім того, я міг би на ціле число розділити індекс циклу на 2 для того ж числа байтів.

‹³⁺ι÷Iθ¹⁵

Якщо зовнішній показник плюс п’ятнадцята температура перевищує три ...

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

... потім натисніть випадкове ціле число до 1000 включаючи суму. На жаль, вугілля не може вирахувати суму порожнього списку, тому мені доведеться замінити порожній рядок.

⊞υ⁻φΣυ

Залиште кількість залишку до списку.

Eυ⎇ιIιω

Перетворіть список у рядок, але використовуйте порожній рядок замість нуля.


2

Желе , 28 байт

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

Повна програма, що друкує результат (догори дном, як це було дозволено).

Спробуйте в Інтернеті! - це змінено для використання,7а неȷ(1000), оскільки реалізація гольф-тастично повільна! (... длян>59 список 1015 5-кортежі будують і потім фільтрують, з чого вибрати)

Як?

>“,;‘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
" Вам також дозволено повернути результат (тобто 1000\n\n\n\nзамість \n\n\n\n1000або [87, null, 913, null, null]замість [null, null, 913, null, 87]). " Так, так, ви можете використовувати 28-байтну версію без .
Кевін Круїссен

2

Гілочка , 126 байт

Це було насправді весело завдання!

Цей код створює макрос, який потрібно імпортувати.

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

Щоб імпортувати його, просто зробіть це:

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

Це повинно зробити трюк.

Ви можете спробувати його на https://twigfiddle.com/t4dfgy
Примітка : Через те, що сторінки видаляють пробіли, я був змушений додати " -в кінці рядка", щоб довести, що він виводить правильну кількість рядків.

При регулярній установці ви просто побачите нові рядки без проблем.


2

Perl 6 , 62 байти

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

Спробуйте в Інтернеті!

Блок анонімного коду, який займає рядок і повертає список цілих чисел, з Nilабо порожній список ( []) замість 0s.

Пояснення:

{($!=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

J , 56 55 54 48 43 40 байт

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

Спробуйте в Інтернеті!

-3 байти завдяки FrownyFrog


Ще один концептуально приємний метод, який трохи довший, але гарантує ідеально рівномірний розподіл усіх можливостей, відповідно до методу тут :

J , 53 байти

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

Спробуйте в Інтернеті!


Це не $!.a:просто {.?
FrownyFrog

@FrownyFrog Дякую Я забув, що, якщо взяти більше елементів, ніж доступних, результатів заповнення "нуль".
Йона

2

PowerShell , 115 105 98 байт

-17 байт завдяки маззі

$a=,0*5
45,60-ge"$args"|%{$i+=2}
$i..4|%{$t+=$a[$_]=random(1001-$t)}
$a[4]+=1e3-$t
$a|%{"$_"*!!$_}

Спробуйте в Інтернеті!

Гольф чудової відповіді Едвіна . Якщо вам це подобається, підтримайте його.


1
приємно. трохи більше гольфу Спробуйте в Інтернеті!
mazzy

1
гольф знову 98 байт
маззи

1

Рубі , 62 55 байт

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

Спробуйте в Інтернеті!

Випробування обмежені 0-99 градусами, оскільки лавові лампи можуть бути небезпечними при більш високій температурі:


Привіт там. Боюся, що ваша відповідь недійсна. Наразі це є0 для порожніх рядків. Порожні рядки в масиві можуть бути будь-якими, крім 0, falseабо від’ємним числом. Так що може бути null, "", []і т.д., але не 0. Не впевнений, чи є у Ruby масиви об’єктів / списки, щоб ви могли перетворити 0s на щось інше, але якщо ні, вам доведеться роздрукувати їх замість повернення масиву / списку.
Кевін Круїссен

Виправлено, але я думаю, що це занадто довільно.
ГБ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.