Üçlü dengeli sayılar


13

Açıklama

Üç parçaya bölündüğünde, her parçadaki rakamlar aynı sayıya ulaşıyorsa, en az 3 basamaklı üç dengeli bir tamsayıyı dikkate alırız. Sayıları şu şekilde böldük:

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)

Meydan okuma

Göreviniz, en az 3 basamaklı bir tamsayı verildiğinde, verilen sayının üçlü dengeli olup olmadığını belirleyen ve sonucuna bağlı olarak doğruluk mu yoksa yanlış bir değer çıkaran bir program yazmaktır.

Test senaryoları

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

Bu , bu yüzden standart boşluklar geçerlidir ve bayttaki en kısa cevap kazanabilir!


1
Anladığım kadarıyla, eşit olarak bölebilirseniz, yapmalısınız.
totallyhuman

@ Mr.Xcoder üç parçaya bölüyorsunuz (hala MagicOctopusUnr'ın yorumuna göre çalışmıyor:when split in three parts,
Stephen

4
Gelecekte böyle bir durumdan kaçınmak için Sandbox'ı kullanmayı düşünün .
Bay Xcoder

2
Tüh! Test vakaları hakkındaki karışıklık için üzgünüm, görünüşe göre kafamda bir çeşit bükülme vardı. Şimdi düzeltildiğine göre, umarım meydan okumamı yeniden açmak için oy kullanırsınız.
racer290

5
Varsayılan olarak, girişin dize olarak alınmasına izin verilir. Bir basamak dizisi olarak alınabilir mi?
Luis Mendo

Yanıtlar:


7

Python 2 , 93 88 86 bayt

@LeakyNun sayesinde -4 bayt
@ Mr.Xcoder sayesinde -2 bayt

def g(i):l=-~len(i)/3;print f(i[:l])==f(i[l:-l])==f(i[-l:])
f=lambda a:sum(map(int,a))

Çevrimiçi deneyin!



3

Retina , 89 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama: İlk aşama girişin başına ve sonuna satırsonu ekler. İkinci aşama daha sonra rakamları çiftler halinde yeni satırlar arasında hareket ettirmeye çalışır, ancak ortada yeterli basamak yoksa, üçüncü aşama onları geri taşıyabilir ve döngünün durmasına neden olabilir. Daha sonra dördüncü aşama her basamağı ayrı olarak tekli olarak dönüştürür ve toplar, son aşama ise toplamların eşit olduğunu kontrol eder.


2

Mathematica, 142 bayt

(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

Jöle , 20 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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.

1
Bir açıklama okumak isterim
Felix Dombek

@FelixDombek Bir açıklama ekledim.
Dennis


0

Javascript, 178 bayt

(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'ye Hoşgeldiniz! İpuçları sayfalarını okudunuz mu? Cevabınızı golf oynamak için çok fazla alan var.
Neil

Hala ilgileniyorsanız, cevabınızı 106 bayta indirebildim: ([...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)(Stack Exchange görünmez karakterler eklerken yorumlardan kopyalarken dikkatli olun).
Neil

Beautyful! Orada öğrenmem gereken birçok şey var.
cdm

0

Java 8, 149 bayt

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;}

Girişi bir olarak alır int[].

Açıklama:

Burada deneyin.

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

Her uzunluk için 0 dizinli (özel) parçalara genel bakış:

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
...
  • İçin abiz döngü 0için (length + 1) / 3)(bu değer hemen saklanır s);
  • İçin bbiz döngü siçin length / 3 * 2 +( 0uzunluk Modülo-3 0 ise, 1uzunluğu Modülo-3, 1 veya 2 olması durumunda) (bu değer, şimdi depolar s);
  • Çünkü ' cden' se dönüyoruz length.

(her üç döngü de 0 dizinli özeldir)


0

Röda , 82 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

JavaScript, 129 , 104 bayt

([...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 işlevi, dizeyi b ve e parametrelerine göre dilimler ve sonra rakamları toplar ve değeri döndürür.

Doğru boyutlarda dilimlemek için uzunluğu 3'e bölüyoruz ve sonucu yuvarlıyoruz. Dilim (0, sonuç) çağrısı bize ilk bloğu, dilim (sonuç, -result) bize ikinciyi verir ve dilim (sonuç) bize son bloğu verir. Dilim dediğimden dolayı, sonuncusu yerine dilim (sonuç, 4 * sonuç) kullandım ama aynı sonucu veriyor.

Son olarak, değerlerin eşit olduğunu gösteren sonuçları karşılaştırıyorum.

Düzenleme: aynı prensip, daha iyi golf


O değiştirmek mümkün mü &&için &JavaScript? Her iki ikinci el kontrolü ( &&zve &&y[1]==y[2]) değerleri değiştirmiyor gibi görünüyor, bu yüzden mümkünse sonucu görebildiğim kadar etkilememelidir.
Kevin Cruijssen

Bir bakacağım. & biraz mantıksal bir işlemdir ve & & mantıklı bir işlemdir, bu nedenle çıktıyı doğru veya yanlış yerine 1 veya 0 olarak değiştirir, ancak bu durumda harika çalışır.
Grax32
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.