크리스마스 어느 날입니까?


27

머리말

잘 알려진 캐롤 인 크리스마스의 십이 일 (Twelve Days of Christmas )에서 화자는 매일 여러 가지 선물을받습니다. 노래는 누적됩니다 -각 구절마다 새로운 선물이 추가되며 이전보다 선물보다 수량이 높습니다. 1 개의 파트 리지, 2 개의 거북이 비둘기, 3 명의 프랑스 암탉 등.

주어진 구절 N 에서 우리는 N 번째 4 면체 수 를 찾아서 지금까지 노래에서 선물의 누적 합계를 계산할 수 있으며 결과는 다음과 같습니다.

Verse 1: 1
Verse 2: 4
Verse 3: 10
Verse 4: 20
Verse 5: 35
Verse 6: 56
Verse 7: 84
Verse 8: 120
Verse 9: 165
Verse 10: 220
Verse 11: 286
Verse 12: 364

예를 들어, 4 절 후에 우리는 4 * (1 partridge) , 3 * (2 거북이 비둘기) , 2 * (3 프랑스 암탉)1 * (4 새 호출)을 가졌습니다 . 이것들을 합하면 우리는 얻을 수 4(1) + 3(2) + 2(3) + 1(4) = 20있습니다.

도전

당신의 임무는 364 ≥ p ≥ 1 의 선물 수를 나타내는 양의 정수가 주어지면 크리스마스의 요일 (절)을 결정 하는 프로그램이나 함수를 작성하는 것입니다.

예를 들어 p = 286 인 경우 우리는 크리스마스 11 일째입니다. 그러나 p = 287 이면 다음 번의 선물이 시작되어 12 일째입니다.

수학적으로 이것은 다음 4 면체 수를 찾고 전체 4 면체 수에서 해당 위치를 반환합니다.

규칙 :

  • 이것은 이므로 가장 짧은 솔루션 (바이트)이 이깁니다.
  • 표준 골프 허점이 적용됩니다.
  • 며칠이되면 프로그램은 1- 색인이어야합니다.
  • 제출은 전체 프로그램 또는 기능이어야하지만 스 니펫은 아닙니다.

테스트 사례

1   ->  1
5   ->  3
75  ->  7
100 ->  8
220 ->  10
221 ->  11
364 ->  12

5
그것이 누군가를 돕는 경우를 대비하여, n 번째 사면체 숫자는 또한 첫 번째 n 삼각 숫자 의 합입니다 .
DJMcMayhem

이것은 도움이 될 수 있습니다. x=>{while(x>p)p+=r+=++i;return i}, JavaScript와 같은 언어로 더 짧아 질 수 있다고 확신합니다.
12Me21

1
이것은 가장 빠른 크리스마스 도전입니까? :)
insertusernamehere

답변:


7

젤리 , 7 6 바이트

Dennis 덕분에 -1 바이트 (벡터화 된 최소 «및 첫 번째 색인 사용 i)

R+\⁺«i

TryItOnline

방법?

그다지 효율적이지는 않습니다. 목록에서 1 차에서 4 차 사면체 수를 순서대로 계산하고 같거나 큰 첫 번째의 1 기반 색인을 반환합니다.

R+\⁺«i - main link: n
R      - range                          [1,2,3,4,...,n]
 +\    - cumulative reduce by addition  [1,3,6,10,...,sum([1,2,3,4,...n])] i.e. triangle numbers
   ⁺   - duplicate previous link - another cumulative reduce by addition
                                        [1,4,10,20,...,nth tetrahedral]
    «  - min(that, n)                   [1,4,10,20,...,n,n,n]
     i - first index of n (e.g. if n=12:[1,4,10,12,12,12,12,12,12,12,12,12] -> 4)

하강 범위를 사용하여 7 byters [0,1,2,3,...,n-1]N 미만 tetrahedrals를 카운팅 :
Ḷ+\⁺<µS,
Ḷ+\⁺<ḅ1,
Ḷ+\⁺<ċ1, 및
Ḷ+\⁺<¹S


19

파이썬 , 27 바이트

lambda n:int((n*6)**.33359)

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

Level River St에서 찾은 원래의 것과 같은 곡선 맞춤이있는 직접 공식.

시프 팅 된 방정식 i**3-i==n*6i**3==n*6큰 값 에 가깝습니다 i. 로 해결됩니다 i=(n*6)**(1/3). 필요에 따라 바닥을 둥글게하여 한 사람 한 사람을 보상합니다.

그러나 오차가 오류보다 높은 정수 아래로 걸리는 경계에는 6 개의 입력이 있습니다. 이러한 오류는 추가 오류없이 지수를 약간 증가시켜 수정할 수 있습니다.


파이썬 , 38 바이트

f=lambda n,i=1:i**3-i<n*6and-~f(n,i+1)

공식 n=i*(i+1)*(i+2)/6사면체 숫자가 더 잘 작성할 수 있습니다 i+1n*6=(i+1)**3-(i+1). 따라서 가장 낮은 값 i을 찾습니다 i**3-i<n*6. 우리 따르는 증가 할 때마다 i1부터 시작은 재귀 호출은 추가 1출력에. 출발에서 시작하는 i=1것이 i=0변화를 보상합니다.


좋은. 나는 이런 식으로 내 골프를 생각했지만 그렇게하지 않았다. 그럼에도 불구하고, 나는 변화를 시도 할 것이다. 우리의 대답은 여전히 ​​다를 것입니다.
0WJYxW9FMN

1
우와 새로운 것이 놀랍습니다.
0WJYxW9FMN

1
26 바이트 버전은 364에서 실패하며 테스트 범위에서 제외됩니다. **.33359하나의 여분의 바이트에 작동합니다.
Dennis

@ 데니스 감사합니다. 파이썬 독점 범위가 다시 공격합니다!
xnor

1
lambda n:n**.3336//.5501몇 바이트를 절약합니다.
Dennis

10

J , 12 바이트

2>.@-~3!inv]

이를 수행하는 골퍼 방법이있을 수 있지만 이는 J의 내장 함수 반전을 사용할 수있는 좋은 기회입니다.

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

작동 원리

2>.@-~3!inv]  Monadic verb. Argument: n

           ]  Right argument; yield n.
      3       Yield 3.
       !inv   Apply the inverse of the ! verb to n and 3. This yields a real number.
              x!y computes Π(y)/(Π(y-x)Π(x)), where Π is the extnsion of the 
              factorial function to the real numbers. When x and y are non-negative
              integers, this equals yCx, the x-combinations of a set of order y.
 >.@-~        Combine the ceil verb (>.) atop (@) the subtraction verb (-) with
              swapped arguments (~).
2             Call it the combined verbs on the previous result and 2.


7

젤리 , 7 바이트

R‘c3<¹S

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

작동 원리

R‘c3<¹S  Main link. Argument: n

R        Range; yield [1, ..., n].
 ‘       Increment; yield [2, ..., n+1].
  c3     Combinations; yield [C(2,3), ..., C(n+1,3)].
    <¹   Yield [C(2,3) < n, ..., C(n+1,3) < n].
      S  Sum; count the non-negative values of k for which C(k+2,3) < n.

2
때로는 젤리가 어떻게 할 수 없는지 궁금합니다 .
솜브레로 치킨

1
요즘 누군가는 "코드 골프 (Code Golf), 모든 기능을 갖춘 MMO"가 될 것이며 Dennis는 "Jelly, 29 bytes"또는 이와 같은 어리석은 것을 게시 할 것입니다.
corsiKa

6

자바 스크립트 (ES6), 33 바이트

n=>(F=k=>k<n?F(k+3*k/i++):i)(i=1)

재귀 공식을 기반으로 :

a(1) = 1
a(i) = (i + 3) * a(i - 1) / i

두 번째 표현은 다음과 같이 쓸 수도 있습니다 ...

a(i) = a(i - 1) + 3 * a(i - 1) / i

... 우리가 여기서 사용하는 것입니다.

a(i - 1)실제로 k변수에 저장되고 까지 다음 반복으로 전달됩니다 k >= n.

테스트 사례


엄청나게 짧습니다! 잘 했어.
FlipTack

@FlipTack 내 첫 번째 시도는 사용한 수식을 기반으로 한 것입니다. 나는 계획을 바꿔야했다. ;-)
Arnauld

6

루비, 26 바이트

편집 : 대체 버전, 여전히 26 바이트

->n{(n**0.3333*1.82).to_i}

원본 버전

->n{((n*6)**0.33355).to_i}

T(x) = x(x+1)(x+2)/6 = ((x+1)**3-(x+1))/6매우 가까운 사실을 사용합니다 (x+1)**3/6.

이 함수는 단순히 6을 곱하고 약간 수정 된 큐브 루트 버전을 찾은 다음 (소수점 5 자리 필요) 정수로 잘린 결과를 반환합니다.

테스트 프로그램 및 출력

f=->n{((n*6)**0.33355).to_i}
[1,4,10,20,35,56,84,120,165,220,286,364].map{|i|p [i,f[i],f[i+1]]}

[1, 1, 2]
[4, 2, 3]
[10, 3, 4]
[20, 4, 5]
[35, 5, 6]
[56, 6, 7]
[84, 7, 8]
[120, 8, 9]
[165, 9, 10]
[220, 10, 11]
[286, 11, 12]
[364, 12, 13]

0.3336원래 버전에서 작동하는 것 같습니다. (편집 : 신경 쓰지 마, Dennis는 내가 약 364를 잊고 있다고 지적합니다.)
xnor

5

자바 스크립트, 36 33 바이트

Luke 덕분에 -3 바이트 (기능이 커리 됨)

n=>f=i=>n<=i/6*-~i*(i+2)?i:f(-~i)

메타 포스트에 설명 된대로 이름을 지정하지 않은 람다 함수로 할당 func하고 호출 할 수 있습니다 . 커리되지 않은 원래 기능은 다음과 같습니다.func(220)()

f=(n,i)=>n<=-~i*i/6*(i+2)?i:f(n,-~i)

이 답변은 다음 함수를 사용하여 x 번째 사면체 수를 찾을 수 있다는 사실을 사용합니다 .

f (x) = x / 6 (x + 1) (x + 2)

제출은 (주어진 선물 수) 보다 크거나 같을 때까지 를 재귀 적으로 증가 i시키고 찾는 방식으로 작동 합니다.tetrahedral(i)n

예상대로 하나의 인수로 호출 될 i = undefined때보 다 크지 않습니다 n. 이것은 f(n,-~i)실행되고로 -~undefined평가되어 1재귀를 시작 함을 의미합니다.


테스트 스 니펫 :

func = n=>f=i=>n<=i/6*-~i*(i+2)?i:f(-~i)

var tests = [1, 5, 75, 100, 220, 221, 364];
tests.forEach(n => console.log(n + ' => ' + func(n)()));


나는 똑같은 대답을 게시하려고했습니다. 2 분만 줘 잘 했어!
Luke

currying으로 3 바이트를 절약 할 수 있습니다 n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i). 당신은 그것을처럼 호출합니다 f(2)().
Luke

@Luke 좋은 자리, 내 카레 기능이 너무 짧지 않았습니다. 귀하의 답변으로 게시하고 싶지 않습니까?
FlipTack

아냐, 다른 공식을 사용한다면 그렇게 할 것이지만 이제 우리의 솔루션은 거의 동일합니다. 차라리 Arnauld와 같은 수준에 도달 할 수 있도록 도와 드리겠습니다. ;-)
누가

3
i=>n<=i아름다운 ;-)
ETHproductions

3

MATL , 12 11 바이트

`G@H+IXn>}@

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

설명

`       % Do...while
  G     %   Push input, n
  @     %   Push iteration index (1-based), say m
  H     %   Push 2
  +     %   Add
  I     %   Push 3
  Xn    %   Binomial coefficient with inputs m+2, 3
  >     %   Is n greater than the binomial coefficient? If so: next iteration
}       %   Finally (execute after last iteration, before exiting the loop)
  @     %   Push last iteration index. This is the desired result
        % End (implicit)
        % Display (implicit)



2

Mathematica, 26 바이트

(0//.i_/;i+6#>i^3:>i+1)-1&

명명되지 않은 함수는 음이 아닌 정수 인수를 사용하고 음이 아닌 정수를 반환합니다 (예, 0너무 작동합니다 ). i입력 #이 최대 i(i+1)(i+2)/6인 가장 작은 정수를 찾고 싶습니다 i. 첫 번째 날 에 주어진 선물 수에 대한 공식입니다 . 가벼운 대수 속임수를 통해 불평등은와 # ≤ i(i+1)(i+2)/6같습니다 (i+1) + 6# ≤ (i+1)^3. 따라서 구조 0//.i_/;i+6#>i^3:>i+1는 a로 시작 하고 테스트 가 만족 되는 한 0계속 추가합니다 . 그런 다음 부등호 안에 괄호로 바이트를 쓰지 않고 끝에서 뺍니다 .1i+6#>i^3(...)-1&1

12 일 동안의 크리스마스를 계속한다면, 우리는 내장 재귀 한계 //.가 프로세스 를 중지시키기 약 65536 일 전에 처리 할 수 ​​있습니다. ....


2

J , 9 바이트

I.~3!2+i.

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

이것은 계승의 역수를 사용하는 것보다 비효율적이지만 더 짧습니다.

예를 들어, 입력 정수가 n = 5 인 경우 범위를 만드십시오 [2, n+1].

2 3 4 5 6 choose 3
0 1 4 10 20

이들은 처음 5 면체 숫자입니다. 다음 단계는 n이 속하는 간격 (일)을 결정하는 것입니다. 거기 N +1 = 6 간격.

0 (-∞, 0]
1 (0, 1]
2 (1, 4]
3 (4, 10]
4 (10, 20]
5 (20, ∞)

그런 다음 n = 5는 간격 3에 속하며 (4, 10]결과는 3입니다.

설명

I.~3!2+i.  Input: integer n
       i.  Range [0, n)
     2+    Add 2 to each
   3!      Combinations nCr with r = 3
I.~        Interval index of n

2

파이썬, 43 바이트

f=lambda n,i=0:n*6>-~i*i*(i+2)and-~f(n,i+1)

@FlipTack 덕분에 5 바이트를 절약 하고 @xnor 덕분에 3 바이트 를 절약했습니다 !


이것이 f(220)=11되어야한다 f(220)=10.
xnor

아, 나는 파이썬 2를 사용하고 있었다. 이것은 바닥 분할을 피하기 위해 파이썬 3이 필요하지만, 버전에 관계없이 다른쪽에 곱할 수 있습니다.
xnor

나는 당신이 할 수있는 생각 and-~f(n,i+1)에 대해 and f(n,i+1)or i. 이상하게도, 변수를 재귀 적으로 반환하지 않고 재귀 적으로 증가시키기 위해 변수를 계산할 때 일반적으로 짧습니다.
xnor

2

Japt , 12 바이트

1n@*6§X³-X}a

온라인으로 테스트하십시오! 또는 모든 테스트 사례를 한 번에 확인

작동 원리

1n@*6§X³-X}a  // Implicit: U = input integer
  @       }a  // Find the smallest non-negative integer X which satisfies this condition:
      X³-X    //   (X ^ 3) - X
     §        //   is greater than or equal to
   *6         //   U * 6.
1n            // Subtract 1 from the result.
              // Implicit: output result of last expression

이것은 몇 가지 다른 답변이 사용하는 사면체 공식의 단순화입니다.

f(x) = (x)(x + 1)(x + 2)/6

대입 x - 1을 위해 x, 우리는 상당히이 문제를 단순화 할 수 있습니다 :

f(x) = (x - 1)(x)(x + 1) / 6
f(x) = (x - 1)(x + 1)(x) / 6
f(x) = (x^2 - 1)(x) / 6
f(x) = (x^3 - x) / 6

따라서 올바른 결과는 입력보다 크거나 x같은 가장 작은 정수보다 작은 (x^3 - x) / 6것입니다.

@xnor의 답변 에서 영감을 얻은 13 바이트 솔루션 :

p.3335 /.55 f

@ETHproductions에 대한 몇 가지 추가 솔루션과 함께 놀았습니다.

J+@*6§X³-X}a 
@*6§X³-X}a -1
@§X/6*°X*°X}a 
_³-V /6¨U}a -1
§(°V nV³ /6?´V:ß
§(°VV³-V /6?´V:ß

여기에서 테스트 하십시오 .


1

SmileBASIC, 43 바이트

INPUT X
WHILE X>P
I=I+1
R=R+I
P=P+R
WEND?I

I날입니다, R는 IS i번째 삼각수와 P는 IS i일 사면체 번호 (선물의 수).

다른 언어로 비슷한 대답을 x=>{while(x>p)p+=r+=++i;return i}할 수 있습니다. 아주 좋을 수 있습니다.


당신 ?I은 마지막에 원합니까?
Nick Matteo

1

파이썬 3, 48 46 바이트

f=lambda x,i=1:f(x,i+1)if(i+3)*i+2<x/i*6else i

@FlipTack Argh! 잠시 후 문제를 해결하겠습니다 ... 아무도 공감하지 마십시오.
0WJYxW9FMN

6
답을 삭제하여 다운 보팅을 방지 할 수 있습니다. 그래도 답변을 수정하고 수정 된 후에는 삭제를 취소 할 수 있습니다.
Laikoni

또한, 이것은 여전히 ​​도전이 요구하는 것을 수행하지 않습니다. 입력 221하면 충돌이 발생합니다.
FlipTack

나는 이것을 TIO에서 테스트했으며 모든 입력에서 충돌합니다. 이게 내 문제입니까 아니면 다른 사람에게 일어나는 일입니까?

그것은 나를 위해 일했다. 다시 테스트하겠습니다.
0WJYxW9FMN


1

하스켈, 21 23 바이트

floor.(**(1/3)).(*6.03)

편집 : xnor가 지적했듯이 원래 솔루션 ( floor.(/0.82).(**0.4))은 크리스마스 시절에는 작동하지 않았습니다.


이것은 많은 입력에 대해 잘못된 답을 제공합니다 (예 : 221).
xnor

0

배치, 69 바이트

@set/an=d=t=0
:l
@set/at+=d+=n+=1
@if %t% lss %1 goto l
@echo %n%

사면체 수를 수동으로 계산합니다.



0

R, 19 자

floor((n*6)^.33359)

xnor의 답변을 기반으로 Python합니다.


0

QBIC , 19 바이트

이것은 @xnor의 공식을 훔칩니다.

:?int((a*6)^.33359)

바이트를 저장하기 위해 해상도를 .3336으로 낮추려고했지만 최종 테스트 케이스에서 실패합니다.


0

배쉬 + BC, 44 바이트

bc -l <<< "f=e(.33359*l($1*6));scale=0;f/1"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.