Comptes parallèles (jour 2)

10

Défi relevé avec la permission de mon concours University Code Challenge


Après avoir terminé ses études il y a quelques mois, Marie a ouvert un compte bancaire pour commencer à recevoir le paiement de son premier emploi en ville. Depuis lors, elle a effectué quelques transactions avec elle. Son premier paiement était de 1 000 $. Avec cet argent, elle a payé un dîner dans lequel elle a invité ses parents (le dîner a coûté 150 dollars), puis elle a fait un achat dans un supermarché bien connu (80 dollars) et une réservation d'hôtel pour ses vacances (200 dollars). À la fin du mois, elle a de nouveau reçu son paiement (1040 dollars, un peu plus que le mois précédent) et le lendemain, elle a dépensé encore 70 dollars au supermarché.

Aujourd'hui, elle s'est rendu compte que si, après avoir payé les 80 premiers dollars au supermarché, un deuxième compte avait été créé et le premier gelé, les deux comptes auraient exactement le même solde:

1000-150-80Totunel=770-2001040-70Totunel=770

L'événement était si rare pour elle qu'elle veut continuer à vérifier si les mouvements de son compte et ceux de ses amis ont aussi cette particularité ou non.

Défi

Étant donné une liste de transactions, affichez le nombre d'instants de temps pendant lesquels le propriétaire du compte bancaire aurait pu créer un deuxième compte afin que les deux aient le même solde final.

Exemple: [1000, -150, -80, -200, 1040, -70]

1)Total=0100015080200104070Total=1540
2)1000Total=100015080200104070Total=540
3)1000150Total=85080200104070Total=690
4)100015080Total=770-2001040-70Totunel=770
5)1000-150-80-200Totunel=5701040-70Totunel=970
6)1000-150-80-2001040Totunel=1610-70Totunel=-70
7)1000-150-80-2001040-70Totunel=1540Totunel=0

Cas de test

  • Entrée: 1000 -150 -80 -200 1040 -70Sortie:1
  • Entrée: 100 -100Sortie:2
  • Entrée: 1 2 3Sortie:1
  • Entrée: 10 -20 15Sortie:0
  • Entrée: 15 -15 15 -15Sortie:3
  • Entrée: 1Sortie:0

Remarques

  • Vous pouvez supposer qu'il n'y aura aucune transaction de 0 $
  • Vous pouvez prendre des commentaires de toute manière raisonnable
Luis felipe De jesus Munoz
la source
11
Après 6 mois de comptes gelés et nouvellement créés, il est rapporté que le banquier de Marie est maintenant interné dans un sanatorium. "Nous sommes vos amis. Vous avez besoin de repos", ont-ils déclaré.
Arnauld
2
Cas de test suggéré d'une seule transaction
Veskah

Réponses:

4

Perl 6 , 25 octets

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

Essayez-le en ligne!

Explication

Nous ajoutons simplement un zéro à la liste donnée ( 0,|$_), faisons une séquence de sommes partielles avec [\+](c'est-à-dire la séquence formée par le premier élément, la somme des deux premiers, la somme des trois premiers, etc.), et recherchons ( grep) tout éléments qui sont exactement égaux à la moitié de l'état final du compte (somme de la liste donnée). Enfin, nous les comptons avec un +.

Ramillies
la source
3

05AB1E , 11 octets

0.ø.œ2ùO€ËO

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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
la source
3

JavaScript (Node.js) , 45 octets

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

Essayez-le en ligne!

Économisez 4 octets en utilisant -~o[s]. Merci à Shaggy.

tsh
la source
+1 pour avoir battu Arnauld: o
Luis felipe De jesus Munoz
45 octets
Shaggy
@LuisfelipeDejesusMunoz, Arnauld n'est pas (toujours) imbattable! ;)
Shaggy
@Shaggy interligne +est changé en !, donc cela pourrait fonctionner pour la saisie [100].
tsh
Ah, je ne savais pas que nous devions gérer des tableaux singleton. Joliment réparé.
Shaggy
2

Perl 5 -p , 42 41 octets

@NahuelFouilleul enregistre un octet

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

Essayez-le en ligne!

Xcali
la source
y/ /+/;sauve 1 octet
Nahuel Fouilleul
34 octets utilisant une autre approche
Nahuel Fouilleul
30 octets
Nahuel Fouilleul
2

JavaScript (ES6), 52 octets

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

Essayez-le en ligne!

Commenté

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

Version récursive,  54  53 octets

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

Essayez-le en ligne!

Arnauld
la source
J'étais sur le point de suggérer cette version de 52 octets!
Shaggy
@Shaggy Ouais, j'ai jeté la version non récursive trop tôt parce que je pensais que la version récursive pourrait être plus courte.
Arnauld
2

APL (Dyalog Unicode) , 21 octets SBCS

Fonction de préfixe tacite anonyme

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

Essayez-le en ligne!

ɩ ndices
 du
 décompte des transactions

0, ajouter zéro

⊂()¨⍨ Appliquer la fonction tacite suivante avec chacun de ceux-ci comme argument de gauche et la liste entière des transactions comme argument de droite ( argument swaps

 la liste complète des transactions
() comme argument de gauche pour la fonction ci-dessous
  ¨ appliquée à chacun des indices
    avec des arguments échangés (c'est-à-dire la liste à droite, les indices à gauche:

   laisser tomber autant de gens de la gauche

  1⊥ somme (lit. évaluer en base-1)

  ()= Est-il (0/1) égal à…

    prendre autant de transactions à gauche

   +/ les résumer

+/ additionner cette liste booléenne pour obtenir le nombre de vérités

Adam
la source
2

Lot, 84 octets

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

Prend l'entrée comme arguments de ligne de commande. Explication:

@set s=%*

Joignez les arguments avec des espaces.

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

Remplacez les espaces par +s et évaluez le résultat. Effacez également le décompte.

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

Pour chaque montant, soustrayez le double de la somme. Si le résultat est zéro, alors c'est une correspondance valide, alors incrémentez le nombre. Le zéro supplémentaire au début permet une correspondance avant tout montant.

@echo %c%

Imprimez le résultat.

Neil
la source
2

Fusain , 15 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

 θ              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

Malheureusement, le charbon de bois Sum([])ne l'est pas 0, je dois donc m'assurer qu'il y a toujours au moins un élément à additionner.

Neil
la source
2

Python 3 , 67 58 octets

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

Essayez-le en ligne!

-9 octets grâce à @ Don't be a x-triple dot

Chouette noire Kai
la source
1
En résumé au lieu de filtrage vous permettra d' économiser 7 octets: lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
M. Xcoder
sum(l[:x])*2==sum(l)vous enregistre encore 2 octets.
Neil
2

R , 50 37 octets

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

Essayez-le en ligne!

Kirill L.
la source
2

MATL , 9 octets

s0GhYsE=s

Essayez-le en ligne!

Même approche que certaines autres réponses: ajoutez un zéro et vérifiez la fréquence à laquelle la moitié de la somme cumulée est égale à la somme totale.

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
la source
2

Japt -x , 14 11 octets

iT å+ ®¥nUx

Essayez-le

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
Hirsute
la source
2

PowerShell , 88 82 octets

-6 octets grâce à mazzy

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

Essayez-le en ligne!

Cela semble être une méthode très maladroite mais elle a fait le travail. Je vais essayer de le réorganiser à l'avenir.

Veskah
la source
1
vous pouvez écrire à la $i+=<predicate>placeif(<predicate>){$i++}
mazzy
2

Brachylog , 9 octets

Pas aussi bon que le jour 1. Celui-ci perd à Jelly

{~c₂+ᵐ=}ᶜ

Explication

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

Suite de tests: essayez-le en ligne!

Kroppeb
la source
1

bash, 52 octets

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

TIO

L'astuce: définir IFS=+, se "$*"développe en une chaîne où les arguments sont délimités par +, dans l'expression arithmétique eval à la somme

Nahuel Fouilleul
la source
0

J , 19 octets

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

Essayez-le en ligne!

explication

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.
Jonas
la source