Rachunki równoległe (dzień 2)

10

Wyzwanie Podjęte za zgodą mojego konkursu na University Code Challenge


Po ukończeniu studiów kilka miesięcy temu Marie otworzyła konto bankowe, aby zacząć otrzymywać wynagrodzenie za pierwszą pracę w mieście. Od tego czasu przeprowadzała z nim kilka transakcji. Jej pierwsza płatność wyniosła 1000 dolarów. Za te pieniądze zapłaciła za obiad, na który zaprosiła rodziców (obiad kosztował 150 USD), a następnie dokonała zakupu w znanym supermarkecie (80 USD) i rezerwacji hotelu na wakacje (200 USD). Pod koniec miesiąca ponownie otrzymała zapłatę (1040 dolarów, nieco więcej niż w poprzednim miesiącu), a następnego dnia wydała kolejne 70 dolarów w supermarkecie.

Dzisiaj zdała sobie sprawę, że jeśli po zapłaceniu pierwszych 80 dolarów w supermarkecie zostanie utworzone drugie konto, a pierwsze zamrożone, oba konta będą miały dokładnie takie samo saldo:

100015080Total=770200104070Total=770

Wydarzenie było dla niej tak rzadkie, że chce dalej sprawdzać, czy ruchy jej konta i ruchy jej przyjaciół mają tę funkcję, czy nie.

Wyzwanie

Biorąc pod uwagę listę transakcji, podaj liczbę przypadków, w których właściciel konta bankowego mógł utworzyć drugie konto, aby oba miały takie samo saldo końcowe.

Przykład: [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

Przypadek testowy

  • Wejście: 1000 -150 -80 -200 1040 -70Wyjście:1
  • Wejście: 100 -100Wyjście:2
  • Wejście: 1 2 3Wyjście:1
  • Wejście: 10 -20 15Wyjście:0
  • Wejście: 15 -15 15 -15Wyjście:3
  • Wejście: 1Wyjście:0

Notatki

  • Możesz założyć, że nie będzie żadnej transakcji o wartości 0 USD
  • Możesz wziąć wkład w dowolny rozsądny sposób
Luis Felipe De Jesus Munoz
źródło
11
Po 6 miesiącach zamrożonych i nowo utworzonych kont doniesiono, że bankier Marie jest teraz internowany w sanatorium. „Jesteśmy twoimi przyjaciółmi. Potrzebujesz odpoczynku”, powiedzieli.
Arnauld
2
Sugerowany przypadek testowy pojedynczej transakcji
Veskah

Odpowiedzi:

4

Perl 6 , 25 bajtów

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

Wypróbuj online!

Wyjaśnienie

Po prostu wstawiamy zero do podanej listy ( 0,|$_), tworzymy sekwencję sum częściowych z [\+](tj. Sekwencję utworzoną przez pierwszy element, sumę pierwszych dwóch, sumę pierwszych trzech itd.) I szukamy ( grep) dowolnego elementy, które są dokładnie równe połowie stanu końcowego konta (suma podanej listy). Wreszcie, liczymy je za pomocą +.

Ramillies
źródło
3

05AB1E , 11 bajtów

0.ø.œ2ùO€ËO

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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
Kevin Cruijssen
źródło
3

JavaScript (Node.js) , 45 bajtów

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

Wypróbuj online!

Zaoszczędź 4 bajty -~o[s]. Dzięki Shaggy.

tsh
źródło
+1 za pokonanie Arnaulda: o
Luis Felipe De Jesus Munoz
45 bajtów
Kudłaty
@LuisfelipeDejesusMunoz, Arnauld nie jest (zawsze) bezkonkurencyjny! ;)
Kudłaty
@ Shaggy Lead +jest zmieniony na !, aby mógł działać na wejściu [100].
tsh
Ach, nie zdawałem sobie sprawy, że musimy poradzić sobie z tablicami singleton. Ładnie naprawione.
Kudłaty
2

Perl 5 -p , 42 41 bajtów

@NahuelFouilleul zapisuje bajt

y/ /+/;$\+=eval$'==eval$`while/^|$|\+/g}{

Wypróbuj online!

Xcali
źródło
y/ /+/;zapisuje 1 bajt
Nahuel Fouilleul
34 bajty przy użyciu innego podejścia
Nahuel Fouilleul
30 bajtów
Nahuel Fouilleul
2

JavaScript (ES6), 52 bajty

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

Wypróbuj online!

Skomentował

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

Wersja rekurencyjna,  54  53 bajtów

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

Wypróbuj online!

Arnauld
źródło
Właśnie miałem zasugerować tę 52-bajtową wersję!
Kudłaty
@Shaggy Tak, zbyt wcześnie odrzuciłem wersję nierekurencyjną, ponieważ myślałem, że ta rekursywna może być krótsza.
Arnauld
2

APL (Dyalog Unicode) , 21 bajtów SBCS

Anonimowa ukryta funkcja prefiksu

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

Wypróbuj online!

ɩ ndices
 z
 tym zgadzają transakcji

0, dodać zero

⊂()¨⍨ Zastosuj następującą ukrytą funkcję dla każdego z nich jako lewego argumentu, a całą listę transakcji jako prawego argumentu ( argument zamiany

 cała lista transakcji
() jako lewy argument do poniższej funkcji
  ¨ zastosowanej do każdego z indeksów
    z zamienionymi argumentami (tj. lista po prawej, indeksy po lewej:

   upuść tyle z lewej

  1⊥ suma (lit. ocena w bazie-1)

  (… Czy )= to (0/1) jest równe…

    weź tyle transakcji od lewej

   +/ zsumuj je

+/ zsumuj tę listę logiczną, aby uzyskać liczbę prawd

Adám
źródło
2

Partia, 84 bajtów

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

Pobiera dane wejściowe jako argumenty wiersza polecenia. Wyjaśnienie:

@set s=%*

Połącz argumenty spacjami.

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

Zamień spacje na +s i oceń wynik. Wyczyść również liczbę.

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

Dla każdej kwoty odejmij dwukrotnie od sumy. Jeśli wynik wynosi zero, to jest to prawidłowe dopasowanie, więc zwiększ liczbę. Dodatkowe zero na początku pozwala na dopasowanie przed dowolnymi kwotami.

@echo %c%

Wydrukuj wynik.

Neil
źródło
2

Węgiel drzewny , 15 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 θ              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

Niestety w Charcoal Sum([])nie jest 0tak, więc muszę zapewnić, że zawsze będzie co najmniej jeden element do podsumowania.

Neil
źródło
2

Python 3 , 67 58 bajtów

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

Wypróbuj online!

-9 bajtów dzięki @ Don't be x-triple dot

Czarna sowa Kai
źródło
1
Podsumowując zamiast filtrowania pozwoli Ci zaoszczędzić 7 bajtów: lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
Pan Xcoder,
sum(l[:x])*2==sum(l)oszczędza kolejne 2 bajty.
Neil,
2

R , 50 37 bajtów

sum(c(0,cumsum(x<-scan()))==sum(x)/2)

Wypróbuj online!

Kirill L.
źródło
2

MATL , 9 bajtów

s0GhYsE=s

Wypróbuj online!

Takie samo podejście jak w przypadku innych odpowiedzi: wstaw zero i sprawdź, jak często połowa sumy jest równa sumie.

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
źródło
2

Japt -x , 14 11 bajtów

iT å+ ®¥nUx

Spróbuj

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
Kudłaty
źródło
2

PowerShell , 88 82 bajtów

-6 Bajtów dzięki mazzy

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

Wypróbuj online!

To wydaje się być bardzo niezdarną metodą, ale wykonało zadanie. Spróbuję to przerobić w przyszłości.

Veskah
źródło
1
możesz $i+=<predicate>zamiast tego pisaćif(<predicate>){$i++}
mazzy
2

Brachylog , 9 bajtów

Nie tak dobry jak dzień 1. Ten traci na galaretkę

{~c₂+ᵐ=}ᶜ

Wyjaśnienie

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

Zestaw testowy: wypróbuj online!

Kroppeb
źródło
1

bash, 52 bajty

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

TIO

Sztuczka: ustawienie IFS=+, "$*"rozwija się do ciągu, w którym argumenty są ograniczone +, w wyrażeniu arytmetycznym eval do sumy

Nahuel Fouilleul
źródło
0

J , 19 bajtów

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

Wypróbuj online!

wyjaśnienie

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.
Jonasz
źródło