วันคริสต์มาสคือวันอะไร?


27

คำนำ

ในเพลงคริสต์มาสที่รู้จักกันดีสิบสองวันคริสต์มาสผู้บรรยายนำเสนอด้วยของขวัญมากมายในแต่ละวัน เพลงจะถูกสะสม - ในแต่ละบทกวีมีการเพิ่มของขวัญใหม่โดยมีปริมาณหนึ่งสูงกว่าของขวัญก่อนหน้า หนึ่งนกกระทาสองเต่านกพิราบสามแม่ไก่ฝรั่งเศสและอื่น ๆ

ที่ข้อใดก็ตามNเราสามารถคำนวณผลรวมสะสมของของขวัญเพื่อให้ห่างไกลในเพลงโดยการหาN TH จำนวน tetrahedralซึ่งจะช่วยให้ผล:

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 นกกระทา) , 3 * (2 เต่านกพิราบ) , 2 * (3 ไก่ฝรั่งเศส)และ1 * (4 นกโทร) 4(1) + 3(2) + 2(3) + 1(4) = 20จากข้อสรุปเหล่านี้ที่เราได้รับ

ความท้าทาย

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ให้จำนวนเต็มบวกแทนจำนวนของขวัญ364 ≥ p ≥ 1กำหนดวัน (ข้อ) ของคริสมาสต์

ตัวอย่างเช่นถ้าp = 286เราอยู่ในวันที่ 11 ของวันคริสต์มาส อย่างไรก็ตามหากp = 287 แสดงว่ามีการโหลดของขวัญชิ้นถัดไปหมายความว่าเป็นวันที่ 12

ในทางคณิตศาสตร์นี่คือการค้นหาหมายเลข tetrahedral ถัดไปและกลับตำแหน่งในลำดับตัวเลข tetrahedral ทั้งหมด

กฎ:

  • นี่คือดังนั้นการแก้ปัญหาที่สั้นที่สุด (เป็นไบต์) ชนะ
  • มีช่องโหว่มาตรฐานสำหรับการเล่นกอล์ฟ
  • เมื่อพูดถึงหลายวันโปรแกรมของคุณจะต้องได้รับการจัดทำดัชนี 1 รายการ
  • การส่งของคุณจะต้องเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ แต่ไม่ใช่ตัวอย่าง

กรณีทดสอบ

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

5
ในกรณีที่จะช่วยให้ทุกคนที่n'thจำนวน tetrahedral ยังเป็นผลรวมของแรกnหมายเลขสามเหลี่ยม
DJMcMayhem

สิ่งนี้อาจช่วยได้: x=>{while(x>p)p+=r+=++i;return i}ฉันแน่ใจว่าสามารถทำให้สั้นลงในภาษาเช่น JavaScript
12Me21

1
นี่เป็นความท้าทายครั้งแรกในวันคริสต์มาสใช่ไหม? :)
insertusername ที่นี่

คำตอบ:


7

เยลลี่ , 7 6 ไบต์

-1 ไบต์ขอบคุณเดนนิส (ใช้ค่าเวกเตอร์ขั้นต่ำ«และดัชนีแรกi)

R+\⁺«i

TryItOnline

อย่างไร?

ไม่ใช่ทุกอย่างที่มีประสิทธิภาพ - คำนวณตัวเลขที่ 1 ถึงจำนวน tetrahedral อันดับที่ 1 ตามลำดับในรายการและส่งกลับดัชนีแบบ 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]และนับ tetrahedrals น้อยกว่าโรงเรียน:
Ḷ+\⁺<µS,
Ḷ+\⁺<ḅ1,
Ḷ+\⁺<ċ1และ
Ḷ+\⁺<¹S


19

Pythonขนาด 27 ไบต์

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

ลองออนไลน์!

สูตรโดยตรงที่มีการปรับโค้งบางอย่างเช่นเดียวกับสูตรดั้งเดิมที่พบโดย Level River St.

สมการขยับตัวi**3-i==n*6อยู่ใกล้กับขนาดใหญ่i**3==n*6 มันแก้ไปi i=(n*6)**(1/3)การปูพื้นปัดเศษลงตามความจำเป็นเพื่อชดเชยการปิดทีละอัน

แต่มี 6 อินพุตในขอบเขตที่ข้อผิดพลาดใช้ด้านล่างเป็นจำนวนเต็มมันควรจะอยู่ด้านบน สิ่งเหล่านี้สามารถแก้ไขได้โดยเพิ่มเลขชี้กำลังเล็กน้อยโดยไม่ต้องมีข้อผิดพลาดเพิ่มเติม


Pythonขนาด 38 ไบต์

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

สูตรn=i*(i+1)*(i+2)/6สำหรับตัวเลข tetrahedral สามารถเขียนได้มากขึ้นอย่างในขณะที่i+1 n*6=(i+1)**3-(i+1)ดังนั้นเราจะพบต่ำสุดที่i i**3-i<n*6ทุกครั้งที่เราเพิ่มขึ้นiเริ่มต้นจาก 1 การโทรซ้ำจะเพิ่ม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 a MMO ที่มีคุณสมบัติครบถ้วน" และ Dennis กำลังโพสต์ "Jelly, 29 bytes" หรืออะไรทำนองนั้น
corsiKa

6

JavaScript (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)ถูกจัดเก็บจริงในตัวแปรและส่งผ่านไปยังย้ำต่อไปจนกว่าkk >= 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ดูเหมือนว่าจะใช้งานได้สำหรับเวอร์ชันดั้งเดิม (แก้ไข: ไม่เป็นไรเดนนิสชี้ให้เห็นว่าฉันลืมประมาณ 364)
xnor

5

JavaScript, 36 33 ไบต์

-3 ไบต์ขอบคุณ Luke (ทำให้ฟังก์ชั่น curried)

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

นี่คือฟังก์ชั่นแลมบ์ดาที่ไม่มีชื่อซึ่งสามารถกำหนดให้funcและเรียกด้วยfunc(220)()ดังอธิบายในโพสต์เมตานี้ ฟังก์ชั่นดั้งเดิมที่ไม่ใช่ของฉัน curried ดูเหมือนว่านี้

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

คำตอบนี้ใช้ความจริงที่ว่าหมายเลข tetrahedral 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 นาที เยี่ยมมาก!
ลูกา

คุณสามารถบันทึกได้ 3 ไบต์โดยการn=>g=i=>n<=i/6*++i*++i?i-2:g(~-i)ปิดท้าย: f(2)()คุณจะเรียกมันเหมือน
ลูกา

@ ลุคจุดดีฟังก์ชั่น curated ของฉันไม่สั้น คุณแน่ใจหรือว่าไม่ต้องการโพสต์ข้อความนั้นเป็นคำตอบของคุณเอง?
FlipTack

ไม่ฉันจะทำถ้าเราใช้สูตรที่แตกต่างกัน แต่ตอนนี้โซลูชันของเราเกือบจะเหมือนกัน ฉันอยากช่วยให้คุณอยู่ในระดับเดียวกับ Arnauld ;-)
ลูกา

3
i=>n<=iBeautiful ;-)
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เริ่มต้นด้วย0และยังคงเพิ่ม1ตราบใดที่การทดสอบi+6#>i^3เป็นที่พอใจ; จากนั้น(...)-1&ลบออก1ตอนท้าย (แทนที่จะใช้ไบต์ที่มีวงเล็บอยู่ภายในความไม่เท่าเทียมกัน)

ถ้าเราปล่อยให้ 12 วันคริสต์มาสดำเนินต่อไปเราสามารถจัดการประมาณ 65536 วันก่อนการ จำกัด การเรียกซ้ำในตัวสำหรับ//.หยุดกระบวนการ ... นั่นคือประมาณ 4.7 * 10 ^ 13 วันหรือประมาณสิบเท่าของอายุของจักรวาลในตอนนี้ ....


2

J , 9 ไบต์

I.~3!2+i.

ลองออนไลน์!

สิ่งนี้ไม่มีประสิทธิภาพมากกว่าการใช้อินเวอร์สของแฟคทอเรียล แต่จะสั้นกว่า

ตัวอย่างเช่นถ้าจำนวนเต็มใส่เป็นn = 5 [2, n+1]ให้ช่วง

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

เหล่านี้เป็นตัวเลข tetrahedral 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

Python ขนาด 43 ไบต์

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

บันทึก 5 ไบต์ด้วย@FlipTackและอีก 3 ขอบคุณ@xnor !


นี้จะช่วยให้ซึ่งควรจะf(220)=11 f(220)=10
xnor

โอ้ฉันใช้ Python 2 สิ่งนี้ต้องการ Python 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

นี่คือการทำให้สูตร tetrahedral ของคำตอบอื่น ๆ ใช้:

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มากกว่าหรือเท่ากับอินพุต

โซลูชันขนาด 13 ไบต์ได้แรงบันดาลใจจากคำตอบของ @ xnor :

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คือiหมายเลขสามเหลี่ยมและPเป็นiหมายเลขเตตราไฮรัสที่สาม (จำนวนของขวัญ)

ฉันคิดว่าคำตอบที่คล้ายกันในภาษาอื่นอาจจะ: x=>{while(x>p)p+=r+=++i;return i}ค่อนข้างดี


คุณต้องการ?Iในตอนท้ายใช่ไหม?
Nick Matteo

1

Python 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
คุณสามารถป้องกันการ downvoting ใด ๆ โดยการลบคำตอบของคุณ จากนั้นคุณจะยังสามารถแก้ไขคำตอบและยกเลิกการลบได้เมื่อแก้ไขแล้ว
Laikoni

นอกจากนี้สิ่งนี้ยังไม่ได้ทำในสิ่งที่ความท้าทายถาม อินพุตของ221จะขัดข้อง
FlipTack

ฉันได้ทดสอบสิ่งนี้กับ TIO แล้วและเกิดปัญหากับอินพุตทั้งหมด นี่เป็นปัญหาของฉันหรือเกิดกับคนอื่นหรือไม่

มันใช้งานได้สำหรับฉัน ฉันจะทดสอบอีกครั้ง
0WJYxW9FMN


1

Haskell, 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

QBICขนาด 19 ไบต์

นี่เป็นการขโมยสูตรของ @xnor:

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

ฉันพยายามกดความละเอียดเป็น. 3336 เพื่อบันทึกไบต์ แต่ไม่สำเร็จใน testcase สุดท้าย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.