シーケンスの平衡インデックス


10

シーケンスの平衡インデックスは、低いインデックスの要素の合計が高いインデックスの要素の合計と等しくなるようなインデックスです。たとえば、シーケンスAの場合:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3は平衡指数です。

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]

6は平衡指数でもあります。

A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0

(ゼロ要素の合計はゼロです)7はシーケンスAの有効なインデックスではないため、平衡インデックスではありません。

アイデアは、シーケンス(配列)を指定して、平衡インデックス(任意)または平衡インデックスが存在しない場合は-1を返すプログラムを作成することです。

回答:


6

Golfscript 17 16

入力の形式が指定されていないため、これはstdinからGolfscript配列形式の文字列を取ります。

~0\{1$+.@+\}/])?

したがって、たとえば

golfscript.ry eqindex.gs <<<"[-7 1 5 2 -4 3 0]"

アイデアは非常に単純です。それは配列を取り、配列にA_iマップして、配列A_i + 2 SUM_{j<i} A_j全体の合計に等しい最初のインデックスを探します。


@mellamokbの挑戦のために私が提供します:

~0\{1$+.@+\}/:S;]:A,,{A=S=},`

29文字。


あなたは簡単に最も短い解決策を持っているので、最初のものだけでなく、すべてのインデックスを返す必要があると私は宣言します:)
mellamokb

@mellamokb、私の褒め言葉。
Peter Taylor、

涼しい!これで、GolfScriptで学習できることがさらに増えました...
mellamokb '

5

Python-72文字

A=input()
print[i for i in range(len(A))if sum(A[:i])==sum(A[i+1:])]or-1

カンマ区切りの入力を受け取ります


すごい...これはすべての平衡指数を返します...本当にクールです。
クリスチャン

@Christian:私もそうです。
FUZxxl

私は見る:)実際、haskellコードを実行する方法がわかりません...勉強する必要があります。
クリスティアン

クリスチャン:コンパイラーであるghcとインタープリターであるハグがあります。ハグをダウンロードすることをお勧めします。ghcは約7 MiBですが、ghcディストリビューション全体は約300 MiBであるため、ghcをダウンロードするよりも優れています。ハグを使うと、タイプrunhugs FILE.hsするだけでプログラムを実行できますFILE.hs
FUZxxl

5

ハスケル(95 83)

e l=[n|n<-[0..length l-1],sum(take n l)==sum(drop(n+1)l)]
main=interact$show.e.read

stdinからHaskellスタイルのリストを読み取ります。

[-7,1,5,2,-4,3,0]

そして、インデックスのHaskellスタイルのリストを返します。

[3,6]

[]インデックスがない場合、結果はになります。

仕様で別の動作が必要な場合は、教えてください。

編集:

  • (95→83):リスト内包表記はより簡潔です

4

C-96

a[99],*p=a,s;main(){for(;scanf("%d",p)>0;s+=*p++
);for(;p>a;s-=*p)(s-=*--p)||printf("%d\n",p-a);}

これは、平衡インデックスを逆の順序で出力することに注意してください。

使用例:

$ ./equilibrium <<< "-7 1 5 2 -4 3 0"
6
3

3

ルビー(83 77)

a=*$<.map(&:to_i)
p (0...a.size).select{|x|a[0..x].reduce(:+)==a[x..-1].reduce(:+)}

編集:Venteroによって提案された短いバージョン:

a=$<.map &:to_i
p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}

入力は1行に1つの数値、出力は角括弧で囲まれたインデックスのコンマ区切りリストです。


1
最初の行に括弧は不要で、join + evalを使用して合計を取得することにより、いくつかの文字を節約できますp (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(これは文字列として文字リテラルを使用するため、これはRuby 1.9用です)
Ventero

素晴らしい提案、ありがとう!Array#sumがRubyコアに含まれていないことは、ちょっと面倒です。
Lars Haugseth、

最初の行の括弧を削除すると、「SyntaxError:(irb):17:syntax error、予期しないtAMPER、予期される$ end」
Lars Haugseth

mapとアンパサンドの間にはスペースが必要です。また、前にsplat演算子は必要ない$<ため、すべての行で次のようになりますa=$<.map &:to_i。;)
Ventero、

ああ、ありがとう、構文を台無しにしたのはスプラットでした。
Lars Haugseth、


2

scala、108

val l=readline().split(" ").map(w=>w.toInt)
for(i<-0 to l.length-1
if l.take(i).sum==l.drop(i+1).sum)yield i

2

J(12文字)

均衡指数のベクトルを返す暗黙表記のモナド動詞。読みやすいようにスペースが挿入されています。

[: I. +/\. = +/\

これを説明するには、最初にその明示的な定義に注意してください。y仮パラメータです:

3 : 'I. (+/\. y) = (+/\ y)'
  • +引数を追加します。/右側の引数のメンバーの間にその左側に動詞を挿入する副詞です。たとえば+/ 1 2 3 4、と同じ1 + 2 + 3 + 4です。
  • \右側の引数のすべての接頭辞接頭辞の左側に動詞を適用する副詞です。例えば、と<その引数の周りにボックスを描画し、<\ 1 2 3 4生成

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • したがって、+/\その右側の引数の各プレフィックスについて合計を計算します。

  • \.に似て\いますが、接頭辞ではなく接尾辞を操作します。したがって、+/\.サフィックスの合計のベクトルを計算します。
  • =引数の項目ごとの比較を実行します。たとえば、1 1 3 3 = 1 2 3 4yields 1 0 1 0
  • したがって、(+/\. y) = (+/\ y)接尾辞の合計が接頭辞の合計に等しいか、または均衡が作成されるすべてのインデックスに対して1を生成します。
  • ゼロとI.1のベクトルの場合、ベクトルに1が含まれるインデックスのベクトルを返します。

1

Python 2、70

A=input()
e=i=s=0
for x in A:e=[e,~i][s*2==sum(A)-x];s+=x;i+=1
print~e

アイデアは、実行中の合計を追跡し、sそれが現在の要素のない配列の合計の半分であるかどうか、つまり現在の要素の後の配列の合計と等しいかどうかを確認することです。もしそうなら、平衡指数を現在の指数に更新します。最後の平衡指数が出力され-1ます。存在しない場合は初期値が出力されます。

実際には、平衡インデックスのビット補数を保存して、代わりに0に初期化できるようにします。


0

パイソン-114

i=map(lambda x:int(x),raw_input().split(" "));x=0
print map(lambda x:(sum(i[0:x])==sum(i[x+1::])),range(0,len(i)))

パイソン-72

i=input()
print map(lambda x:sum(i[0:x])==sum(i[x+1::]),range(0,len(i)))

指定されたインデックスが平衡インデックスであるかどうかを出力し、配列のバランスをとる整数のインデックスを出力しません。


それが壊れるとはどういう意味ですか?6は平衡指数です。これは、その前のアイテムが合計でゼロになり、その後にアイテムがないため、50が無視されるためです。
Joey Adams、

ああ。明確なジョーイをありがとう、私はxでの値が無視されることになっていることに気づきませんでした。
2011年

0

PHP、134文字

<?for($a=explode(",",fgets(STDIN));++$i<($c=count($a));$o.=$s==0?$i:"")for($n=$s=0;$n<$c;)$s+=$n<$i?$a[$n++]:-$a[++$n];echo$o?$o:"-1";

これはPHPの最適なゴルフとはほど遠いのですが、蒸気(脳)が足りなくなりました。少なくとも、array_sumとarray_spliceを使用するよりも短くなります:-)


0

PHP(81)

for($i=count($a)-1,$c=0;$i+1&&$c!=(array_sum($a)-$a[$i])/2;$c+=$a[$i--]);echo $i;

http://3v4l.org/qJvhO

入力が指定されていないため、配列を変数として初期化する必要があります$a

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