क्रिसमस का दिन कौन सा है?


27

प्रस्तावना

क्रिसमस के बारह दिनों में प्रसिद्ध कैरोल में, कथावाचक को हर दिन कई उपहार दिए जाते हैं। गीत संचयी है - प्रत्येक कविता में, एक नया उपहार जोड़ा जाता है, इसके पहले उपहार की तुलना में एक अधिक मात्रा होती है। एक पार्ट्रिज, दो कछुए कबूतर, तीन फ्रांसीसी हेन्स, और इसी तरह।

किसी भी कविता, एन पर , हम गीत में अब तक प्रस्तुत किए गए संचयी योग की गणना एन वें टेट्राहेड्रल संख्या को खोजकर कर सकते हैं , जो परिणाम देता है:

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 which 1 की संख्या , यह निर्धारित करता है कि क्रिसमस का कौन सा दिन (कविता) है।

उदाहरण के लिए, यदि p = 286 , हम क्रिसमस के 11 वें दिन हैं। हालाँकि, यदि p = 287 है , तो प्रस्तुत का अगला लोड शुरू हो गया है, जिसका अर्थ है कि यह 12 वां दिन है।

गणितीय रूप से, यह अगला टेट्राहेड्रल नंबर ढूंढ रहा है, और टेट्राहेड्रल नंबरों के पूरे अनुक्रम में अपनी स्थिति वापस कर रहा है।

नियम:

  • यह , इसलिए सबसे छोटा समाधान (बाइट्स में) जीतता है।
  • स्टैंडर्ड गोल्फिंग लूपहोल्स लागू होते हैं।
  • जब यह दिन आता है, तो आपका कार्यक्रम 1-अनुक्रमित होना चाहिए।
  • आपका सबमिशन एक पूर्ण प्रोग्राम या एक फ़ंक्शन होना चाहिए - लेकिन स्निपेट नहीं।

परीक्षण के मामलों

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

5
बस के मामले में यह किसी को भी मदद करता है, n'th चतुष्फलकीय संख्या भी पहले का योग है n त्रिकोणीय संख्या।
DJMcMayhem

यह मदद कर सकता है: x=>{while(x>p)p+=r+=++i;return i}मुझे यकीन है कि इसे जावास्क्रिप्ट जैसी भाषा में छोटा किया जा सकता है।
12M2121

1
यह जल्द से जल्द क्रिसमस चुनौती है, है ना? :)

जवाबों:


7

जेली , 7 6 बाइट्स

डेस धन्यवाद के लिए -1 बाइट (वेक्टर न्यूनतम का उपयोग करें «, और पहला सूचकांक i)

R+\⁺«i

TryItOnline

कैसे?

यह सब कुशल नहीं है - सूची में क्रम में nth 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

पायथन , 27 बाइट्स

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

इसे ऑनलाइन आज़माएं!

कुछ वक्र-फिटिंग के साथ एक सीधा सूत्र, मूल नदी सेंट द्वारा पाया गया मूल के समान है

स्थानांतरित समीकरण बड़े के लिए i**3-i==n*6करीब है । यह करने के लिए हल करती है । फर्श को आवश्यकतानुसार नीचे की ओर ले जाना, ऑफ-बाय के लिए क्षतिपूर्ति करना।i**3==n*6ii=(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+1के रूप में n*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एक अतिरिक्त बाइट के लिए काम करता है।
डेनिस

@ डेनिस धन्यवाद। अजगर विशेष रेंज फिर से हड़ताल!
xnor

1
lambda n:n**.3336//.5501कुछ बाइट्स बचाता है।
डेनिस

10

जे , 12 बाइट्स

2>.@-~3!inv]

ऐसा करने के लिए एक गोल्फ खिलाड़ी हो सकता है, लेकिन जे के अंतर्निहित फ़ंक्शन उलटा का उपयोग करने का यह एक सुंदर अवसर है।

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

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
इन दिनों में से कोई एक "कोड गोल्फ एक पूरी तरह से चित्रित MMO" जैसा होने जा रहा है और डेनिस "जैली, 29 बाइट्स" या कुछ इस तरह बेवकूफ बनाने जा रहा है।
corsiKa

6

जावास्क्रिप्ट (ईएस 6), 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 मेरा पहला प्रयास आपके द्वारा उपयोग किए गए फॉर्मूले पर आधारित था। मुझे अपनी योजना बदलनी पड़ी। ;-)
अरनौलड

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

जावास्क्रिप्ट, 36 33 बाइट्स

ल्यूक के लिए -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 मिनट से हराया। बहुत बढ़िया!
ल्यूक

आप 3 बाइट्स को करीने से बचा सकते हैं n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i):। आपको इस तरह के फोन चाहते हैं f(2)()
ल्यूक

@ अच्छा स्थान, मेरा करी समारोह इतना छोटा नहीं था। क्या आप वाकई अपने स्वयं के उत्तर के रूप में पोस्ट नहीं करना चाहते हैं?
फ्लिपकैक

अगर हम एक अलग फार्मूला का उपयोग कर रहे थे, तो मैं इसे करूंगा, लेकिन अब हमारे समाधान लगभग समान हैं। मैं आपको 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

05AB1E , 10 बाइट्स

XµNÌ3c¹‹_½

इसे ऑनलाइन आज़माएं!

व्याख्या

Xµ          # loop until counter equals 1
  NÌ3c      # binomial_coefficient(iteration_index+2,3)
      ¹     # push input
       ‹_   # not less than
         ½  # if true, increment counter
            # output last iteration index

1
वाह, बिनोम, बहुत [N2Ý+P6÷¹Q#N>अच्छा की तुलना में अधिक चालाक है ।
मैजिक ऑक्टोपस Urn


2

गणितज्ञ, 26 बाइट्स

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

एक nonnegative पूर्णांक तर्क ले रहा है और एक nonnegative पूर्णांक लौटाता है (हाँ, यह दिन के लिए 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

जे , 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)

सहेजे गए 5 बाइट्स @FlipTack और 3 अन्य धन्यवाद @xnor के लिए !


यह देता है f(220)=11, जो होना चाहिए f(220)=10
xnor

ओह, मैं पायथन 2 का उपयोग कर रहा था। मंजिल के विभाजन से बचने के लिए इसे पायथन 3 की आवश्यकता है, हालांकि शायद आप इसे संस्करण-अज्ञेय बनाने के बजाय दूसरी तरफ गुणा कर सकते हैं।
२०:४

मुझे लगता है कि आप कर सकते हैं and-~f(n,i+1)के लिए and f(n,i+1)or i। अजीब बात है, यह आमतौर पर छोटा होता है जब आप एक चर की गिनती कर रहे होते हैं, ताकि इसे वापस नहीं लाया जा सके, बल्कि इसके बजाय पुनरावर्ती रूप से उत्पादन में वृद्धि की जा सके।
xnor

2

जाप , 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एक से अधिक या इनपुट के बराबर है।

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

स्माइलबासिक, 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अंत में चाहते हैं , है ना?
निक मैट्टो

1

पायथन 3, 48 46 बाइट्स

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

@FlipTack अर्घ! मैं इसे एक सेकंड में ठीक कर दूँगा ... कोई भी नीचे नहीं, कृपया।
0WJYxW9FMN

6
आप अपना उत्तर हटाकर किसी भी पतन को रोक सकते हैं। आप फिर भी उत्तर को संपादित कर पाएंगे और इसे ठीक कर लेने के बाद इसे हटा देंगे।
लकोनी

इसके अलावा, यह अभी भी वह नहीं करता है जो चुनौती पूछता है। 221वसीयत का एक इनपुट इसे क्रैश कर देगा।
फ्लिपटैक

मैंने TIO पर इसका परीक्षण किया है और यह सभी इनपुट्स पर क्रैश करता है। क्या यह मेरी समस्या है या किसी और के साथ ऐसा हो रहा है?

इसने मेरे लिए काम किया। मैं फिर से इसका परीक्षण करूंगा।
0WJYxW9FMN


1

हास्केल, 21 23 बाइट्स

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

संपादित करें: जैसा कि xnor ने बताया है, मूल समाधान ( floor.(/0.82).(**0.4)) क्रिसमस के दिनों के बीच काम नहीं करता था


यह उदाहरण के लिए 221 पर कई
उत्तरों

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 के संकल्प को डायल करने की कोशिश की, लेकिन अंतिम टेस्टकेस पर वह विफल हो गया।


0

बैश + बीसी, 44 बाइट्स

bc -l <<< "f=e(.33359*l($1*6));scale=0;f/1"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.