사탕을 얼마나 먹을 수 있습니까?


14

아이디어에 대한 TNB의 Geobits에 대한 크레딧

충분히 상세하지 않고 최근에 재미있는 게임을 상정 :

2 명의 아이들이 사탕 배열 앞에 앉아있다. 사탕의 각 조각은 1에 번호가 매겨집니다x 함께 x사탕 본 총량 인. 각 숫자는 정확히 1 번 발생합니다.

이 게임의 목표는 아이들이 사탕을 먹고 자신이 먹은 사탕의 가치를 곱하여 최종 점수에 도달하는 것입니다.

그러나 원래 게시물에는 사탕 선택 방법과 같은 주요 정보가 누락되었으므로 우리 이야기의 아이들은 나이가 많은 아이가 먼저 가고 사탕을 반으로 먹을 수 있다고 결정했지만, 일단 턴 종료를 발표하면, 그는 마음을 바꿀 수 없습니다.

이 게임의 아이들 중 하나는 사탕을 좋아하지 않기 때문에 가능한 한 적게 먹고 싶어하며 아빠가 한 번 코드를 작성하는 것을 보았고 그로부터 얻은 기술을 사용하여 사탕의 양을 계산할 수 있습니다. 그는 가능한 한 적게 먹으면서 승리를 위해 먹어야한다.

도전

캔디의 총 개수가 주어지면 x프로그램이나 기능은 n상대방이 나머지 캔디를 모두 먹더라도 승리를 보장하기 위해 먹어야하는 최소량의 캔디를 출력해야합니다 .

당연히 더 큰 숫자는 더 큰 숫자를 만들므로, 당신이 그에게 줄 양이 무엇이든, 그는 n 가장 큰 숫자를 입니다.

규칙

  • x언어의 숫자 처리 기능의 상한 인 범위 에서 항상 양의 정수입니다.0 < x! <= ll
  • 아이가 항상 먹을 것을 보장 n에 대한 예를 들어, 가장 큰 숫자를 x = 5하고 n = 2, 그가 먹을 것이다 45

테스트 사례

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
새로운 제목 : "얼마나 많은 사탕을 먹어야합니까?"
Sparr

@Skidsdev? x = 0도 처리 해야합니까 0! = 1? (아마도 x양의 정수로 지정해야합니까?)
Chronocidal

@Chronocidal은 "긍정적 인"정수를 추가했습니다
Skidsdev

나는 땅에 사탕 10k 조각을 던졌다. 작은 인물이 땅에 구멍을 파고 나와 큰 사탕 동굴을 발견했습니다. ) :
moonheart08

답변:


9

파이썬 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)!true 여야합니다.x!>((xn)!)2를 의미합니다! >((x-n)!)2.

Skidsdev에서 -1

-3 -4 BMO 행

Sparr에서 -3

수정 +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
import math;F=math.factorial내가 언급해야 할 파이썬 팁 메타를 찾아야 할 -3 바이트 ...
Sparr

2
@Sparr : 그러나 F=lambda x:x<2or x*F(x-1)3 바이트는 더 적습니까?
ბიმო

5

자바 스크립트 (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 동안 작동합니다 . 그 외에도 가수와 지수 오버플로 (수 확률 + Infinity )와 BigInts (+1 바이트) 가 필요합니다 .

어떻게?

하자 p 다른 아이의 사탕 제품이 될 및하자 q 우리 자신의 사탕 제품합니다.

  1. 우리는 p=n! 시작합니다 ! (다른 아이를위한 모든 사탕)와 q=1 (우리에게는 아무것도 없음).

  2. qp 까지 다음 작업을 반복합니다 .

    • pn으로 나누다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

그것은 될 것입니다 ... :)
Jonathan Allan

@Setop-추가되었습니다.
Jonathan Allan

좋아! 그리고 계승이 많은 모든 솔루션에 비해 빠른 속도를 유지해야합니다.
Setop

아냐, 여전히 모든 제품과 계승을 계산합니다 (다른 솔루션보다 더 낫습니다).
Jonathan Allan

3

R , 70 41 38 바이트

Dennis는 모든 내부 기능을 알고 있기 때문에 -29

-3 scan () 입력으로 전환

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

온라인으로 사용해보십시오!

nedla2004의 Python3 answer 의 아주 간단한 R 구현 .

1 처리의 구현이 더 깨끗하다고 ​​느끼고 중괄호를 잃고 싶습니다.

나는 어떤 접근 방식을 사용하지 않고 화를 냈지만, 나는 엄격히 덜 사용했지만 더 화를 냈지만 여전히 cumprod()기능 이 있다는 것을 몰랐다 . Dennis의 훌륭한 최적화.


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 포트는 Jonathan의 답변 .

채팅에 도움을 주신 ngn 및 H.PWiz에게 감사드립니다. 바이트를 절약 해 주신 ngn에게도 감사드립니다.

원래 코드가 잘못되었다고 지적한 Dennis에게 감사합니다. 그것이 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

하스켈 , 52 51 바이트

엑스!(엑스)! 숫자(엑스)! 그리고 가장 적게 걸립니다 이것이 사실입니다.

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

파이썬 (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]

온라인으로 사용해보십시오!

O (N²) 대신 0 (N) 곱셈과 같은 다른 솔루션보다 훨씬 빠르지 만 코드 크기를 줄일 수는 없습니다.

Jo King의 -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는 매우 새롭기 때문에 코드 나 설명에 대한 팁은 대단히 감사합니다.

Kevin Cruijssen 덕분에 -4 바이트


좋은 대답입니다! 입력을 중단하지 않고 이와 같은 3 바이트를 골프화 할 수 있습니다 1. if 문이 사실이면 인덱스 N를 스택으로 푸시 하고 프로그램을 종료합니다 (해당 인덱스를 내재적으로 출력). 입력 1의 경우 if 문은 거짓이지만 1단일 반복 루프 후에 암시 적 으로 입력을 출력합니다 .
Kevin Cruijssen

1
실제로, 3 바이트 대신 4 바이트를 저장할 수 있습니다 . 온라인 11 바이트 시도하십시오 . 입력은 첫 번째 계승에 암시 적으로 사용됩니다 !. 이제 더 이상 if-result를 복제 / 복제하지 않기 때문에 스택이 비어 있습니다.
Kevin Cruijssen

1
이 아이디어에 감사드립니다. 나는 결국 인쇄에 대한이 아이디어를 얻지 못했지만 for 루프를 일찍 끝내기를 생각했습니다. 휴식, 종료, 종료 및 탈출을 찾은 후에 루프가 올바르게 작동하는 방식을 이해하지 못한다고 생각했습니다. 어떻게 든 해지 된 적이 없습니다.
nedla2004

1
당신의 대답은 이미 꽤 좋았습니다. 일반적으로 기존 답변을 더 골프화 한 다음 아무 것도없이 직접 골프를 치는 것이 더 쉽습니다. 이 도전을 직접 해본다면 아마도 15 또는 14 바이트로 끝났을 것입니다. 나는 파괴의 아이디어를 사용하고 내가 몇 가지를 시도 그 후, 대신 종료하고 암시 적 출력으로 대체하고, 내가 본 결국 I는 또한 수정 테스트 케이스는 것, 더 이상 중복 필요하지 않았다 1암시 적으로 입력을 출력 스택이 비었을 때. :)
Kevin Cruijssen

1
참고 : Dennis ♦ 'Jelly answer를 이식하여 7 바이트 대안을 게시했습니다 . 항상 그렇듯이 Dennis ♦ 는 젤리 코드 골프의 관점에서 마술을 수행 할 수 있습니다.; p
Kevin Cruijssen


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

ProductCharcoal의 빈 목록에서가 None아니라 반환 1하므로 논리적으로 Or해야합니다.


이 문자들이 각각 8 비트인지 확인 하시겠습니까?
RosLuP

@RosLuP Charcoal은 ASCII 대신 사용자 정의 코드 페이지를 사용하는 많은 언어 중 하나입니다. 즉, 각 8 비트 값이 사용자 지정 기호에 매핑됩니다. 이 심볼들은 프로그래머가 표준화 된 코드 페이지 중 하나에 무작위로 분산 된 것보다 각 바이트가하는 일을 조금 더 쉽게 기억하도록 돕기 위해 고안되었습니다. 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

Dennis of Port '젤리 답변 이므로이 답변이 마음에 드시면 그를 투표하십시오!

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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

온라인으로 사용해보십시오!

편집 : x + n 대신 2 * x mults를 수행하지 않고 mults에 대해 바이트 거래

편집 : 매크로를 통해 길지 않고 int로 돌아갑니다. 오랫동안 34에서 실패합니다.

C. Fails at 21에서 이것을 가지고 있습니다.

착한 아이가 항상 이기고 싶거나 잃지 않기를 원하는지 모호 할 수 있습니다. 어떻게 생각하십니까?


일반적으로 T를 정의한 방식이 어떤 유형이든 허용하지 않습니다. T에 대한 모든 참조를 제거하여 72 바이트를 얻을 수 있지만 여전히 i / j / b / g 선언을 전달해야합니다. 온라인으로 사용해보십시오!
LambdaBeta

좋아, 여전히 68 바이트 인 int로 버전을 되 돌렸다. 그래서 나는 실제로 부정 행위를하지 않았다;)
Balzola

나는 거기에 T 버전과 대안을 남겨 둘 것입니다. 더 크거나 작은 유형을 시도하는 것이 흥미 롭습니다. 그래도 좋은 제출!
LambdaBeta

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.