Індекс рівноваги послідовності


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 не є показником рівноваги, оскільки це не є дійсним індексом послідовності А.

Ідея полягає у створенні програми, яка задає послідовність (масив), повертає індекс рівноваги (будь-який) або -1, якщо не існує індексів рівноваги.

Відповіді:


6

Гольфскрипт 17 16

Оскільки форма введення не вказана, це бере рядок у форматі масиву Golfscript від stdin.

~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, з моїми компліментами.
Пітер Тейлор

Класно! Тепер у мене є ще кілька навичок GolfScript вчитися ...
mellamokb

5

Пітон - 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. Використовуючи обійми, ви можете просто ввести 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

Читає список у стилі Haskell від stdin, напр.

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

і повертає список стилів Haskell індексів, наприклад.

[3,6]

Результат - []якщо немає індексу.

Скажіть, будь ласка, якщо ваша специфіка хоче іншої поведінки.

Зміни:

  • (95 → 83): розуміння списку є більш стильним

4

С - 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(:+)}

Редагувати: Коротша версія, як запропонував Вентеро:

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

Введення - одне число на рядок, вихід - розділений комами список індексів у квадратних дужках.


1
В першому рядку вам не потрібні дужки, і ви можете зберегти кілька символів, використовуючи join + eval, щоб отримати суми: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(зауважте, що це для Ruby 1.9, оскільки він використовує
літеральні

Чудові пропозиції, дякую! Вигляд дратує, що сума масиву № не в ядрі Ruby.
Ларс Хагсет

Якщо я видаляю парантези в першому рядку, я отримую: "SyntaxError: (irb): 17: синтаксична помилка, несподіваний TAMPER, очікуючи $ end"
Ларс Хагсет

Повинно бути пробіл між mapі амперсандом. І вам не потрібен оператор пейнтбольного в передній частині $<або, так що в цілому лінія буде виглядати наступним чином : a=$<.map &:to_i. ;)
Вентеро

Ах, ще раз дякую, саме сплеск зіпсував синтаксис.
Lars Haugseth



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 4урожайність 1 0 1 0.
  • Таким чином, (+/\. y) = (+/\ y)виходить один для всіх індексів, при якому суфіксна сума дорівнює префіксальній сумі, або створюється рівновага.
  • Для векторів нулів і одиниць I.повертає вектор індексів, при якому вектор містить одиницю.

1

Пітон 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 - ігнорується.
Джої Адамс

AH. Дякую за роз'яснення, Джой, я не розумів, що значення в x повинно бути проігноровано.
arrdem

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.