Скільки цукерок можна з’їсти?


14

Кредит Geobits в ТНБ за ідею

Пост без досить докладно недавно покладений цікава гра:

2 дитини сидять перед масивом цукерок. Кожен шматок цукерки пронумерований від 1 до x, xпричому загальна кількість цукерок присутня. Від кожного числа є рівно 1 зустріч.

Мета гри полягає в тому, щоб діти їли цукерки і примножували значення з'їдених цукерок, щоб досягти остаточного результату, вищий результат виграв.

Однак в оригінальному дописі пропущена ключова інформація, наприклад, про те, як вибирається цукерка, тому діти з нашої розповіді вирішили, що старший малюк повинен їхати першим і може з'їсти до половини цукерки, проте, як тільки він оголошує про закінчення своєї черги, він не може передумати.

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

Змагання

Враховуючи загальну кількість цукерок x, ваша програма або функція повинна виводити найменшу кількість цукерок, яку він повинен з'їсти, щоб забезпечити перемогу n, навіть якщо його опонент з'їсть усі цукерки, що залишилися.

Природно, що більша кількість робить більші числа, тому яку б суму ви не давали йому, він з'їсть nнайбільшу кількість.

Правила

  • xзавжди буде позитивним цілим числом у діапазоні, 0 < x! <= lде lзнаходиться верхня межа можливостей обробки вашої мови
  • Гарантовано, що малюк завжди їсть nнайбільшу кількість, наприклад для x = 5і n = 2, він їсть 4і5

Тестові справи

x = 1
n = 1
(1 > 0)

x = 2
n = 1
(2 > 1)

x = 4
n = 2
(3 * 4 == 12 > 1 * 2 == 2)

x = 5
n = 2
(4 * 5 == 20 > 1 * 2 * 3 == 6)

x = 100
n = 42
(product([59..100]) > product([1..58]))

x = 500
n = 220
(product([281..500]) > product([1..280]))

Оцінка балів

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


14
Скільки цукерок можна з'їсти? Все це. Всі цукерки.
AdmBorkBork

3
Нова назва: "Скільки цукерок потрібно з'їсти?"
Спарр

@Skidsdev Слід x = 0також обробляти, оскільки 0! = 1? (Можливо, xтакож слід вказати як позитивний цілий
чисельність

@Chronocidal додав "додатне" ціле число
Skidsdev

Я кинув на землю 10k цукерки. Маленька фігурка вирила яму в землі і знайшла через мене гігантську цукеркову печеру. ):
moonheart08

Відповіді:


9

Python 3 , 76 байт

F=lambda x:x<2or x*F(x-1)
f=lambda x,n=1:x<2or n*(F(x)>F(x-n)**2)or f(x,n+1)

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

Покладається на те, що за вживання в їжу n цукерок все-таки виграють, а загальна кількість цукерок становить x , x!(xn)!>(xn)!повинно бути правдою, що означаєx!>((xn)!)2.

-1 від Скідсдева

-3 -6 від БМО

-3 від Sparr

+6 для виправлення x = 1


1
Ви можете зберегти 1 байт, замінивши верхню функцію наfrom math import factorial as F
Skidsdev

1
Ви можете переписати ці рекурсії, використовуючи коротке замикання, наприклад. для другого: n*(F(x)>F(x-n)**2)or f(x,n+1). Аналогічно x<2or x*F(x-1)для першого, який коротший, ніж імпорт.
ბიმო

1
Усі три приємні пропозиції, дякую. (І додано)
nedla2004

1
-3 байти с import math;F=math.factorial якими я, мабуть, повинен піти, знайти мета-поради підказки пітона ...
Sparr

2
@Sparr: Але F=lambda x:x<2or x*F(x-1)на три байти менше?
ბიმო

5

JavaScript (ES6), 53 байти

n=>(g=p=>x<n?g(p*++x):q<p&&1+g(p/n,q*=n--))(q=x=1)||n

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

Діапазон роботи

Цікаво, що різниці між дитячими продуктами завжди є досить великими, що втрата точності, притаманна кодуванню IEEE 754, не є проблемою.

Як результат, вона працює при 0n170 . Крім того, і мантіса, і показник переповнення (поступається+ Нескінченність), інам знадобляться BigInts(+1 байт).

Як?

Нехай p - цукерковий продукт другої дитини, а q - наш власний цукерковий продукт.

  1. Почнемо з p=n!(всі цукерки для іншого малюка) іq=1 (для нас нічого).

  2. Повторюємо наступні операції до qp :

    • ділити p на n
    • помножити q на n
    • декремент n

Результат - кількість необхідних ітерацій. (На кожній ітерації ми «беремо наступну найвищу цукерку у іншого малюка».)

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

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

n => (           // main function taking n
  g = p =>       // g = recursive function taking p
    x < n ?      //   if x is less than n:
      g(         //     this is the first part of the recursion:
        p * ++x  //     we're computing p = n! by multiplying p
      )          //     by x = 1 .. n
    :            //   else (second part):
      q < p &&   //     while q is less than p:
      1 + g(     //       add 1 to the final result
        p / n,   //       divide p by n
        q *= n-- //       multiply q by n; decrement n
      )          //
)(q = x = 1)     // initial call to g with p = q = x = 1
|| n             // edge cases: return n for n < 2

4

Желе , 9 байт

ḊPÐƤ<!€TL

Спробуйте в Інтернеті!Або подивіться тестовий набір .

Як?

ḊPÐƤ<!€TL - Link: integer, x                   e.g. 7
Ḋ         - dequeue (implicit range of x)           [   2,   3,   4,   5,   6,   7]
  ÐƤ      - for postfixes [all, allButFirst, ...]:
 P        -   product                               [5040,2520, 840, 210,  42,   7]
      €   - for each (in implicit range of x):
     !    -   factorial                             [   1,   2,   6,  24, 120, 720, 5040]
    <     - (left) less than (right)?               [   0,   0,   0,   0,   1,   1, 5040]
          -   -- note right always 1 longer than left giving trailing x! like the 5040 ^
       T  - truthy indices                          [                       5,   6, 7   ]
        L - length                                  3

1
це вражає, але було б більш
освітянським,

Це буде ... :)
Джонатан Аллан

@Setop - додано.
Джонатан Аллан

люблю це ! і його треба швидко порівняти з усіма рішеннями з тоннами
фабрик

Ні, все ж обчислює всі ці продукти та фабрики (більше, ніж деякі інші рішення).
Джонатан Аллан

3

R , 70 41 38 байт

-29, тому що Денніс знає всіх внутрішні функції

-3 перемикання на вхід сканування ()

sum(prod(x<-scan():1)<=cumprod(1:x)^2)

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

Досить проста реалізація відповіді Python3 на Nedla2004 .

Я відчуваю, що є більш чітка реалізація 1-маніпуляції, і я хотів би втратити фігурні брекети.

Я божеволію, що не повернувся до використання підходу, маддер, що я використовував суворіший менший, але навіть маразм все ще, що я не знав, що є cumprod()функція. Відмінна оптимізація Денніса.


3

APL (Dyalog Unicode) , 10 байт

+/!≤2*⍨!∘⍳

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

Порт Денніса . Завдяки, ну, Денніс за це.

Як:

+/!≤2*⍨!∘⍳  Tacit function, takes 1 argument (E.g. 5)
           Range 1 2 3 4 5
       !∘   Factorials. Yields 1 2 6 24 120
    2*⍨     Squared. Yields 1 4 36 576 14400
  !         Factorial of the argument. Yields 120.
           Less than or equal to. Yields 0 0 0 1 1
+/          Sum the results, yielding 2.

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


APL (Dyalog Unicode) , 14 12 11 байт

(+/!>×\)⌽∘⍳

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

Префікс негласна функція. В основному, порт Діалог відповіді Джонатана .

Дякуємо ngn та H.PWiz за допомогу у чаті. Завдяки ngn також за те, що врятував мені байт.

Дякую Деннісу за те, що він вказав, що мій оригінальний код був неправильним. Виявляється, це врятувало мене 2 байти.

Використання ⎕IO←0 .

Як:

+/(!>×\)∘⌽∘⍳  Tacit function, taking 1 argument (E.g. 5).
             Range 0 1 2 3 4
         ⌽∘   Then reverse, yielding 4 3 2 1 0
  (    )∘     Compose with (or: "use as argument for")
   !          Factorial (of each element in the vector), yielding 24 6 2 1 1
     ×\       Multiply scan. Yields 4 12 24 24 0
    >         Is greater than. Yields 1 0 0 0 1
+/            Finally, sum the result, yielding 2.

1
якщо +/йде всередині дужок, один композиції можуть бути опущені:(+/!>×\)⌽∘⍳
СПП



2

Пітон 3 , 183 176 149 байт

R=reversed
def M(I,r=1):
 for i in I:r*=i;yield r
def f(x):S=[*range(1,x+1)];return([n for n,a,b in zip([0]+S,R([*M(S)]),[0,*M(R(S))])if b>a]+[x])[0]

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

Це набагато швидше, ніж деякі інші рішення - множення 0 (N) замість O (N²) - але мені не вдається зменшити розмір коду.

-27 від Джо Кінга



1

05AB1E , 15 11 байт

E!IN-!n›iNq

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

E!IN-!n›iNq

E                For loop with N from [1 ... input]
 !               Push factorial of input    
  IN-            Push input - N (x - n)
     !           Factorial
      n          Square
       ›         Push input! > (input - N)^2 or x! > (x - n)^2
        i        If, run code after if top of stack is 1 (found minimum number of candies)
         N       Push N
          q      Quit, and as nothing has been printed, N is implicitly printed

Використовується той самий підхід, що і в моєму поданні Python . Дуже новинка 05AB1E, тому будь-які поради щодо коду чи пояснень дуже вдячні.

-4 байти завдяки Kevin Cruijssen


Гарна відповідь! Ви можете грати в 3 байти так, не вриваючись 1. Якщо оператор if є truthy, він підштовхне індекс Nдо стеку і вийде з програми (виводить цей індекс неявно). Для введення 1if-оператор буде Falsey, але він буде виводити його 1неявно після цього циклу одноітерації .
Кевін Кройсейсен

1
Насправді 4 байти можна зберегти замість 3: Спробуйте в Інтернеті 11 байт . Вхід буде використаний неявно для першого факторіалу !, тепер, коли стек порожній, оскільки ми більше не дублюємо / тричі дублюємо результат if.
Кевін Кройсейсен

1
Дякую за ці ідеї. Хоча я не дійшов до цієї ідеї друку наприкінці, я все-таки задумався закінчити цикл для початку. Шукаючи перерву, кінець, вихід та втечу, я просто подумав, що не розумію, як правильно працюють петлі. Якось припинення мені не сталося.
nedla2004

1
Ваша відповідь була вже досить хорошою. Зазвичай, простіше пограти в існуючу відповідь далі, а потім самостійно пограти в гольф. Якби я сам вирішив цей виклик, я, мабуть, закінчився б також 15 або 14 байтами. Я використав вашу ідею про розрив і замінив її на завершення та неявний вихід замість цього, після цього я спробував кілька речей, і врешті-решт я побачив, що мені більше не потрібен дублікат, який би також виправляв тестовий випадок, що 1виводив вхід неявно коли стек порожній. :)
Кевін Круїссен

1
FYI: Я опублікував альтернативу 7 байт, пересилаючи Денніса ♦ «Желе відповідь. Як завжди, Денніс ♦ здатний виконувати магію з точки зору
джеллі


0

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

NθI⊕ΣEθ‹Π⊕…ιθ∨Π…¹⊕ι¹

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

Nθ                      Input `n`
    Σ                   Sum of
      θ                 `n`
     E                  Mapped over implicit range
        Π               Product of
           ι            Current value
          …             Range to
            θ           `n`
         ⊕              Incremented
       ‹                Less than
              Π         Product of
                ¹       Literal 1
               …        Range to
                  ι     Current value
                 ⊕      Incremented
             ∨          Logical Or
                   ¹    Literal 1
   ⊕                    Incremented
  I                     Cast to string
                        Implicitly print

Productу порожньому списку у Деревне вугілля повертається, Noneа не 1, тому я повинен логічно Orце.


Ви впевнені, що у цих символів 8 біт?
RosLuP

@RosLuP Деревне вугілля - одна з багатьох мов, які ви можете знайти тут, де використовується спеціальна сторінка коду замість, скажімо, ASCII. Це означає, що кожне восьмирозрядне значення відображається на спеціальний символ; ці символи розроблені, щоб допомогти програмісту запам'ятати, що кожен байт робить трохи простіше, ніж якби вони були просто випадковим чином розповсюджені серед однієї зі стандартизованих сторінок коду. Не соромтеся запитати більше деталей у чаті PPCG .
Фларкс

0

PHP , 107 байт

<?php $x=fgets(STDIN);function f($i){return $i==0?:$i*f($i-1);}$n=1;while(f($x)<f($x-$n)**2){$n++;}echo $n;

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

Використовує те саме х2>((х-1)!)2 метод, як використовували інші.

Для цього виклику використовує функціональну функцію з подання PHP (завдяки @ donutdan4114)



0

05AB1E , 7 байт

L!ns!@O

Порт Денніса ♦ 'Відповідь желей, тому обов'язково підтримайте його, якщо вам подобається ця відповідь!

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

L          # List in the range [1, (implicit) input]
 !         # Take the factorial of each
  n        # Then square each
   s!      # Take the factorial of the input
     @     # Check for each value in the list if they are larger than or equal to the
           # input-faculty (1 if truthy; 0 if falsey)
      O    # Sum, so determine the amount of truthy checks (and output implicitly)

0

Japt -x, 7 байт

Порт Деннісового розчину желе.

Працює на практиці лише до n=4тих пір, як ми потрапляємо в наукові позначення вище цього.

õÊ®²¨U²

Спробуй це

õ           :Range [1,input]
 Ê          :Factorial of each
  ®         :Map
   ²        :  Square
    ¨       :  Greater than or equal to
     U²     :  Input squared
            :Implicitly reduce by addition


0

C (gcc) , 68 байт

n;f(x){int i=2,j=x,b=1,g=x;while(i<j)b*i>g?g*=--j:(b*=i++);n=x-j+1;}

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

Редагувати: торгувати байтами проти мульт, не роблячи 2 * x мульт замість x + n

Редагувати: переміщення назад до int замість довгого макросу. Провалився б у 34 з довгим.

Ну, у мене це є у C. Не виходить в 21 рік.

Можлива двозначність щодо того, чи хоче хороша дитина завжди перемагати чи ніколи не програвати ... як ви думаєте?


Зазвичай ми не допускаємо того, як ти визначив Т, будь-якого типу. Ви можете отримати 72 байти, видаливши всі посилання на T, але вам потрібно переслати декларацію i / j / b / g. Спробуйте в Інтернеті!
LambdaBeta

Добре, я повернув версію з int, яка досі становить 68 байт. Тому я насправді не обманював;)
Бальцола

Я залишив би T-версію там, а також альтернативу. Цікаво випробувати більші / менші типи. Хороше подання, хоча!
LambdaBeta

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