Упрощенная Лава Лампа


18

Вступление:

Я думаю, что все знают, что такое Лава Лампа, но на случай, если они этого не сделают:

введите описание изображения здесь
(Источник изображения)

В основном это стеклянные трубки, которые содержат воск в полупрозрачной жидкости. Нижняя часть нагревается при включении лампы, вызывая изменение плотности, и, таким образом, воск всплывает наверх. Когда он остывает, он снова падает, вызывая эффект, который мы видим выше.

Обычно требуется около 45-60 минут для того, чтобы основание лампы поднялось до достаточно высокой температуры, чтобы сменить твердый воск на жидкий воск (если лампа находится в помещении с комнатной температурой).

Дополнительная информация о Википедии, которая также используется в качестве источника для некоторого текста выше.

Вызов:

Учитывая положительное целое число, 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, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.


Может ли пустой уровень быть представлен одним пробелом?
Арно 9

@ 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. Я свяжусь с Деннисом, как только почувствую, что не постоянно добавляю новые функции.
максимум

Рассматривали ли вы создание комнаты для вашего языка? Я очень заинтересован в изучении этого!
Джо Кинг,

@JoKing рад слышать, что вы заинтересованы! Я постараюсь создать комнату в эти выходные. Я только что получил язык на TIO благодаря Деннису, я работаю над тем, чтобы сделать его доступным для всех!
максимум

@JoKing Я создал комнату для MathGolf . Я постараюсь ответить на любые вопросы, как только смогу, я знаю, что документация немного незавершена.
максимум

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 байт благодаря потолку.

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(), объединив печать в один printf()и поместив вычитание в конец цикла. Кроме того, я думаю, что вы можете поместить srand()инициализацию в вызывающую программу. Попробуйте онлайн!
ErikF

Я понял, что пропустил ограничение "нет нулей". Вот исправленная версия: попробуйте онлайн!
ErikF

Несколько последних настроек! Попробуйте онлайн!
ErikF

Большой; Я добавил его в гольф еще одним байтом.

1
Кроме того, мы сделали это! Мы победили Питона!

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

Ява (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 от меня. РЕДАКТИРОВАТЬ: На самом деле, еще 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 включительно - сумму пока. К сожалению, Charcoal не может вычислить сумму пустого списка, поэтому мне нужно заменить пустую строку.

⊞υ⁻φΣυ

Вставьте оставшуюся сумму в список.

Eυ⎇ιIιω

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


2

Желе , 28 байт

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

Полная программа печати результата (вверх ногами, как было разрешено).

Попробуйте онлайн! - это изменено для использования,7а неȷ(1000), потому что реализация очень медленная! (...заN>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
красивый. немного больше гольфа Попробуйте онлайн!
Маззи

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.