Индекс равновесия последовательности


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

Golfscript 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

5

Питон - 72 символа

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

Принимает ввод через запятую


Круто ... этот возвращает все индексы равновесия ... действительно круто.
Кристиан

@ Кристиан: Мой тоже так делает.
FUZxxl

Я вижу :) Я на самом деле не знаю, как запустить код haskell ... придется учиться.
Кристиан

Кристиан: Есть GHC, компилятор и объятия, интерпретатор. Я бы предложил скачать объятия . Это лучше, чем скачивать ghc, потому что размер hugs составляет около 7 МБ, а общий дистрибутив ghc - около 300 МБ. Используя объятия, вы можете просто набрать 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(:+)}

Изменить: более короткая версия, предложенная Ventero:

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, так как он использует символьные литералы в качестве строк)
Ventero

Отличные предложения, спасибо! Раздражает, что Array # sum не в ядре Ruby.
Ларс Хаугсет

Если я удаляю парантезы в первой строке, я получаю: «SyntaxError: (irb): 17: синтаксическая ошибка, неожиданный tAMPER, ожидающий $ end»
Ларс Хаугсет

Между mapамперсандом должно быть пространство . И вам не нужен оператор пейнтбольного в передней части $<либо, так что в целом линия будет выглядеть следующим образом : a=$<.map &:to_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 4урожайность 1 0 1 0.
  • Таким образом, (+/\. y) = (+/\ y)получается один для всех индексов, при которых сумма суффикса равна сумме префикса, или создается равновесие.
  • Для векторов нулей и единиц I.возвращает вектор индексов, при котором вектор содержит единицу.

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

Python - 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.