Паралельні рахунки (2 день)


10

Виклик, прийнятий з дозволу мого університетського конкурсу викликів


Закінчивши навчання пару місяців тому, Марі відкрила банківський рахунок, щоб почати отримувати оплату своєї першої роботи в місті. З тих пір вона здійснювала кілька операцій з цим. Її перший платіж становив 1000 доларів. Цими грошима вона заплатила за вечерю, на яку вона запросила своїх батьків (обід коштував 150 доларів), потім вона зробила покупку у відомому супермаркеті (80 доларів) та бронювання готелів для своєї відпустки (200 доларів). Наприкінці місяця вона знову отримала свою виплату (1040 доларів, трохи більше, ніж попередній місяць), і наступного дня вона витратила в супермаркеті ще 70 доларів.

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

100015080Total=770200104070Total=770

Подія була для неї настільки рідкісною, що вона хоче продовжувати з'ясовувати, чи мають рухи її рахунку та руху її друзів цю особливість чи ні.

Виклик

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

Приклад: [1000, -150, -80, -200, 1040, -70]

1)Тотал=01000-150-80-2001040 рік-70Тотал=1540 рік
2)1000Тотал=1000-150-80-2001040 рік-70Тотал=540
3)1000-150Тотал=850-80-2001040 рік-70Тотал=690
4)1000-150-80Тотал=770-2001040 рік-70Тотал=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

Примітки


11
Після 6 місяців заморожених та новостворених рахунків повідомляється, що банкір Марі зараз інтернований у санаторій. "Ми твої друзі. Вам потрібен відпочинок", - сказали вони.
Арнольд

2
Запропонований тестовий випадок однієї транзакції
Веска

Відповіді:



4

Perl 6 , 25 байт

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

Спробуйте в Інтернеті!

Пояснення

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


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
Луїс феліпе Де ісус Муноз


@LuisfelipeDejesusMunoz, Арнольд не (завжди) неперевершений! ;)
Shaggy

@Shaggy ведучий +змінено на !, щоб він міг працювати для введення[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

Спробуйте в Інтернеті!


Я тільки збирався запропонувати цю 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

На жаль, у вугільному вугіллі Sum([])це не 0так, я маю забезпечити, щоб завжди був хоча б один елемент для підсумовування.


2

Python 3 , 67 58 байт

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

Спробуйте в Інтернеті!

-9 байт завдяки @ Не будь x-потрійною крапкою


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

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

Спробуйте в Інтернеті!

Це здається дуже незграбним методом, але він виконав роботу. Я спробую і оновити його в майбутньому.


1
ви можете написати $i+=<predicate>замість цьогоif(<predicate>){$i++}
mazzy



1

баш, 52 байти

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

ТІО

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