Angka tiga kali lipat seimbang


13

Deskripsi

Kami menganggap bilangan bulat dengan setidaknya 3 digit triple-balance jika, ketika dipecah menjadi tiga bagian, digit di setiap bagian dijumlahkan ke nomor yang sama. Kami membagi angka sebagai berikut:

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)

Tantangan

Tugas Anda adalah menulis sebuah program, yang, diberi bilangan bulat dengan setidaknya 3 digit, menentukan apakah angka yang diberikan adalah triple-balance dan menghasilkan nilai yang benar atau salah berdasarkan hasil itu.

Uji kasus

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

Ini adalah , jadi celah standar berlaku dan semoga jawaban terpendek dalam byte menang!


1
Seperti yang saya mengerti, jika Anda dapat membaginya secara merata, Anda harus.
totallyhuman

@ Mr.Xcoder Anda membaginya menjadi tiga bagian (itu masih tidak berfungsi sesuai komentar @ MagicOctopusUnr:when split in three parts,
Stephen

4
Pertimbangkan untuk menggunakan Kotak Pasir , untuk menghindari situasi seperti itu di masa depan.
Tn. Xcoder

2
Aduh! Saya minta maaf atas kebingungan tentang kasus-kasus tes, tampaknya saya memiliki semacam twist di kepala saya. Sekarang setelah dikoreksi, saya harap Anda memilih untuk membuka kembali tantangan saya.
racer290

5
Secara default, input diizinkan untuk diambil sebagai string. Bisakah itu diambil sebagai array angka?
Luis Mendo

Jawaban:


7

Python 2 , 93 88 86 byte

-4 byte terima kasih kepada @LeakyNun
-2 byte terima kasih kepada @ Mr.Xcoder

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))

Cobalah online!


3

Jelly , 23 byte

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

Cobalah online!

Pasti ada cara yang lebih pendek yang entah bagaimana terbang di atas kepalaku ...


Tampaknya lurus ke depan tetapi sebenarnya bukan tbh ... Bahkan sulit di 05AB1E karena pemisahan non-default.
Magic Gurita Guci

3

Retina , 89 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan: Tahap pertama menambahkan baris baru di awal dan akhir input. Tahap kedua kemudian mencoba untuk memindahkan digit melintasi baris baru secara berpasangan, namun jika tidak ada cukup angka yang tersisa di tengah maka tahap ketiga dapat memindahkan mereka kembali, menyebabkan loop berhenti. Tahap keempat kemudian mengonversi setiap digit secara terpisah menjadi unary sehingga menjumlahkannya, sedangkan tahap terakhir hanya memeriksa bahwa jumlahnya sama.


2

Mathematica, 142 byte

(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

Jelly , 20 byte

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

Cobalah online!

Bagaimana itu bekerja

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
Saya ingin membaca penjelasan
Felix Dombek

@FelixDombek Saya telah menambahkan penjelasan.
Dennis


0

Javascript, 178 byte

(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)}

Selamat datang di PPCG! Sudahkah Anda membaca halaman tips ? Ada banyak ruang untuk menurunkan jawaban Anda.
Neil

Jika Anda masih tertarik, saya dapat memangkas jawaban Anda menjadi 106 byte: ([...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)(berhati-hatilah saat menyalin dari komentar ketika Stack Exchange memasukkan karakter yang tidak terlihat).
Neil

Cantik! Banyak hal untuk saya pelajari di sana.
cdm

0

Java 8, 149 byte

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

Mengambil input sebagai int[].

Penjelasan:

Coba di sini.

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

Berikut ini adalah ikhtisar dari bagian-bagian 0-diindeks (eksklusif) untuk setiap panjang:

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
...
  • Bagi akami perulangan dari 0ke (length + 1) / 3)(nilai ini sekarang disimpan di s);
  • Untuk bkita loop dari ske length / 3 * 2 +( 0jika panjang modulo-3 adalah 0; 1jika panjang modulo-3 adalah 1 atau 2) (nilai ini sekarang disimpan di s);
  • Untuk ckita loop dari ske length.

(ketiga loop adalah 0-diindeks eksklusif)


0

Röda , 82 byte

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

Cobalah online!

Penjelasan:

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 byte

([...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)

Fungsi r mengiris string berdasarkan parameter b dan e, lalu menjumlahkan digit dan mengembalikan nilainya.

Untuk memotong dalam ukuran yang benar, kami membagi panjangnya dengan 3 dan membulatkan hasilnya. Memanggil slice (0, result) memberi kita blok pertama, slice (result, -result) memberi kita blok kedua, dan slice (result) memberi kita yang terakhir. Karena cara saya memanggil slice, saya menggunakan slice (hasil, 4 * hasil) bukan yang terakhir tetapi memberikan hasil yang sama.

Akhirnya, saya bandingkan hasilnya menunjukkan nilainya sama.

Sunting: prinsip yang sama, bermain golf lebih baik


Apakah mungkin diubah &&ke &dalam JavaScript? Kedua pemeriksaan bekas ( &&zdan &&y[1]==y[2]) tampaknya tidak mengubah nilai, jadi jika memungkinkan, seharusnya tidak mempengaruhi hasil dari apa yang saya lihat.
Kevin Cruijssen

Saya akan memeriksanya. & adalah operasi bit vs && menjadi operasi yang logis, sehingga akan mengubah output menjadi 1 atau 0 alih-alih benar atau salah, tetapi itu bekerja dengan baik dalam kasus ini.
Grax32
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.