Параллельные счета (день 2)

10

Вызов с разрешения моего конкурса на участие в университетском коде


После окончания учебы пару месяцев назад Мари открыла банковский счет, чтобы начать получать оплату за свою первую работу в городе. С тех пор она провела несколько транзакций с ним. Ее первый платеж составил 1000 долларов. На эти деньги она заплатила за ужин, на который пригласила своих родителей (ужин стоил 150 долларов), затем она сделала покупку в известном супермаркете (80 долларов) и зарезервировала гостиницу для отпуска (200 долларов). В конце месяца она снова получила свой платеж (1040 долларов, чуть больше, чем в предыдущем месяце), а на следующий день она потратила еще 70 долларов в супермаркете.

Сегодня она поняла, что если после оплаты первых 80 долларов в супермаркете будет создан второй счет, а первый заморожен, то оба счета будут иметь одинаковый баланс:

100015080Total=770200104070Total=770

Это событие было настолько редким для нее, что она хочет продолжать выяснять, есть ли у этой функции и ее друзей движения в этой учетной записи или нет.

Вызов

Учитывая список транзакций, выведите количество моментов времени, в течение которых владелец банковского счета мог создать вторую учетную запись, чтобы у обоих был один и тот же конечный баланс.

Пример: [1000, -150, -80, -200, 1040, -70]

1)Total=0100015080200104070Total=1540
2)1000Total=100015080200104070Total=540
3)1000150Total=85080200104070Total=690
4)100015080Total=770200104070Total=770
5)100015080200Total=570104070Total=970
6)1000150802001040Total=161070Total=70
7)100015080200104070Total=1540Total=0

Прецедент

  • Вход: 1000 -150 -80 -200 1040 -70Выход:1
  • Вход: 100 -100Выход:2
  • Вход: 1 2 3Выход:1
  • Вход: 10 -20 15Выход:0
  • Вход: 15 -15 15 -15Выход:3
  • Вход: 1Выход:0

Ноты

  • Вы можете предположить, что не будет никакой транзакции в $ 0 долларов
  • Вы можете принять участие любым разумным способом
Луис Фелипе Де Иисус Муньос
источник
11
Сообщается, что после 6 месяцев замороженных и вновь созданных счетов банкир Мари теперь интернирован в санатории. «Мы ваши друзья. Вам нужен отдых», - сказали они.
Арно
2
Предлагаемый тестовый пример для одной транзакции
Веска

Ответы:

4

Perl 6 , 25 байт

{+grep .sum/2,[\+] 0,|$_}

Попробуйте онлайн!

объяснение

Мы просто добавляем ноль к данному списку ( 0,|$_), создаем последовательность частичных сумм с [\+](то есть последовательность, образованную первым элементом, сумму первых двух, сумму первых трех и т. Д.), И ищем ( grep) для любого элементы, которые точно равны половине конечного состояния счета (сумма данного списка). Наконец, мы посчитаем их с +.

Ramillies
источник
3

05AB1E , 11 байт

0.ø.œ2ùO€ËO

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

0.ø          # Surround the (implicit) input list with a leading and trailing 0
             #  i.e. [100,-100] → [0,100,-100,0]
           # Get all possible partitions to divide the list
             #  → [[[0],[100],[-100],[0]],[[0],[100],[-100,0]],[[0],[100,-100],[0]],[[0],[100,-100,0]],[[0,100],[-100],[0]],[[0,100],[-100,0]],[[0,100,-100],[0]],[[0,100,-100,0]]]
     2ù      # Only leave partitions consisting of 2 items
             #  → [[[0],[100,-100,0]],[[0,100],[-100,0]],[[0,100,-100],[0]]]
       O     # Take the sum of each
             #  → [[0,0],[100,-100],[0,0]]
        €Ë   # Check of each inner list if both sums are equal (1 if truthy; 0 if falsey)
             #  → [1,0,1]
          O  # Take the sum of that (and output as result)
             #  → 2
Кевин Круйссен
источник
3

JavaScript (Node.js) , 45 байт

a=>!a.map(v=>o[s+=v]=-~o[s],s=0,o=[1])|o[s/2]

Попробуйте онлайн!

Сохранить 4 байта с помощью -~o[s]. Спасибо Шегги.

ТТГ
источник
+1 за избиение Арно: o
Луис Фелипе Де Иисус Муньос
45 байт
Shaggy
@LuisfelipeDejesusMunoz, Арно не является (всегда) непобедимым! ;)
Лохматый
@ Шагги ведущий +изменен на !, чтобы он мог работать для ввода [100].
TSH
Ах, не понимал, что мы должны обрабатывать одноэлементные массивы. Красиво исправлено.
Лохматый
2

JavaScript (ES6), 52 байта

a=>a.map(x=>n+=(s+=x)==eval(a.join`+`)-s,n=s=0)|n+!s

Попробуйте онлайн!

комментарии

a =>                        // a[] = input array
  a.map(x =>                // for each element x in a[]:
    n +=                    //   increment n if the following test is truthy:
      (s += x)              //     update the left sum
      ==                    //     and test whether it's equal to
      eval(a.join`+`) - s,  //     the right sum
    n = s =0                //   start with n = s = 0
  )                         // end of map()
  | n                       // yield n; if the final sum is 0, it means that we could have
  +                         // created a balanced account at the beginning of the process;
  !s                        // so, we increment n if it is

Рекурсивная версия,  54  53 байта

f=(a,s=0)=>a+a?(s==eval(a.join`+`))+f(a,s+a.pop()):!s

Попробуйте онлайн!

Arnauld
источник
Я как раз собирался предложить эту 52-байтовую версию!
Лохматый
@ Shaggy Да, я отказался от нерекурсивной версии слишком рано, потому что думал, что рекурсивная версия может быть короче.
Арно
2

APL (Dyalog Unicode) , 21 байт SBCS

Функция анонимного молчаливого префикса

+/⊂((+/↑)=1⊥↓)¨⍨0,⍳∘≢

Попробуйте онлайн!

ɩ ndices
 о
 подсчете сделок

0, предварять ноль

⊂()¨⍨ Применить следующую молчаливую функцию с каждым из них в качестве левого аргумента, а весь список транзакций - в качестве правого аргумента ( аргумент swaps

 весь список транзакций
(... в ) качестве левого аргумента для функции ниже,
  ¨ применяемой к каждому из индексов
    с замененными аргументами (т.е. список справа, индексы слева:

   отбросьте так много слева

  1⊥ сумма (лит. оценка в базе-1)

  (... )= это (0/1) равно ...

    взять столько транзакций слева

   +/ суммировать их

+/ суммируйте этот логический список, чтобы получить количество истин

Адам
источник
2

Пакетная, 84 байта

@set s=%*
@set/as=%s: =+%,c=0
@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s
@echo %c%

Принимает ввод в качестве аргументов командной строки. Объяснение:

@set s=%*

Соедините аргументы с пробелами.

@set/as=%s: =+%,c=0

Замените пробелы на +s и оцените результат. Также очистите счет.

@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s

Для каждой суммы вычтите двойную сумму из суммы. Если результат равен нулю, то это правильное совпадение, поэтому увеличьте счетчик. Дополнительный ноль в начале учитывает совпадение до любых сумм.

@echo %c%

Распечатайте результат.

Нил
источник
2

Древесный уголь , 15 байт

⊞θ⁰IΣEθ⁼Σθ⊗Σ✂θκ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

 θ              Input list
  ⁰             Literal 0
⊞               Push to list
      θ         Augmented list
     E          Mapped to
             θ  Augmented list
            ✂   Sliced from
              κ Current index
           Σ    Summed
          ⊗     Doubled
       ⁼        Equals
         θ      (Augmented) list
        Σ       Summed
    Σ           Sum of booleans
   I            Cast to string
                Implicitly print

К сожалению, в Charcoal Sum([])это не 0так, я должен убедиться, что всегда есть хотя бы один элемент для суммирования.

Нил
источник
2

Python 3 , 67 58 байт

lambda l:sum(sum(l[:x])*2==sum(l)for x in range(len(l)+1))

Попробуйте онлайн!

-9 байт благодаря @ Не будь х-тройной точкой

Черная Сова Кай
источник
1
Суммируя вместо фильтрации сэкономит вам 7 байт: lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
г-н Xcoder
sum(l[:x])*2==sum(l)экономит вам еще 2 байта.
Нил
2

MATL , 9 байт

s0GhYsE=s

Попробуйте онлайн!

Такой же подход, как и у некоторых других ответов: добавьте ноль и проверьте, как часто половина накопленной суммы равна общей сумме.

s   % Total sum of (implicit) input
0Gh % Prepend 0 to another copy of the input
Ys  % Cumulative sum
E=  % Check element-wise equality of 2*cumulative sum with total sum
s   % Sum number of `true` values
Sanchises
источник
2

Japt -x , 14 11 байт

iT å+ ®¥nUx

Попробуй это

iT å+ ®¥nUx     :Implicit input of array U
i               :Prepend
 T              :  Zero
   å+           :Cumulatively reduce by addition
      ®         :Map each Z
       ¥        :  Test for equality with
        n       :  Z subtracted from
         Ux     :  U reduced by addition
                :Implicitly reduce by addition and output
мохнатый
источник
2

PowerShell , 88 82 байта

-6 байт благодаря маззи

param($n)0..($x=$n.length)|%{$i+=+$z-eq($n[$_..$x]|measure -Su).sum;$z+=$n[$_]};$i

Попробуйте онлайн!

Это выглядит как очень неуклюжий метод, но он сделал свою работу. Я постараюсь обновить его в будущем.

Veskah
источник
1
Вы можете написать $i+=<predicate>вместо этогоif(<predicate>){$i++}
mazzy
2

Брахилог , 9 байт

Не так хорошо, как день 1. Этот проигрывает Желе

{~c₂+ᵐ=}ᶜ

объяснение

{      }ᶜ   # Count the ways to:
 ~c₂        #   Split the input array in 2 ...
    +ᵐ      #   so that their sums ...
      =     #   are equal

Набор тестов: попробуйте онлайн!

Kroppeb
источник
1

Баш, 52 байта

IFS=+;for i in 0 $@;{((c+=2*(x+=i)=="$*"));};echo $c

TIO

Трюк: установка IFS=+, "$*"расширяется до строки, где аргументы разделены +, в арифметическом выражении, эквивалентном сумме

Науэль Фуйе
источник
0

J , 19 байт

1#.[:(={:-])0+/\@,]

Попробуйте онлайн!

объяснение

1 #. [: (= ({: - ])) 0 +/\@, ]

                     0     , ]  NB. prepend 0 to input...
                       +/\@     NB. and take the prefix sums...
     [:    ({: - ])             NB. then subtract that list
                                NB. from its final elm 
                                NB. (`{:`), giving the list
                                NB. of suffix sums...
     [: (= (      ))            NB. create a 1-0 list showing
                                NB. where the prefix sums 
                                NB. equal the suffix sums
1 #.                            NB. and take the sum.
Ион
источник