Bạn có thể ăn bao nhiêu kẹo?


14

Tín dụng cho Geobits trong TNB cho ý tưởng

Một bài đăng không có đủ chi tiết gần đây đã đặt ra một trò chơi thú vị:

2 đứa ngồi trước một mảng kẹo. Mỗi miếng kẹo được đánh số từ 1 đến x, với xtổng số kẹo hiện tại. Có chính xác 1 lần xuất hiện của mỗi số.

Mục tiêu của trò chơi là cho trẻ em ăn kẹo và nhân giá trị của số kẹo chúng đã ăn để đạt được điểm số cuối cùng, với điểm số cao hơn sẽ giành chiến thắng.

Tuy nhiên, bài đăng gốc đã bỏ lỡ thông tin quan trọng, chẳng hạn như cách chọn kẹo, vì vậy những đứa trẻ trong câu chuyện của chúng tôi đã quyết định rằng đứa trẻ lớn hơn sẽ được đi trước, và có thể ăn tới một nửa số kẹo, tuy nhiên một khi nó thông báo kết thúc lượt của mình, anh không thể thay đổi ý định.

Một trong những đứa trẻ trong trò chơi này không thích kẹo, vì vậy anh ta muốn ăn ít nhất có thể, và anh ta đã từng xem cha mình viết một số mã một lần, và con số anh ta có thể sử dụng các kỹ năng thu được từ đó để tìm ra bao nhiêu kẹo anh ta cần ăn để đảm bảo chiến thắng, trong khi vẫn ăn ít nhất có thể.

Các thách thức

Với tổng số kẹo x, chương trình hoặc chức năng của bạn sẽ xuất ra số kẹo nhỏ nhất mà anh ta phải ăn để đảm bảo chiến thắng n, ngay cả khi đối thủ của anh ta ăn hết số kẹo còn lại.

Những con số lớn hơn tự nhiên tạo ra những con số lớn hơn, vì vậy bất cứ số tiền nào bạn sẽ cho anh ta, anh ta sẽ ăn những ncon số lớn nhất.

Những quy định

  • xSẽ luôn có một dương tính số nguyên trong phạm vi 0 < x! <= lnơi llà giới hạn trên của xử lý số khả năng của ngôn ngữ của bạn
  • Nó được đảm bảo rằng đứa trẻ sẽ luôn ăn những ncon số lớn nhất, ví dụ như , x = 5n = 2nó sẽ ăn 45

Các trường hợp thử nghiệm

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]))

Chấm điểm

Thật không may, thí sinh dũng cảm của chúng tôi không có gì để viết mã của anh ấy, vì vậy anh ấy phải sắp xếp các mẩu kẹo thành các ký tự của mã, do đó, mã của bạn cần phải nhỏ nhất có thể, mã nhỏ nhất tính bằng byte sẽ thắng!


14
Tôi có thể ăn bao nhiêu kẹo? Tất cả. Tất cả các kẹo.
admBorkBork

3
Tiêu đề mới: "Bạn cần ăn bao nhiêu kẹo?"
Sparr

@Skidsdev x = 0cũng nên được xử lý, kể từ khi 0! = 1nào? (Có lẽ xcũng nên được chỉ định là Số nguyên dương?)
Chronocidal

@Chronocidal đã thêm số nguyên "dương"
Skidsdev

Tôi đã ném 10k kẹo trên mặt đất. Một hình người nhỏ đào một cái hố xuống đất và tìm thấy một hang kẹo khổng lồ vì tôi. ):
moonheart08

Câu trả lời:


9

Python 3 , 76 byte

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)

Hãy thử trực tuyến!

Dựa vào thực tế là để ăn n kẹo vẫn chiến thắng và tổng số kẹo là x , x!(xn)!>(xn)!phải đúng, có nghĩa làx!>((xn)!)2.

-1 từ Skidsdev

-3 -6 từ BMO

-3 từ Sparr

+6 để sửa x = 1


1
Bạn có thể lưu 1 byte bằng cách thay thế chức năng hàng đầu bằngfrom math import factorial as F
Skidsdev

1
Bạn có thể viết lại các đệ quy này bằng cách sử dụng hành vi ngắn mạch, vd. cho cái thứ hai : n*(F(x)>F(x-n)**2)or f(x,n+1). Tương tự x<2or x*F(x-1)cho cái đầu tiên ngắn hơn nhập khẩu.
ბიმო

1
Tất cả ba trong số đó là những gợi ý tốt đẹp, cảm ơn. (Và đã thêm)
nedla2004

1
-3 byte import math;F=math.factorialmà tôi có lẽ nên đi tìm meta mẹo python để đề cập đến ...
Sparr

2
@Sparr: Nhưng F=lambda x:x<2or x*F(x-1)ba byte có ít hơn không?
ბიმო

5

JavaScript (ES6), 53 byte

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

Hãy thử trực tuyến!

Phạm vi làm việc

Thật thú vị, sự khác biệt giữa các sản phẩm của trẻ em luôn đủ lớn để việc mất độ chính xác vốn có của mã hóa IEEE 754 không phải là vấn đề.

Kết quả là, nó hoạt động với giá trị 0n170 . Ngoài ra, cả mantissa và tràn số mũ (năng suất + Vô cực ) và chúng ta đều cần BigInts (+1 byte).

Làm sao?

Đặt p là sản phẩm kẹo của đứa trẻ khác và để q là sản phẩm kẹo của riêng chúng tôi.

  1. Chúng tôi bắt đầu với p=n!(tất cả kẹo cho đứa trẻ khác) và q=1 (không có gì cho chúng tôi).

  2. Chúng tôi lặp lại các hoạt động sau cho đến khi qp :

    • chia p cho n
    • nhân q với n
    • giảm n

Kết quả là số lần lặp được yêu cầu. (Ở mỗi lần lặp lại, chúng tôi 'lấy kẹo cao nhất tiếp theo từ đứa trẻ khác'.)

Đã bình luận

Điều này được thực hiện như là một hàm đệ quy duy nhất mà lần đầu tiên tính n!và sau đó đi vào vòng lặp được mô tả ở trê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

Thạch , 9 byte

ḊPÐƤ<!€TL

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

Ḋ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
điều đó thật ấn tượng nhưng sẽ mang tính giáo dục hơn nếu được giải thích
Setop

Nó sẽ là ... :)
Jonathan Allan

@ Setop - đã thêm.
Jonathan Allan

thích nó và nó phải nhanh chóng được so sánh với tất cả các giải pháp với hàng tấn giai thừa
Setop

Không, vẫn tính toán tất cả những sản phẩm và giai thừa (nhiều hơn một số giải pháp khác).
Jonathan Allan

3

R , 70 41 38 byte

-29 vì Dennis biết tất cả các chức năng nội bộ

-3 chuyển sang quét () đầu vào

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

Hãy thử trực tuyến!

Việc thực hiện R khá đơn giản cho câu trả lời Python3 của nedla2004 .

Tôi cảm thấy như có một cách thực hiện xử lý 1 lần sạch hơn và tôi muốn mất các dấu ngoặc nhọn.

Tôi tức giận Tôi đã không quay lại sử dụng một cách tiếp cận nào, điên rồ hơn là tôi đã sử dụng một cách nghiêm ngặt ít hơn, nhưng thậm chí còn điên rồ hơn mà tôi không biết có một cumprod()chức năng. Tối ưu hóa tuyệt vời của Dennis.


3

APL (Dyalog Unicode) , 10 byte

+/!≤2*⍨!∘⍳

Hãy thử trực tuyến!

Câu trả lời của cảng Dennis . Cảm ơn, tốt, Dennis cho nó.

Làm sao:

+/!≤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.

Vì câu trả lời này không được tôi thực hiện nghiêm túc, tôi sẽ giữ câu trả lời ban đầu của mình bên dưới.


APL (Dyalog Unicode) , 14 12 11 byte

(+/!>×\)⌽∘⍳

Hãy thử trực tuyến!

Chức năng tiền tố ngầm. Về cơ bản là một cổng Dyalog trong câu trả lời của Jonathan .

Cảm ơn ngn và H.PWiz đã giúp đỡ trong trò chuyện. Cảm ơn ngn cũng đã tiết kiệm cho tôi một byte.

Cảm ơn Dennis vì đã chỉ ra rằng mã gốc của tôi đã sai. Hóa ra nó đã tiết kiệm cho tôi 2 byte.

Công dụng ⎕IO←0.

Làm sao:

+/(!>×\)∘⌽∘⍳  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
nếu +/đi vào bên trong dấu ngoặc đơn, một trong các tác phẩm có thể được bỏ qua:(+/!>×\)⌽∘⍳
ngn


2

Thạch , 7 byte

R!²<!ċ0

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Con trăn 3 , 183 176 149 byte

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]

Hãy thử trực tuyến!

Nó nhanh hơn rất nhiều so với một số giải pháp khác - phép nhân 0 (N) thay vì O (N²) - nhưng tôi không thể quản lý để giảm kích thước mã.

-27 từ Jo King



1

05AB1E , 15 11 byte

E!IN-!n›iNq

Hãy thử trực tuyến!

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

Sử dụng phương pháp tương tự như Python của tôi trình . Rất mới đối với 05AB1E vì vậy bất kỳ lời khuyên về mã hoặc giải thích đều được đánh giá cao.

-4 byte nhờ Kevin Cruijssen


Câu trả lời tốt đẹp! Bạn có thể chơi golf 3 byte như thế này mà không phá vỡ đầu vào 1. Nếu câu lệnh if là trung thực, nó sẽ đẩy chỉ mục Nvào ngăn xếp và thoát khỏi chương trình (xuất ra chỉ mục đó hoàn toàn). Đối với đầu vào 1, câu lệnh if sẽ là falsey, nhưng nó sẽ xuất đầu vào của nó 1hoàn toàn sau vòng lặp đơn đó.
Kevin Cruijssen

1
Trên thực tế, 4 byte có thể được lưu thay vì 3: Hãy thử trực tuyến 11 byte . Đầu vào sẽ được sử dụng hoàn toàn cho giai thừa đầu tiên !, bây giờ ngăn xếp trống vì chúng tôi không còn trùng lặp / nhân ba kết quả if-result.
Kevin Cruijssen

1
Cảm ơn những ý tưởng này. Mặc dù tôi đã không có ý tưởng in ấn này vào cuối, tôi đã nghĩ đến việc kết thúc vòng lặp for sớm. Sau khi tìm cách phá vỡ, kết thúc, bỏ cuộc và trốn thoát, tôi chỉ nghĩ rằng mình không hiểu cách các vòng lặp hoạt động chính xác. Bằng cách nào đó chấm dứt không bao giờ xảy ra với tôi.
nedla2004

1
Câu trả lời của bạn đã khá tốt. Việc đánh golf câu trả lời hiện có thường dễ dàng hơn, sau đó tự đánh golf nó từ không có gì. Nếu tôi tự thực hiện thử thách này thì có lẽ tôi cũng đã kết thúc ở mức 15 hoặc 14 byte. Thay vào đó, tôi đã sử dụng ý tưởng phá vỡ và thay thế nó bằng một đầu ra kết thúc và ẩn, sau đó tôi đã thử một vài điều, và cuối cùng tôi thấy tôi không cần bản sao nữa, điều này cũng sẽ khắc phục trường hợp kiểm tra 1xuất ra đầu vào ngầm khi ngăn xếp trống :)
Kevin Cruijssen 14/12/18

1
FYI: Tôi đã đăng một thay thế 7 byte bằng cách chuyển câu trả lời Jelly của Dennis ♦ . Như mọi khi, Dennis ♦ có thể thực hiện phép thuật trong môn đánh gôn Jelly ..; p
Kevin Cruijssen 14/12/18


0

Than , 20 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Producttrên một danh sách trống trong Char than trả về Nonechứ không phải 1, vì vậy tôi phải logic Ornó.


Bạn có chắc chắn các ký tự này là 8 bit mỗi?
RosLuP

@RosLuP Char than là một trong nhiều ngôn ngữ bạn có thể tìm thấy ở đây sử dụng trang mã tùy chỉnh thay vì, ASCII. Điều này có nghĩa là mỗi giá trị tám bit được ánh xạ tới một biểu tượng tùy chỉnh; các ký hiệu này được thiết kế để giúp lập trình viên nhớ những gì mỗi byte thực hiện dễ dàng hơn một chút so với việc chúng chỉ được phân tán ngẫu nhiên giữa một trong các trang mã được tiêu chuẩn hóa. Vui lòng hỏi thêm chi tiết trong trò chuyện PPCG .
Phlarx

0

PHP , 107 byte

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

Hãy thử trực tuyến!

x2>((x-1)!)2 như những người khác đã sử dụng.

Sử dụng chức năng giai thừa từ trình PHP cho thử thách này (nhờ @ donutdan4114)



0

05AB1E , 7 byte

L!ns!@O

Port of Dennis ♦ 'Jelly answer , vì vậy hãy đảm bảo nâng cấp anh ấy nếu bạn thích câu trả lời này!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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 byte

Giải pháp cảng Dennis 'Jelly.

Chỉ hoạt động trong thực tế cho đến n=4khi chúng ta đi vào ký hiệu khoa học ở trên đó.

õÊ®²¨U²

Thử nó

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


0

C (gcc) , 68 byte

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

Hãy thử trực tuyến!

Chỉnh sửa: giao dịch byte chống lại các lỗi, không thực hiện các lỗi 2 * x thay vì x + n

Chỉnh sửa: di chuyển trở lại int thay vì dài qua macro. Sẽ thất bại ở tuổi 34 với thời gian dài.

Vâng, tôi có cái này trong C. Thất bại ở 21.

Có một sự mơ hồ có thể là liệu đứa trẻ ngoan muốn luôn luôn chiến thắng hay không bao giờ thua ... bạn nghĩ gì?


Thông thường, chúng tôi không cho phép cách bạn xác định T là bất kỳ loại nào. Bạn có thể nhận được 72 byte bằng cách xóa tất cả các tham chiếu đến T, nhưng bạn phải chuyển tiếp khai báo i / j / b / g. Hãy thử trực tuyến!
LambdaBeta 17/12/18

OK tôi đặt lại phiên bản với int, vẫn là 68 byte. Vì vậy, tôi đã không thực sự gian lận;)
Balzola

Tôi sẽ để phiên bản T ở đó cũng như một giải pháp thay thế. Thật thú vị khi thử các loại lớn hơn / nhỏ hơn. Tốt trình mặc dù!
LambdaBeta 17/12/18

0

Python 3 , 75 byte

f=lambda n:n<1or f(n-1)*n
n=lambda x:x-sum(f(n)**2<f(x)for n in range(1,x))

Hãy thử trực tuyến!

Phiên bản 74 byte

f=lambda n:n<1or f(n-1)*n
n=lambda x:1+sum(f(n)>f(x)**.5for n in range(x))

nhưng phiên bản này đã tràn tới 500 ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.