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

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 +.


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


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.


+1 pour avoir battu Arnauld: o
Luis felipe De jesus Munoz


@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

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!


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


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.


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.


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


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

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

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

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.


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!


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



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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.