Їсть рибу, зростаючи в розмірах


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

Найкоротший код (рахуючи в байтах), щоб зробити це будь-якою мовою, на якій виграють числа.


1
Ласкаво просимо в PPCG, я взяв на себе можливість змінити невеликі зміни у форматі питання, не соромтесь відкинути їх, якщо ви вважаєте, що вони не призначені.
Прут


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

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

Як?

Тсс+1

Тс=2с(с+1)

стт=11

х

  • хтсх
  • ст>Тс


5

Мова Вольфрама (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.)

Хтось сказав, що незабаром я прийму це, ви згодні?
Скат

Так, я згоден; деякі люди не присуджують зелені прапорці за код-гольф, інші залишають це приблизно тиждень - прийняття відповіді може означати падіння активності. Як осторонь я відчуваю, що це все одно має бути виграним (або в самому Желі, або як змагання між мовою) все одно! ... Код-гольф дивно підходить до 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

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