トリプルバランス番号


13

説明

3つの部分に分割され、すべての部分の数字が合計されて同じ数になる場合、少なくとも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
将来そのような状況を避けるために、Sandboxの使用を検討してください。
ミスターXcoder

2
おっと!テストケースについての混乱についてすみません、どうやら私の頭の中にある種のねじれがありました。これらが修正されたので、私のチャレンジを再開するために投票してください。
racer290

5
デフォルトでは、入力は文字列として取得できます。数字の配列として解釈できますか?
ルイスメンドー

回答:




3

網膜、89バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:最初のステージでは、入力の開始と終了に改行が追加されます。次に、2番目のステージは、ペアで改行を介して数字を移動しようとしますが、中央に十分な数字が残っていない場合、3番目のステージはそれらを戻すことができ、ループが停止します。次に、4番目のステージで各桁を単項に個別に変換し、合計します。最後のステージでは、合計が等しいことを確認します。


2

Mathematica、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.

1
私は説明を読むのが大好きです
フェリックスDombekに

@FelixDombek説明を追加しました。
デニス


0

Javascript、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)(Stack Exchangeが目に見えない文字を挿入するようにコメントからコピーするときは注意してください)。
ニール

美しい!そこで学ぶべきことはたくさんあります。
cdm

0

Java 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)。
  • for bからループsするlength / 3 * 2 +0長さmodulo-3が0の場合;1長さモジュロ3は1又は2である場合)(この値は、今で記憶しますs)。
  • 以下のためcの私達ループslength

(3つすべてのループは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

JavaScript、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で割り、結果を丸めます。slice(0、result)を呼び出すと、最初のブロックが提供され、slice(result、-result)が2番目に提供され、slice(result)が最後に提供されます。スライスを呼び出す方法のため、最後のスライスではなくslice(result、4 * result)を使用しましたが、同じ結果が得られます。

最後に、値が等しいことを示す結果を比較します。

編集:同じ原則、より良いゴルフ


JavaScript に変更&&すること&はできますか?中古のチェック(&&z&&y[1]==y[2])はどちらも値を変更しないようですので、可能であれば、私が見ることができるものの結果に影響を与えるべきではありません。
ケビンCruijssen

見てみましょう。&は論理演算である&&のビット演算であるため、出力をtrueまたはfalseではなく1または0に変更しますが、この場合はうまく機能します。
Grax32
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.