Ест рыбу, растет в размерах

16

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

Таблица размеров

+--------------+--------------+--------------+--------------+
|              | Amount extra | Total size 1 | Increase to  |
| Current size |  needed for  |     fish     |    size      |
|              |  next size   |              |              |
+--------------+--------------+--------------+--------------+
|      1       |      4       |      4       |      2       |
+--------------+--------------+--------------+--------------+
|      2       |      8       |      12      |      3       |
+--------------+--------------+--------------+--------------+
|      3       |      12      |      24      |      4       |
+--------------+--------------+--------------+--------------+
|      4       |      16      |      40      |      5       |
+--------------+--------------+--------------+--------------+
|      5       |      20      |      60      |      6       |
+--------------+--------------+--------------+--------------+
|      6       |      24      |      84      |      7       |
+--------------+--------------+--------------+--------------+

правила

  1. Ваш размер начинается с 1
  2. Входные данные мелководья будут содержать целые числа рыб в диапазоне от 0 до 9
  3. 0 = водоросли и не помогут вам накормить.
  4. Целое число рыбы представляет размер рыбы (1-9).
  5. Вы можете есть только рыбу того же размера или меньше, чем вы сами.
  6. Вы можете есть рыбу в любом порядке по вашему выбору, чтобы максимизировать свой размер.
  7. Вы можете съесть каждую рыбу только один раз.
  8. Чем больше рыбы вы едите, тем быстрее вы растете. Рыба размера 2 равна двум рыбам размера 1, рыба размера 3 равна трем рыбам размера 1 и так далее.
  9. Ваш размер увеличивается на единицу каждый раз, когда вы достигаете суммы ниже.

Возвращает целое число максимально возможного размера

Примеры

"11112222" => 3  
4 fish size 1 increases to 2, 4 size 2 makes you 3

"111111111111" => 3
4 fish size 1 increases to 2, 8 size 1 makes you 3

Самый короткий код (считая в байтах) для этого на любом языке, на котором выигрывают числа.

Scath
источник
1
Добро пожаловать в PPCG, я позволил себе внести небольшие изменения в форматирование вопроса, не стесняйтесь откатывать их, если вы считаете, что они не присвоены.
Род
1
Связанный :-)
Арно
5
Дополнительные вопросы: (1) мы можем взять список целых чисел вместо целой строки? (2) мы можем предположить, что вход отсортирован?
JungHwan Мин
1
Я добавил, что он будет отсортирован и может принимать любые входные данные
Scath
2
Можно удалить 5,6или 6,6 из последнего примера Марка и получить размер 13; все же удалите 5,5вместо этого, и можно достичь только пятого размера.
Джонатан Аллан

Ответы:

10

JavaScript (ES6), 44 байта

Принимает ввод как массив целых чисел.

a=>a.map(x=>s+=(t+=s>=x&&x)>s*-~s*2,t=s=1)|s

Попробуйте онлайн!

Как?

Порог для достижения размера s + 1Tss+1 определяется как:

Ts=2s(s+1)

Мы отслеживаем наш текущий размер в и то, что мы ели до сих пор в t (мы начинаем с t = 1 , так что это фактически отключено на 1 ).stt=11

x

  • xtsx
  • st>Ts
Arnauld
источник
5

Wolfram Language (Mathematica) , 40 39 байт

(f:=Floor@s;s=1;s<#||(s+=#/4/f)&/@#;f)&

Попробуйте онлайн!

объяснение

f:=Floor@s;s=1;

Хранить floor(s)в fсимволически. Начните с s=1(размер).

... /@#

Перебирать каждый элемент ввода ...

s<#||(s+=#/4/f)

Если элемент не больше чем s, то увеличить sна <element> / (4 * floor(s)). В Or (||)короткие замыкания в противном случае.

f

Возвращение floor(s).

Юнг Хван Мин
источник
5

Желе , 17 байт

J×4ÄfSR$ịx`>JTḢȯ1

Попробуйте онлайн!

Интересный метод, который вполне может быть побежден каким-то циклом или рекурсией.

Как?

J×4ÄfSR$ịx`>JTḢȯ1 - Link: list A (ascending digits) e.g. [1,1,1,1,1,1,1,2,2,3]
J                 - range of length                      [1,2,3,4,5,6,7,8,9,10]
 ×4               - multiply all by 4                    [4,8,12,16,20,24,28,32,36,40]
   Ä              - cumulative sums                      [4,12,24,40,60,84,112,144,180,220]
       $          - last two links as a monad (of A):
     S            -   sum                                14
      R           -   range                              [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
   f              - filter keep                          [4,12]
          `       - use left argument as right with:
         x        -   repeat elements                    [1,1,1,1,1,1,1,2,2,2,2,3,3,3]
        ị         - index into                           [      1,              3    ]
                  -                                    = [1,3]
            J     - range of length (of A)               [1,2,3,4,5,6,7,8,9,10]
           >      - greater than?                        [0,1,3,4,5,6,7,8,9,10]
                  -                1 not greater than 1---^ ^---3 is greater than 2
                  -   (note keeps values of longer - i.e. the 3,4,... here)
             T    - truthy indices                       [  2,3,4,5,6,7,8,9,10]
              Ḣ   - head                                 2
                1 - literal one                          1
               ȯ  - logical OR                           2
                  -   (edge-case handling when the head of an empty list yields 0)
                  -   (note that when the shoal is fully consumed the final size will
                  -    still be less than the length of that shoal, so TḢ will still give
                  -    this size due to >J keeping values of the longer argument.)
Джонатан Аллан
источник
Кто-то сказал, что скоро я приму это, ты согласен?
Scath
Да, я согласен; некоторые люди не присуждают зеленые галочки за код-гольф, другие оставляют его примерно на неделю - принятие ответа может означать снижение активности. Кроме того, я чувствую, что это должно быть побеждено (либо в самом Jelly, либо в качестве кросс-языкового конкурса) в любом случае! ... code-golf является странным подходом для Stack Exchange, поскольку реальная конкуренция проводится на разных языках, а знак согласия - на разных языках.
Джонатан Аллан
1

Луа , 214 байт

l,f=1,{}for j=1,9 do s,f[j]=(...):gsub(j,0)end::z::a,n=0,l*4 for i=1,l do a=a+i*f[i]end if a>=n then e=l while n>0 do if 0<f[e]and e<=n then n=n-e f[e]=-1+f[e]else e=e-1 end end l=l+1 else print(l)return end goto z

Попробуйте онлайн!

Даже не самый короткий здесь, но было забавно понять это: D

лицеи
источник