ट्रिपल-संतुलित संख्या


13

विवरण

हम एक पूर्णांक को कम से कम 3 अंकों के ट्रिपल-संतुलित के साथ मानते हैं यदि, तीन भागों में विभाजित होने पर, प्रत्येक भाग में अंक एक ही संख्या तक होते हैं। हम संख्याओं को इस प्रकार विभाजित करते हैं:

abcdefghi - Standard case: the number of digits is divisable through 3:
abc def ghi

abcdefgh - Number % 3 == 2: The outer groups are both assigned another digit
abc de fgh (the inner group will have one digit less than both outer groups)

abcdefghij - Number % 3 == 1: The inner group is assigned the extra digit
abc defg hij (the inner group will have one digit more than the outer groups)

चुनौती

आपका कार्य एक प्रोग्राम लिखना है, जो, कम से कम 3 अंकों के साथ पूर्णांक देता है, यह निर्धारित करता है कि क्या दी गई संख्या ट्रिपल-संतुलित है और इसके परिणाम के आधार पर एक सत्य या मिथ्या मूल्य को आउटपुट करता है।

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

333 -> True
343 -> False
3123 -> True
34725 -> True
456456 -> False
123222321 -> True

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


1
जैसा कि मैं इसे समझता हूं, यदि आप इसे समान रूप से विभाजित कर सकते हैं, तो आपको करना चाहिए।
बिलकुल अमानवीय

@ Mr.Xcoder आप इसे तीन भागों में विभाजित करते हैं (यह अभी भी @ MagicOctopusUnr की टिप्पणी के अनुसार काम नहीं करता है:when split in three parts,
स्टीफन

4
भविष्य में ऐसी स्थिति से बचने के लिए, सैंडबॉक्स का उपयोग करने पर विचार करें ।
श्री एक्सकोडर

2
ओह! मुझे परीक्षण के मामलों के बारे में भ्रम के लिए खेद है, जाहिर है कि मेरे सिर में किसी तरह का मोड़ था। अब जब वे सही हो गए हैं, तो मुझे आशा है कि आप मेरी चुनौती को फिर से खोलेंगे।
रेसर 290

5
डिफ़ॉल्ट रूप से, इनपुट को एक स्ट्रिंग के रूप में लेने की अनुमति है। क्या इसे अंकों की एक सरणी के रूप में लिया जा सकता है?
लुइस मेंडो

जवाबों:



3

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

DµL‘:3‘Ṭ©œṗ⁸U®œṗЀS€€FE

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

एक छोटा रास्ता होना चाहिए जो किसी तरह मेरे सिर पर उड़ गया ...


यह सीधे-सीधे लगता है, लेकिन यह वास्तव में tbh नहीं है ... यहां तक ​​कि 05AB1E में भी गैर-डिफ़ॉल्ट विभाजन के कारण मुश्किल है।
मैजिक ऑक्टोपस Urn

3

रेटिना , 89 बाइट्स

^|$
¶
{`¶(.)(.*)(.)¶
$1¶$2¶$3
}`^((.)*.)(.)¶((?<-2>.)*)¶(.)
$1¶$3$4$5¶
\d
$*
^(1+)¶\1¶\1$

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। स्पष्टीकरण: पहला चरण इनपुट के प्रारंभ और अंत में नई सुचना जोड़ता है। दूसरा चरण फिर जोड़े में नए सिरे से अंकों को स्थानांतरित करने की कोशिश करता है, हालांकि अगर बीच में पर्याप्त अंक नहीं बचे हैं, तो तीसरा चरण उन्हें वापस ले जाने में सक्षम है, जिससे लूप बंद हो जाएगा। चौथा चरण तब प्रत्येक अंक को अलग-अलग रूपांतरित करता है, इस प्रकार उन्हें समेटता है, जबकि अंतिम चरण केवल यह जाँचता है कि रकम बराबर हैं।


2

मैथमेटिका, 142 बाइट्स

(s=IntegerDigits@#;c=Floor;If[Mod[t=Length@s,3]==2,a=-1;c=Ceiling,a=Mod[t,3]];Length@Union[Tr/@FoldPairList[TakeDrop,s,{z=c[t/3],z+a,z}]]==1)&

2

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

DµL‘:3x2jSạ¥¥LRṁ@ḅ1E

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

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

DµL‘:3x2jSạ¥¥LRṁ@ḅ1E  Main link. Argument: n

D                     Decimal; convert n to base 10, yielding a digits array A.
 µ                    Begin a new chain with argument A.
  L                   Compute the length of A.
   ‘                  Increment; add 1 to the length.
    :3                Divide the result by 3.
                      This yields the lengths of the outer chunks.
      x2              Repeat the result twice, creating an array C.
             L        Compute l, the length of A.
            ¥         Combine the two links to the left into a dyadic chain.
                      This chain will be called with arguments C and l. 
           ¥              Combine the two links to the left into a dyadic chain.
         S                    Take the sum of C.
          ạ                   Compute the absolute difference of the sum and l.
        j                 Join C, using the result to the right as separator.
                      We now have an array of the lengths of all three chunks the
                      digits of n have to be split in.
              R       Range; map each chunk length k to [1, ..., k].
               ṁ@     Mold swapped; takes the elements of A and give them the shape
                      of the array to the right, splitting A into chunks of the
                      computed lengths.
                 ḅ1   Convert each chunk from unary to integer, computing the sum
                      of its elements.
                   E  Test if the resulting sums are all equal.


@FelixDombek मैंने एक स्पष्टीकरण जोड़ा है।
डेनिस


0

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

(a)=>{b=a.split(/(\d)/).filter((v)=>v);s=Math.round(b.length/3);f=(m,v)=>m+parseInt(v);y=b.slice(s,-s).reduce(f,0);return b.slice(0,s).reduce(f,0)==y&&y==b.slice(-s).reduce(f,0)}

PPCG में आपका स्वागत है! क्या आपने टिप्स पेज पढ़े हैं ? आपके जवाब को कम करने के लिए बहुत गुंजाइश है।
नील

यदि आप अभी भी रुचि रखते हैं, तो मैं आपके उत्तर को 106 बाइट्स तक नीचे ट्रिम करने में सक्षम था: ([...b],s=~b.length/3|0,f=(m,v)=>+m+ +v,y=b.splice(s).reduce(f))=>b.splice(-s).reduce(f)==y&y==b.reduce(f)(स्टैक एक्सचेंज आवेषण अदृश्य अक्षरों के रूप में टिप्पणियों से कॉपी करते समय ध्यान रखें)।
नील

Beautyful! मेरे लिए वहां सीखने के लिए कई चीजें हैं।
cdm

0

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

q->{int l=q.length,s=(l+1)/3,a=0,b=0,c=0,i=0;for(;i<s;a+=q[i++]);for(i=s,s=l/3*2+(l%3<1?0:1);i<s;b+=q[i++]);for(i=s;i<l;c+=q[i++]);return a==b&b==c;}

इनपुट के रूप में लेता है int[]

स्पष्टीकरण:

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

q->{                 // Method with int-array parameter and boolean return-type
  int l=q.length,    //  Length of the input-array
      s=(l+1)/3,     //  (Length + 1) divided by 3
      a=0,b=0,c=0,   //  Three sums starting at 0
      i=0;           //  Index-integer
  for(;i<s;          //  Loop (1) from 0 to `s1` (exclusive)
    a+=q[i++]        //   And increase `a` with the next digit
  );                 //  End of loop (1)
  for(i=s,s=l/3*2+(l%3<1?0:1);i<s;
                     //  Loop (2) from `s1` to `s2` (exclusive)
    b+=q[i++]        //   And increase `b` with the next digit
  );                 //  End of loop (2)
  for(i=s;i<l;       //  Loop (3) from `s2` to `l` (exclusive)
    c+=q[i++]        //   And increase `c` with the next digit
  );                 //  End of loop (3)
  return a==b&b==c;  //  Return if `a`, `b` and `c` are equal
}                    // End of method

यहां प्रत्येक लंबाई के लिए 0-अनुक्रमित (अनन्य) भागों का अवलोकन दिया गया है:

Length:  Parts:    0-indexed (exclusive) parts:

 3       1,1,1     0,1 & 1,2 & 2,3
 4       1,2,1     0,1 & 1,3 & 3,4
 5       2,1,2     0,2 & 2,3 & 3,5
 6       2,2,2     0,2 & 2,4 & 4,6
 7       2,3,2     0,2 & 2,5 & 5,7
 8       3,2,3     0,3 & 3,5 & 5,8
 9       3,3,3     0,3 & 3,6 & 6,9
10       3,4,3     0,3 & 3,7 & 7,10
...
  • के लिए aसे हम पाश 0करने के लिए (length + 1) / 3)(यह मान अब में संग्रहित है s);
  • के लिए bसे हम पाश sके लिए length / 3 * 2 +( 0यदि लंबाई सापेक्ष -3 0 है, 1अगर लंबाई सापेक्ष -3 1 या 2 है) (यह मान अब में भंडार है s);
  • के लिए cसे हम पाश sकरने के लिए length

(सभी तीन छोरों 0-अनुक्रमित अनन्य हैं)


0

रोड़ा , 82 बाइट्स

f s{n=((#s+1)//3)[s[:n],s[n:#s-n],s[#s-n:]]|[chars(_)|[ord(_)-48]|sum]|[_=_,_=_1]}

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

स्पष्टीकरण:

f s{ /* function declaration */
    n=((#s+1)//3)
    [s[:n],s[n:#s-n],s[#s-n:]]| /* split the string */
    [ /* for each of the three strings: */
        chars(_)|    /* push characters to the stream */
        [ord(_)-48]| /* convert characters to integers */
        sum          /* sum the integers, push the result to the stream */
    ]|
    [_=_,_=_1] /* take three values from the stream and compare equality */
}

0

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

([...n],l=n.length/3+.5|0,r=(b,e=b*-4,z=0)=>n.slice(b,e).map(x=>z-=x)&&z)=>r(0,l)==r(-l)&&r(l,-l)==r(-l)

फ़ंक्शन r, पैरामीटर b और e के आधार पर स्ट्रिंग को स्लाइस करता है, और फिर अंकों को सॉम्प करता है और मान लौटाता है।

सही आकारों में टुकड़ा करने के लिए, हम लंबाई को 3 से विभाजित करते हैं और परिणाम को गोल करते हैं। स्लाइस (0, परिणाम) को कॉल करना हमें पहला ब्लॉक देता है, स्लाइस (परिणाम, -result) हमें दूसरा देता है, और स्लाइस (परिणाम) हमें अंतिम देता है। जिस तरह से मैं स्लाइस कह रहा हूं, उसके कारण मैंने पिछले एक के बजाय स्लाइस (परिणाम, 4 * परिणाम) का उपयोग किया लेकिन यह एक ही परिणाम देता है।

अंत में, मैं परिणामों की तुलना दिखाता हूं कि मान समान हैं।

संपादित करें: एक ही सिद्धांत, बेहतर गोल्फ


इसे बदलने के लिए संभव है &&करने के लिए &जावास्क्रिप्ट में? दोनों सेकंड-हैंड चेक ( &&zऔर &&y[1]==y[2]) मानों को संशोधित करने के लिए नहीं लगते हैं, इसलिए यदि यह संभव है, तो यह परिणाम को प्रभावित नहीं करना चाहिए जो मैं देख सकता हूं।
केविन क्रूज़सेन

मैं देखूंगा। & एक बिट ऑपरेशन बनाम && एक तार्किक है, इसलिए यह आउटपुट को सही या गलत के बजाय 1 या 0 में बदल देगा, लेकिन यह इस मामले में बहुत अच्छा काम करता है।
ग्रैक्स 32
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.