तीन त्रिकोणीय संख्या [बंद]


19

विवरण

पहले इन नंबरों के विषय में कुछ अन्य चुनौतियाँ थीं, और मुझे उम्मीद है कि यह उनमें से एक नहीं है।

N वें त्रिकोणीय संख्या अप करने के लिए सभी प्राकृतिक संख्याओं का योग के बराबर होती है n , सरल सामान। जो लोग खुद को आगे सूचित करना चाहते हैं, उनके लिए एक विकिपीडिया पृष्ठ और OEIS में एक प्रविष्टि है

अब, गॉस ने पाया कि प्रत्येक प्राकृतिक संख्या को तीन त्रिकोणीय संख्याओं के योग के रूप में व्यक्त किया जा सकता है (इनमें शामिल हैं 0), और एक से अधिक संख्या में एक बार होना ठीक है, जैसे 0 + 1 + 1 = 2

चुनौती

आपका कार्य एक प्रोग्राम या फ़ंक्शन लिखना है, जिसे एक प्राकृतिक संख्या (सहित 0) दिया गया है, तीन त्रिकोणीय संख्याओं को प्रिंट करता है जो तर्क पर निर्भर करता है। आप रिक्त स्थान द्वारा अलग किए गए नंबरों को एक सरणी के रूप में, या किसी अन्य विधि द्वारा पसंद कर सकते हैं। हालाँकि, किसी भी निर्मित फ़ंक्शंस का उपयोग करने के लिए सीधे तौर पर एक सरणी, एक सीमा या किसी अन्य प्रकार के संग्रह को प्राप्त करने की मनाही है जिसमें त्रिकोणीय संख्याओं की सूची होती है (उदाहरण के लिए एक एकल परमाणु जो रेंज उत्पन्न करता है)।

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

9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0

नोट: यदि एक से अधिक संभावित संयोजन हैं, तो आप किसी भी या सभी को प्रिंट कर सकते हैं, लेकिन आपको केवल एक बार किसी भी संयोजन को प्रिंट करना होगा, जो अन्य संयोजनों को पुन: व्यवस्थित करने का एक परिणाम है। मैं वास्तव में एक कोशिश-यह लिंक और एक स्पष्टीकरण की सराहना करता हूं, मैं वास्तव में यह देखना पसंद करता हूं कि आप समस्या को कैसे हल करते हैं;)

यह , इसलिए मानक कमियां लागू होती हैं। बाइट्स जीतने में सबसे छोटा जवाब हो सकता है!


1
12 के लिए आप 1 + 1 + 10. भी कर सकते हैं
आउटगोल्फ जूल

1
@steenbergh aहमेशा त्रिकोणीय संख्या नहीं होगी
फेलिप

3
मैं " निर्मित कार्यों को सीधे एक सरणी, एक सीमा या किसी अन्य प्रकार के संग्रह में त्रिकोणीय संख्याओं की सूची में " दो तरीकों से पार्स कर सकता हूं , लेकिन दोनों में से कोई भी समझ में नहीं आता है। पहला उन सभी निर्माणों को प्रतिबंधित करता है जो सीधे एक सरणी प्राप्त करते हैं, लेकिन ऐसा लगता है कि मुझे पता है कि हर भाषा में सरणियों के सभी उपयोग को प्रतिबंधित करने के लिए; अन्य बिल्डरों को " सीधे पाने के लिए ... एक सीमा ... त्रिकोणीय संख्याओं की सूची वाले " पर प्रतिबंध लगाते हैं , लेकिन मुझे नहीं पता कि इसका क्या मतलब होगा।
पीटर टेलर

2
तो निर्मित कार्य करता है जो एक तर्क ले nऔर पहले की एक सूची प्रदान nत्रिकोण संख्या रहे हैं की अनुमति दी? ऐसा लगता है कि कुछ विशिष्ट भाषा के खिलाफ लक्षित है, हालांकि मुझे नहीं पता कि कौन सा।
पीटर टेलर

4
मैं आपसे इस प्रतिबंध को उठाने का आग्रह करता हूं। मैं आपसे वादा करता हूं कि यह इंटर-लैंग्वेज उत्तर गुणवत्ता या निष्पक्षता को आपके सोचने के तरीके में सुधार नहीं करेगा।
लिन

जवाबों:


8

05AB1E , 10 बाइट्स

कोड:

ÝηO3ãʒOQ}¬

स्पष्टीकरण:

Ý             # Compute the range [0 .. input]
 η            # Get the prefixes
  O           # Sum each prefix to get the triangle numbers
   3ã         # Cartesian repeat 3 times
     ʒ  }     # Keep elements that
      OQ      #   have the same sum as the input
         ¬    # Retrieve the first element

05AB1E एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं!


आह ... हां; वह करूँगा।
मैजिक ऑक्टोपस Urn

7

पायथन 2 , 99 बाइट्स

from random import*
n=input()
while 1:b=sample([a*-~a/2for a in range(n+1)]*3,3);n-sum(b)or exit(b)

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

मैं बहुत आश्चर्यचकित हूं कि यह छोटी itertoolsया ट्रिपल लिस्ट की समझ से कम है ! हर बार जब आप इसे चलाते हैं तो यह (अंततः) एक यादृच्छिक उत्तर देता है।

दो 102s:

n=input();r=[a*-~a/2for a in range(n+1)];print[(a,b,c)for a in r for b in r for c in r if a+b+c==n][0]
def f(n):r=[a*-~a/2for a in range(n+1)];return[(a,b,c)for a in r for b in r for c in r if a+b+c==n][0]

itertools 106 लगता है:

from itertools import*;lambda n:[x for x in product([a*-~a/2for a in range(n+1)],repeat=3)if sum(x)==n][0]

यादृच्छिक उत्पादन के लिए +1। :) मैं भी हैरान हूँ कि सबसे छोटा समाधान देता है (इस प्रकार दूर)।
केविन क्रूज़सेन

विधि के लिए बहुत बहुत धन्यवाद। इसी रूबी कोड में 57 बाइट्स हैं।
एरिक डुमिनील

3

जेली , 12 बाइट्स

0r+\œċ3S=¥Ðf

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

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

0r+\œċ3S=¥Ðf   input: n
0r             [0 1 ... n]
  +\           cumsum
    œċ3        combinations of 3 elements, with repetition
          Ðf   filter on
       S          sum
        =         equals n

कृपया एक विवरण जोड़ने पर विचार करें .. =)
racer290

2
@ racer290 किया।
लीकी नून

3

ब्रेकीलॉग , 13 बाइट्स

⟦⟦ᵐ+ᵐj₃⊇Ṫ.+?∧

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

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

⟦⟦ᵐ+ᵐj₃⊇Ṫ.+?∧  input: n
⟦              [0 1 ... n]
 ⟦ᵐ            [[0] [0 1] [0 1 2] ... [0 1 ... n]]
   +ᵐ          [0 1 3 ... n(n+1)/2]
     j₃        [0 1 3 ... n(n+1)/2 0 1 3 ... n(n+1)/2 0 1 3 ... n(n+1)/2]
       ⊇       is a superset of
        Ṫ      a list of three elements 
         .     which is the output
          +?   which sums up to be the input

2

MATL , 18 बाइट्स

Q:qYs3Z^t!sG=fX<Y)

यह लेक्सोग्राफिक क्रम में पहले परिणाम को आउटपुट करता है।

MATL ऑनलाइन पर यह कोशिश करो !

व्याख्या

Q     % Implicitly input n. Add 1
:     % Range (inclusive, 1-based): gives [1 2 ... n+1]
q     % Subtract 1 (element-wise): gives [0 1 ... n]
Ys    % Cumulative sum
3Z^   % Cartesian power with exponent 3. Gives a matrix where each row is a
      % Cartesian tuple
t     % Duplicate
!s    % Sum of each row
G=    % Does each entry equal the input?
f     % Find indices that satisfy that condition
X<    % Minimum
Y)    % Use as row index into the Cartesian power matrix. Implicitly display

2

हास्केल, 66 59 बाइट्स

सभी समाधानों के उत्पादन की अनुमति देने के लिए धन्यवाद, जो आकर्षक व्याकुलता थी! मुझे एक समाधान निकालने की आवश्यकता नहीं होने पर मैं बहुत खुश था और उन सभी को देने में सक्षम था कि मैंने उन लागतों पर ध्यान नहीं दिया जो अनुमत समाधानों से बचने से आता है। @ लिन की टिप्पणी ने मुझे समझाया और मुझे 7 बाइट्स बचाने के लिए कहा।

f n|l<-scanl(+)0[1..n]=[(a,b,c)|c<-l,b<-l,a<-l,a+b+c==n]!!0

यह lसभी संयोजनों की जाँच करने और जाँचने के लिए पर्याप्त से अधिक त्रिकोणीय संख्याओं को बांधता है ।


a>=b,b>=cशर्तों को छोड़ने और !!0अपने कोड के लिए प्रत्यय भी एक वैध जवाब नहीं है? सभी समाधानों का आउटपुट देने से वास्तव में आपको यहाँ मदद नहीं मिलती है।
लिन

@ लीन यू आर राइट ऑफ कोर्स, मैं विचलित हो गया। धन्यवाद!
क्रिश्चियन सिवर्स

2

रेटिना , 63 59 बाइट्स

.+
$*
^((^1|1\2)*)((1(?(4)\4))*)((1(?(6)\6))*)$
$.1 $.3 $.5

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। (1(?(1)\1))*एक सामान्यीकृत त्रिकोणीय संख्या मिलानकर्ता है, लेकिन पहले त्रिकोणीय संख्या के लिए हम ^शुरुआती मैच के लिए कुछ बाइट्स बचा सकते हैं ।



1

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

lambda n:[l for l in combinations_with_replacement([(t**2+t)/2for t in range(n)],3)if sum(l)==n]
from itertools import*

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

12 बाइट्स बचाने के लिए @WheatWizard को धन्यवाद!


आपकी map(और शायद आपके फ़िल्टर) को सूची समझ के रूप में छोटा लिखा जा सकता है।
गेहूं जादूगर


@ विचार के लिए धन्यवाद, मैं विश्वास नहीं कर सकता मैं एक सूची के बारे में समझ के बारे में सोचा नहीं थाmap
चेस वोगेली

फ़िल्टर ऑब्जेक्ट पूरी तरह से मान्य आउटपुट हैं, लेकिन यदि आप एक सूची का उत्पादन करना चाहते हैं , तो आप इस तरह से एक स्पैट का उपयोग कर सकते हैं[*filter(...)]
गेहूं जादूगर

1
मैंने (x,y,z) for x,y,z in...जो कोशिश की थी , वह आपके l for l in...अंतर से अधिक है जो उस अंतर के लिए संभव है।
चेस वोगेली

1

सी / सी ++ - 197 बाइट्स

#include<stdio.h>
#define f(i,l,u) for(int i=l;i<=u;i++)
int t(int n){return n>1?n+t(n-1):n;}
int c(int n){f(a,0,n)f(b,a,n)f(c,b,n)if(t(a)+t(b)+t(c)==n)return printf("%d %d %d\n",t(a),t(b),t(c));}

एक के बाद एक प्रहार:

#include<stdio.h>

प्रिंटफ के लिए चाहिए। सी के कुछ संस्करणों के लिए elided किया जा सकता है

#define f(i,l,u) for(int i=l;i<=u;i++)

लूप के लिए अंतरिक्ष की बचत।

int t(int n){return n>1?n+t(n-1):n;}

पुनरावर्ती त्रिकोण मूल्यांकनकर्ता।

int c(int n){f(a,0,n)f(b,a,n)f(c,b,n)if(t(a)+t(b)+t(c)==n)return printf("%d %d %d\n",t(a),t(b),t(c));}

यह आदमी हैवी लिफ्टिंग करता है। लूप्स के लिए तीन नेस्टेड ए, बी, सी से 0 से एन तक, ध्यान दें कि बी और सी प्रत्येक इटरेट को पिछले मान से एन तक। यह कड़ाई से आवश्यक नहीं है कि पुनरावृत्ति को ट्रिम करें जैसे कि returnएक मिनट में आने से "डुप्लिकेट" समस्या हल हो जाती है।

आंतरिक स्तर पर, यदि तीन त्रिभुज का योग ==वांछित मान बताता है, तो त्रिकोणों को प्रिंट करें और वापस लौटें।

आप returnकुछ और बाइट्स को बचाने और सभी संभावित समाधानों को प्रिंट करने के लिए कानूनी रूप से कीवर्ड को हटा सकते हैं और रिटर्न प्रकार सी को शून्य में बदल सकते हैं। ऐसा नहीं है कि पुनरावृत्तियों सीमित हैं, अगर सब छोरों से भाग गया इस कारण के लिए है 0करने के लिए nयह डुप्लिकेट का कारण होगा।


1

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

(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&]‌​)&

इन्फ़िक्स वाक्य रचना और प्राप्त करने की कि जिस तरह से अजीब के साथ Firstकि एक whopping बचाता 2 बाइट्स , (t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&62 बाइट्स के लिए।
नंबरमान

बहुत बढ़िया, मैं संपादित करूँगा
J42161217


0

आर , 66 बाइट्स

n=scan();b=expand.grid(rep(list(cumsum(0:n)),3));b[rowSums(b)==n,]

जानवर बल एल्गोरिथ्म; पढ़ताn से है और एक डेटाफ्रेम लौटाता है जहां प्रत्येक पंक्ति 3 त्रिकोणीय संख्याओं का एक संयोजन होती है जो इसमें जोड़ते हैं n। यदि आवश्यक हो, तो मैं केवल पहली पंक्ति को +4 बाइट्स के लिए वापस कर सकता हूं।

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


0

जावा 8, 164 बाइट्स

n->{int t[]=new int[n+1],i=0,j=0;for(;i<=n;)if(Math.sqrt(8*i+++1)%1==0)t[j++]=i-1;for(int a:t)for(int b:t)for(int c:t)if(a+b+c==n)return new int[]{c,b,a};return t;}

स्पष्टीकरण:

इसे यहाँ आज़माएँ।

n->{                     // Method with int parameter and int-array return-type
  int t[]=new int[n+1],  //  Create an int-array to store triangular numbers
      i=0,j=0;           //  Two index-integers
  for(;i<=n;)            //  Loop (1) from 0 to `n` (inclusive)
    if(Math.sqrt(8*i+++1)%1==0) 
                         //   If `i` is a triangular number
      t[j++]=i-1;        //    Add it to array `t`
                         //  End of for-loop (1) (implicit / single-line body)
  for(int a:t)           //  Loop (2) over the triangular numbers
    for(int b:t)         //   Inner loop (3) over the triangular numbers
      for(int c:t)       //    Inner loop (4) over the triangular numbers
        if(a+b+c==n)     //     If the three triangular numbers sum equal the input
          return new int[]{c,b,a};
                         //      Return these three triangular numbers as int-array
                         //    End of loop (4) (implicit / single-line body)
                         //   End of loop (3) (implicit / single-line body)
                         //  End of loop (2) (implicit / single-line body)
  return t;              //  Return `t` if no sum is found (Java methods always need a
                         //  return-type, and `t` is shorter than `null`;
                         //  since we can assume the test cases will always have an answer,
                         //  this part can be interpret as dead code)
}                        // End of method

0

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

r=[],i=a=b=0
while(a<=x)r.push(a=i++*i/2)
for(a=0;a<3;){
b=r[i]
if(b<=x){
x-=b
a++
console.log(b)}
else i--}

व्याख्या

x इनपुट का प्रतिनिधित्व करता है

while(a<=x)r.push(a=i++*i/2) X तक सभी त्रिकोणीय संख्याओं की एक सरणी बनाता है

forपाश उच्चतम त्रिकोणीय संख्या से कम प्रिंट x, तब से उस नंबर को घटा x, तीन पुनरावृत्तियों के लिए। (मूल रूप से एक लालची एल्गोरिथ्म)


आपको वही समस्या मिली है जो मैं करता हूं: प्रत्येक चरण में सबसे बड़ी त्रिकोण संख्या <= x लेने से, आपको अपने तीसरे स्थान के लिए एक त्रिकोण संख्या होने की गारंटी नहीं है। के लिए अपने उत्पादन की जाँच करें x = 103:91 + 10 + 1 = 102
asgallant

0

पायथ, 19 बाइट्स

मैं कर रहा हूँ तो Pyth साथ अभ्यास से बाहर, यह झूठ है: /

hfqQsT.C*3+0msSdSQ3

इसे यहाँ आज़माएँ ।

hfqQsT.C*3+0msSdSQ3  Implicit: Q=input()

                SQ   Range 1-n
            m        Map the above over d:
              Sd       Range 1-d
             s         Sum the above
                     Yields [1,3,6,10,...]
          +0         Prepend 0 to the above
        *3           Triplicate the above
      .C          3  All combinations of 3 of the above
 f                   Filter the above over T:
    sT                 Where sum of T
  qQ                   Is equal to input
h                    Take the first element of that list

आप संभवतः पहली सूची तत्व के लिए चयनकर्ता को छोड़कर एक बाइट को बचा सकते हैं क्योंकि आपको सभी संभावित समाधानों को भी प्रिंट करने की अनुमति है।
रैसर 290

@ racer290 इससे भी बेहतर, हालांकि परिणाम फॉर्म [[ए, बी, सी], [डी, ई, एफ]] में होगा - क्या यह ठीक होगा?
सोक

@ racer290 वास्तव में, नहीं, डुप्लिकेट को फ़िल्टर करना चीजों की शक्ल से मुक्त नहीं होगा, इसलिए यह कोई छोटा नहीं होगा: c
सोक


0

रूबी 61 57 55 बाइट्स

लिन के पाइथन उत्तर से प्रेरित । जब तक वांछित राशि प्राप्त नहीं हो जाती, तब तक यह यादृच्छिक ट्रिपल उत्पन्न करता है:

->n{x=Array.new 3{(0..rand(n+1)).sum}until x&.sum==n;x}

इसके लिए रूबी 2.4 की आवश्यकता होती है। रूबी 2.3 और पुराने में, यह एक सिंटैक्स त्रुटि है, और Range#sumइसे परिभाषित नहीं किया गया है। यह लंबा संस्करण (64 बाइट्स) रूबी 2.3 के लिए आवश्यक है:

->n{x=Array.new(3){(a=rand(n+1))*-~a/2}until x&.inject(:+)==n;x}

यहाँ एक छोटी सी परीक्षा है:

f=->n{x=Array.new 3{(0..rand(n+1)).sum}until x&.sum==n;x}
# => #<Proc:0x000000018aa5d8@(pry):6 (lambda)>
f[0]
# => [0, 0, 0]
f[13]
# => [0, 3, 10]
f[5]
# => [3, 1, 1]
f[27]
# => [21, 3, 3]
f[27]
# => [0, 21, 6]
f[300]
# => [3, 21, 276]

रूबी 2.3 के साथ इसे ऑनलाइन आज़माएं!


0

जावास्क्रिप्ट (ईएस 6), 108 बाइट्स - निश्चित

इनपुट के रूप में एक पूर्णांक बनाता है, एक सरणी [a, b, c]को त्रिकोण संख्याओं की क्रमबद्ध सूची से युक्त करता है a + b + c = x, जहां aइनपुट की तुलना में सबसे कम त्रिकोण संख्या होती है, और bइनपुट माइनस से कम या बराबर सबसे बड़ी त्रिकोण संख्या होती है a

x=>{t=[0],t.f=t.forEach,i=j=k=0;for(;j<x;t[i]=j+=i++);t.f(a=>t.f(b=>t.f(c=>a+b+c==x?k=[a,b,c]:0)));return k}

व्याख्या

x=>{
    t=[0],                               // initialize an array of triangle numbers
    t.f=t.forEach,                       // copy forEach method into t.f,
                                         // saves a net of 4 bytes
    i=j=k=0;
    for(;j<x;t[i]=j+=i++);               // populate t with all triangle numbers that
                                         // we could possibly need
    t.f(                                 // loop over all t
        a=>t.f(                          // loop over all t
            b=>t.f(                      // loop over all t
                c=>a+b+c==x?k=[a,b,c]:0  // if a+b+c = x, set k = [a,b,c], else noop
                                         // using a ternary here saves 1 byte vs
                                         // if statement
                                         // iterating over t like this will find all
                                         // permutations of [a,b,c] that match, but
                                         // we will only return the last one found,
                                         // which happens to be sorted in descending order
            )
        )
    );
    return k
}


आप सबसे दिलचस्प हिस्सा नहीं समझा रहे हैं: x-m-nएक त्रिकोणीय संख्या क्यों है, अर्थात यह काम क्यों करता है?
क्रिश्चियन सेवर्स

अच्छी तरह से खतरे की बात है, इसकी गारंटी नहीं है। मेरे द्वारा परीक्षण किए गए सभी मामलों का उपयोग सिर्फ त्रिकोण संख्याओं के एक वैध ट्रिपल का उत्पादन करने के लिए हुआ। ड्रॉइंग बोर्ड पर वापस।
asgallant

निश्चित रूप से, इस समाधान के साथ कम खुश <; o; लेकिन कम से कम यह काम करता है।
asgallant
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.