Parallele Konten (Tag 2)

10

Herausforderung Mit freundlicher Genehmigung meines University Code Challenge Contest


Nachdem Marie vor ein paar Monaten ihr Studium beendet hatte, eröffnete sie ein Bankkonto, um die Zahlung ihres ersten Jobs in der Stadt zu erhalten. Seitdem hat sie einige Transaktionen damit durchgeführt. Ihre erste Zahlung war 1000 Dollar. Mit diesem Geld bezahlte sie ein Abendessen, zu dem sie ihre Eltern einlud (das Abendessen kostete 150 Dollar), dann kaufte sie in einem bekannten Supermarkt ein (80 Dollar) und reservierte ein Hotel für ihren Urlaub (200 Dollar). Am Ende des Monats erhielt sie ihre Zahlung erneut (1040 Dollar, etwas mehr als im Vormonat) und am Tag danach gab sie weitere 70 Dollar im Supermarkt aus.

Heute stellte sie fest, dass, wenn nach der Zahlung der ersten 80 Dollar im Supermarkt ein zweites Konto erstellt und das erste eingefroren worden wäre, beide Konten genau den gleichen Kontostand hätten:

100015080Total=770200104070Total=770

Das Ereignis war für sie so selten, dass sie weiterhin feststellen möchte, ob die Bewegungen ihres Kontos und die ihrer Freunde auch diese Funktion haben oder nicht.

Herausforderung

Geben Sie anhand einer Liste von Transaktionen die Anzahl der Zeitpunkte aus, in denen der Inhaber des Bankkontos ein zweites Konto hätte erstellen können, sodass beide den gleichen endgültigen Kontostand hatten.

Beispiel: [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

Testfall

  • Eingabe: 1000 -150 -80 -200 1040 -70Ausgabe:1
  • Eingabe: 100 -100Ausgabe:2
  • Eingabe: 1 2 3Ausgabe:1
  • Eingabe: 10 -20 15Ausgabe:0
  • Eingabe: 15 -15 15 -15Ausgabe:3
  • Eingabe: 1Ausgabe:0

Anmerkungen

Luis felipe De jesus Munoz
quelle
11
Nach 6 Monaten eingefrorener und neu erstellter Konten wird berichtet, dass Maries Bankier jetzt in einem Sanatorium interniert ist. "Wir sind deine Freunde. Du brauchst etwas Ruhe", sagten sie.
Arnauld
2
Vorgeschlagener Testfall einer einzelnen Transaktion
Veskah

Antworten:

4

Perl 6 , 25 Bytes

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

Probieren Sie es online aus!

Erläuterung

Wir stellen der gegebenen Liste ( 0,|$_) einfach eine Null voran , machen eine Folge von Teilsummen mit [\+](dh der Folge, die durch das erste Element gebildet wird, die Summe der ersten zwei, die Summe der ersten drei usw.) und suchen ( grep) nach einer beliebigen Elemente, die genau der Hälfte des endgültigen Kontostatus entsprechen (Summe der angegebenen Liste). Schließlich zählen wir sie mit a +.

Ramillies
quelle
3

05AB1E , 11 Bytes

0.ø.œ2ùO€ËO

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
3

JavaScript (Node.js) , 45 Byte

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

Probieren Sie es online aus!

Speichern Sie 4 Bytes mit -~o[s]. Danke an Shaggy.

tsh
quelle
+1 für den
Sieg
45 Bytes
Shaggy
@LuisfelipeDejesusMunoz, Arnauld ist nicht (immer) unschlagbar! ;)
Shaggy
@Shaggy Leading +wird in geändert !, sodass es für Eingaben funktionieren kann [100].
tsh
Ah, ich wusste nicht, dass wir mit Singleton-Arrays umgehen müssen. Schön repariert.
Shaggy
2

Perl 5 -p , 42 41 Bytes

@NahuelFouilleul speichert ein Byte

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

Probieren Sie es online aus!

Xcali
quelle
y/ /+/;spart 1 Byte
Nahuel Fouilleul
34 Bytes mit einem anderen Ansatz
Nahuel Fouilleul
30 Bytes
Nahuel Fouilleul
2

JavaScript (ES6), 52 Byte

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

Probieren Sie es online aus!

Kommentiert

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

Rekursive Version,  54  53 Bytes

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

Probieren Sie es online aus!

Arnauld
quelle
Ich wollte gerade diese 52-Byte-Version vorschlagen!
Shaggy
@Shaggy Ja, ich habe die nicht rekursive Version zu früh verworfen, weil ich dachte, die rekursive könnte kürzer sein.
Arnauld
2

APL (Dyalog Unicode) , 21 Byte SBCS

Anonyme stillschweigende Präfixfunktion

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

Probieren Sie es online aus!

ɩ ndices
 von
 der Bilanz von Transaktionen

0, Null voranstellen

⊂()¨⍨ Wenden die folgende implizite Funktion mit jedem dieser als linkes Argument und der gesamten Liste der Transaktionen als rechtes Argument an ( Swaps-Argument)

 die gesamte Liste der Transaktionen
() als linkes Argument für die folgende Funktion,
  ¨ die auf jeden der Indizes
    mit vertauschten Argumenten angewendet wird (dh Liste rechts, Indizes links:

   Lass so viele von links fallen

  1⊥ Summe (lit. in Basis-1 auswerten)

  ()= Ist es (0/1) gleich…

    Nehmen Sie so viele Transaktionen von links

   +/ summiere sie

+/ Summiere diese Boolesche Liste, um die Anzahl der Wahrheiten zu erhalten

Adam
quelle
2

Stapel, 84 Bytes

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

Nimmt Eingaben als Befehlszeilenargumente entgegen. Erläuterung:

@set s=%*

Verbinden Sie die Argumente mit Leerzeichen.

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

Ersetzen Sie die Leerzeichen durch +s und bewerten Sie das Ergebnis. Löschen Sie auch die Zählung.

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

Subtrahieren Sie für jeden Betrag das Doppelte von der Summe. Wenn das Ergebnis Null ist, ist dies eine gültige Übereinstimmung. Erhöhen Sie daher die Anzahl. Die zusätzliche Null am Anfang ermöglicht eine Übereinstimmung vor irgendwelchen Beträgen.

@echo %c%

Drucken Sie das Ergebnis.

Neil
quelle
2

Holzkohle , 15 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:

 θ              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

Leider ist in Charcoal Sum([])nicht 0so, dass ich sicherstellen muss, dass es immer mindestens ein Element zu summieren gibt.

Neil
quelle
2

Python 3 , 67 58 Bytes

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

Probieren Sie es online aus!

-9 Bytes dank @ Sei kein x-dreifacher Punkt

Schwarze Eule Kai
quelle
1
Durch Summieren statt Filtern sparen Sie 7 Bytes : lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
Herr Xcoder
sum(l[:x])*2==sum(l)spart Ihnen weitere 2 Bytes.
Neil
2

MATL , 9 Bytes

s0GhYsE=s

Probieren Sie es online aus!

Gleicher Ansatz wie bei einigen anderen Antworten: Stellen Sie eine Null voran und prüfen Sie, wie oft die Hälfte der kumulierten Summe der Gesamtsumme entspricht.

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
quelle
2

Japt -x , 14 11 Bytes

iT å+ ®¥nUx

Versuch es

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
Zottelig
quelle
2

PowerShell , 88 82 Byte

-6 Bytes dank mazzy

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

Probieren Sie es online aus!

Dies scheint eine sehr ungeschickte Methode zu sein, aber sie hat den Job erledigt. Ich werde versuchen, es in Zukunft zu überarbeiten.

Veskah
quelle
1
Sie können $i+=<predicate>stattdessen schreibenif(<predicate>){$i++}
mazzy
2

Brachylog , 9 Bytes

Nicht so gut wie Tag 1. Dieser verliert gegen Jelly

{~c₂+ᵐ=}ᶜ

Erläuterung

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

Testsuite: Probieren Sie es online aus!

Kroppeb
quelle
1

Bash, 52 Bytes

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

TIO

Der Trick: Setting IFS=+wird "$*"zu einer Zeichenfolge erweitert, in der Argumente durch einen +arithmetischen Ausdruck begrenzt sind, der sich aus der Summe ergibt

Nahuel Fouilleul
quelle
0

J , 19 Bytes

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

Probieren Sie es online aus!

Erläuterung

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.
Jona
quelle