Сколько конфет вы можете съесть?


14

Кредит Геобитсу в ТНБ за идею

Пост без достаточно подробно недавно положенный интересная игра:

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

Я бросил 10 тысяч конфет на землю. Маленькая фигура вырыла яму в земле и нашла гигантскую конфетную пещеру из-за меня. ):
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 от Спарра

+6 чтобы исправить x = 1


1
Вы можете сохранить 1 байт, заменив верхнюю функцию наfrom math import factorial as F
Skidsdev 12.12-18

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которыми я, вероятно, должен пойти, найти мета-подсказку Python, чтобы упомянуть ...
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 байт).

Как?

Пусть п будет конфетным продуктом другого ребенка, и пусть Q будет нашим собственным конфетным продуктом.

  1. Начнем с пзнак равноN!(все конфеты для другого ребенка) и Qзнак равно1 (ничего для нас).

  2. Мы повторяем следующие операции, пока Qп :

    • разделить п на 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

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

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

нравится ! и это должно быть быстро по сравнению со всеми решениями с тоннами факториалов
Setop

Нет, все еще вычисляет все эти продукты и факториалы (больше, чем некоторые другие решения).
Джонатан Аллан

3

R , 70 41 38 байт

-29 потому что Денис знает все внутренние функции

-3 переключение на вход сканирования ()

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

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

Довольно простая R-реализация ответа nedla2004 на Python3 .

Я чувствую, что есть более чистая реализация 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 байт

(+/!>×\)⌽∘⍳

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

Префиксная молчаливая функция. В основном порт Джонатана от Dyalog .

Спасибо 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
если +/в скобках указано одно, то композиции могут быть опущены:(+/!>×\)⌽∘⍳
ngn

2

Haskell , 52 51 байт

Используя простой подход: мы проверяем, является ли продукт последнего N числа, которые Икс!(Икс-N)! меньше, чем произведение первого N числа, а именно (Икс-N)! и занимает меньше всего N для которого это правда.

g b=product[1..b]
f x=[n|n<-[1..],g(x-n)^2<=g x]!!0

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


2

Желе , 7 байт

R!²<!ċ0

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

Как это устроено

R!²<!ċ0  Main link. Argument: n

R        Range; yield [1, ..., n].
 !       Map factorial over the range.
  ²      Take the squares of the factorials.
    !    Compute the factorial of n.
   <     Compare the squares with the factorial of n.
     ċ0  Count the number of zeroes.

2

Python 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 байта благодаря Кевину Круйссену


Хороший ответ! Вы можете играть в гольф 3 байт , как это , не нарушая вход 1. Если оператор if верен, он помещает индекс Nв стек и выходит из программы (неявно выводя этот индекс). Для ввода 1оператор if будет ложным, но он будет выводить свой ввод 1неявно после этого цикла с одной итерацией.
Кевин Круйссен

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

1
Спасибо за эти идеи. Несмотря на то, что я не дошел до идеи печати в конце, я все же думал о завершении цикла for на ранней стадии. После поиска перерыва, конца, выхода и побега я просто подумал, что не понимаю, как правильно работают циклы. Как-то прекратить никогда не происходило со мной.
Недла2004

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

1
К вашему сведению: я опубликовал 7-байтовую альтернативу, портировав Дениса ♦ «Желе ответ. Как всегда, Деннис ♦ умеет творить магию с точки зрения игры в желе с кодом-гольфом.; P
Кевин Круйссен


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в пустом списке в Charcoal возвращается, Noneа не 1, так что я должен логически Orэто.


Вы уверены, что эти символы 8 бит каждый?
РосЛюП

@RosLuP Древесный уголь - один из многих языков, которые вы можете найти здесь, который использует пользовательскую кодовую страницу вместо, скажем, ASCII. Это означает, что каждое восьмибитное значение сопоставляется с пользовательским символом; Эти символы предназначены для того, чтобы помочь программисту запомнить, что каждый байт делает немного проще, чем если бы они были просто случайно распределены среди одной из стандартизированных кодовых страниц. Не стесняйтесь спрашивать более подробную информацию в чате PPCG .
Phlarx

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

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

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

Редактировать: переход к int вместо long через макрос. Сбой на 34 с долго.

Ну, у меня есть это в C. Сбой в 21.

Существует некоторая двусмысленность относительно того, хочет ли хороший ребенок всегда выигрывать или никогда не проигрывать ... как вы думаете?


Как правило, мы не допускаем, чтобы вы определили T как любой тип. Вы можете получить 72 байта, удалив все ссылки на T, но вам все еще нужно объявить i / j / b / g. Попробуйте онлайн!
LambdaBeta

Хорошо, я вернул версию с int, которая по-прежнему составляет 68 байт. Так что я на самом деле не обманывал;)
Бальцола

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.