このリストはバランスを取ることができますか?


23

非負整数のリストのバランス取れているかどうかを確認するには、ボードにそれぞれのウェイトを置き、ピボットの左右の合計相対ウェイトが同じになるように、ピボットのボードのバランスをとることを想像できます。相対的な重量は、重量にピボットまでの距離を掛けることによって与えられます(レバーの法則を参照)。

ウィキペディアレバー (ソース:ウィキペディア

この画像はリストに対応しています[100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]。このリストのバランスが取れているの5は、ピボットの距離が20 100、距離が1およびであるため5*20 = 100 = 100*1です。

 3 1 5 7
#########
     ^

この場合にはピボットが直接下にあり53距離2を有し、1かつ7両側が左右のピボット和のアップするよう距離1を有する73*2 + 1*1左の及び7*1右)、したがって、リストが[3, 1, 5, 7]バランスされています。

ただし、ピボットはリスト要素の1つの下に配置する必要はありませんが、2つのリスト要素の間に配置することもできます。

 6 3 1
#######
  ^

この場合、距離は次のようになり0.5, 1.5, 2.5, ...ます。このリストもバランスが取れてい6*0.5 = 3 = 3*0.5 + 1*1.5ます。

ピボットは、1つの数字の真下または2つの数字の真ん中にのみ配置できます。たとえば、2つの数字の3分の2には配置できません

仕事

出力、任意の合理的なフォーマットの非負整数のリストを与えられたtruthy値リストができた場合にバランスfalsyそうでない場合、値。

入力リストに少なくとも2つの要素が含まれ、少なくとも1つの要素が非ゼロであると想定できます。

これはチャレンジなので、各言語のバイト数が最も少ない答えが優先されます。

真実のテストケース

[1, 0]
[3, 1, 5, 7]
[6, 3, 1]
[100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]
[10, 4, 3, 0, 2, 0, 5]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 7, 7, 7]

偽のテストケース

[1, 2]
[3, 6, 5, 1, 12]
[0, 0, 2, 0, 1, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[6, 3, 2, 4, 0, 1, 2, 3]
[4, 0, 0, 2, 3, 5, 2, 0, 1, 2, 3, 0, 0, 1, 2, 4, 3, 1, 3, 0, 0, 2]
[100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]

この課題がサンドボックス化されている間に見つかった関連する課題の多く: バランスの取れた数ですか?シーケンスの平衡指数バランスがシーソー上の重みのセットは言葉をバランシング私は転倒のでしょうか?そして、ピボットはどこに属しますか?


ピボットを最初の番号の前または最後の番号の後に配置できますか?
エリックアウトゴルファー

@EriktheOutgolferすべての重みが負でない場合、いいえ。

これはduだと思う。それとも、しばらくサンドボックスに座っていましたか?
シャギー

関連する。(CC @Shaggyは多分これはあなたのことを考えていたものだった)
ミスターXcoder

2
@Giuseppe @Steadyboxを追加You can assume that the input list contains at least two elements and that at least one element is non-zero.
ライコニ

回答:


7

Pyth、12 10バイト

!%ys*VQUQs

オンラインで試す

Xcoder氏とErik the Outgolferのおかげで2バイト節約されました。

説明

!%ys*VQUQs
    *VQUQ    Multiply each input by its index.
  ys         Take twice the sum (to handle half-integer positions).
!%       sQ  Check if that's a multiple of the total weight.

あなたは使用することができますyの代わりに*2
氏Xcoder



4

05AB1E、6バイト

ƶO·IOÖ

オンラインでお試しください!

どうやって?

ƶO・IOÖ〜完全なプログラム。I =入力。

ƶ〜Lift I.各要素に1から始まるインデックスを掛けます。
 O〜合計。
  ・〜ダブル。 
     Ö〜は倍数ですか?
   IO〜Iの合計。

失敗するようです[1,1](真実であるはずです)。暗黙のダブリングは実際には存在しないようです。
Zgarb

@Zgarb修正済み(?)
Mr. Xcoder

2

ゼリー、6バイト

×JSḤọS

オンラインでお試しください!

まあ、リーキー修道女は無意味を指摘したように見えます。

ニーモニックのPythアプローチを使用します。

正の整数(真)またはゼロ(偽)を返します。


、この仕事は?
リーキー修道女

それは私が使用した理由ですので、わからない@LeakyNun LḶ(それはものの代わりになり、すべてのテストケースのために成功)。編集:うーん、今、私は再びそれについて考えること、それはそう思わ...(B |⇔B | + bは当たり前)
エリックOutgolfer


2

Japt、10バイト

í* x*2 vUx

オンラインでお試しください!

説明:

 í* x*2 vUx
U            // Implicit Input                 [3, 1, 5, 7]
 í           // Pair the input with its index  [[3,0],[1,1],[5,2],[7,3]]
  *          // Multiply each item             [0,1,10,21]
    x        // Sum                            32
     *2      // Double                         64
        v    // Divisible by:
         Ux  //   Sum of Input                 16
             // Explicit Output                1

1偽りのために、真実の0ために返します。







1

Perl 6、23バイト

{sum(1..*Z*$_)*2%%.sum}

試して

他のさまざまなエントリのアルゴリズムを使用します。

拡張:

{  # bare block lambda with implicit parameter 「$_」

    sum(

        1 .. *  # Range starting from 1

      Z*        # Zip using &infix:«*»

        $_      # the input

    ) * 2

  %%            # is divisible by

    .sum        # the sum of the input (implicit method call on 「$_」)
}

1

Japt、11 10 8バイト

元々はニーモニックのソリューションに触発された

x* vUx*½

それを試してみてください

1ETHproductionsのおかげで 3バイト節約されました。


説明

arrayの暗黙的な入力U。加算(x)で減らし、各要素*にプロセスの0から始まるインデックス()を掛けます。結果がv元の入力の合計()で均等に割り切れるかどうか(Ux)を確認し、各要素に0.5()を掛けます。


でバイトを保存しますm* x*2 vUx。これがあれば、私は思ってしまうm* x*2...さらに低減することができる
ETHproductions

ありがとう、@ ETHproductions。それは今日私が学んだ別の新しいトリックです。
シャギー

私はそれを持っています、それを使用x*して、それが割り切れるかどうかを確認してくださいUx*½:)
ETHproductions

はい、そのトリックはどこにも文書化されていないと思います...しかし、2番目の引数のない自動関数としてバイナリ演算子を使用するときは常に、デフォルトでインデックスを使用します(使用した場合のようにXY{X*Y}
ETHproductions

ああ、今、それは独創的な@ETHproductionsです。:)
シャギー

1

C#、71バイト


ゴルフ

a=>{int i,s,S=s=i=0;while(i<a.Length){S-=s;s-=a[i++];}return 2*S%s<1;};

非ゴルフ

a => {
    int
        i, s, S = s = i = 0;

    while( i < a.Length ) {
        S -= s;
        s -= a[ i++ ];
    }

    return 2 * S % s < 1;
};

完全なコード

using System;

namespace Namespace {
    class Program {
        static void Main( String[] args ) {
            Func<Int32[], Boolean> f = a => {
                int
                    i, s, S = s = i = 0;

                while( i < a.Length ) {
                    S -= s;
                    s -= a[ i++ ];
                }

                return 2 * S % s < 1;
            };

            List<Int32[]>
                testCases = new List<Int32[]>() {
                    new Int32[] {1, 0},
                    new Int32[] {3, 1, 5, 7},
                    new Int32[] {6, 3, 1},
                    new Int32[] {100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5},
                    new Int32[] {10, 4, 3, 0, 2, 0, 5},
                    new Int32[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
                    new Int32[] {7, 7, 7, 7},

                    new Int32[] {1, 2},
                    new Int32[] {3, 6, 5, 1, 12},
                    new Int32[] {0, 0, 2, 0, 1, 0},
                    new Int32[] {1, 2, 3, 4, 5, 6, 7, 8, 9},
                    new Int32[] {6, 3, 2, 4, 0, 1, 2, 3},
                    new Int32[] {4, 0, 0, 2, 3, 5, 2, 0, 1, 2, 3, 0, 0, 1, 2, 4, 3, 1, 3, 0, 0, 2},
                    new Int32[] {100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5},
                };

            foreach( Int32[] testCase in testCases ) {
                Console.WriteLine( $"{{ {String.Join(", ", testCase)} }}\n{f( testCase )}" );
            }

            Console.ReadLine();
        }
    }
}

リリース

  • v1.0の - 71 bytes-初期ソリューション。

ノート

私はあからさまに「借りた」デニスPython 2ソリューションを持っているかもしれないし、持っていないかもしれない...






0

PHP139 128バイト

<?php $a=explode(',',fgets(STDIN));for($i=0;$i<count($a)-.5;$i+=.5){$z=0;foreach($a as $k=>$v)$z+=($k-$i)*$v;if($z==0)die(1);}?>

オンラインでお試しください!


1
私はこれを誤解していない限り、[ codegolf.meta.stackexchange.com/questions/2447/...あなたが使用することができるはずdie(1)die(0)の代わりに印刷された文字列の終了コードを使用し、4バイトのセーブ。
manassehkatz-Reinstate Monica

@manassehkatz tio.runでdieを引用符なしで使用すると、それをステータスコードとして扱う必要があり、出力セクションには入れません。私はそうつべこべから人々を防ぐために追加したばかりの引用符
Mic1780


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.