Tenue de livres pour les Sex Bob-ombs (vérifiez si une somme courante devient trop faible)

15

Croyez-le ou non, les Sex Bob-ombs sont devenus un groupe de renommée mondiale et sont actuellement en tournée mondiale! En tant que comptable, vous devez superviser leurs finances quotidiennes et fournir des rapports réguliers.

Toutes les quelques semaines, vous compilez une liste de leurs dépenses (en USD ) dans l'ordre où elles ont été engagées.

Par exemple, la liste

378
-95
2234

signifie que 378 $ ont été déposés sur leur compte et qu'ensuite 95 $ ont été retirés, puis que 2234 $ ont été déposés.

Vous voulez vous assurer que la somme en cours d' exécution de ces valeurs va jamais au- dessous une valeur de seuil T . Vous décidez d'écrire un programme pour le faire pour vous.

Défi

Écrivez un programme ou une fonction qui prend un seul entier T et une liste d'entiers. Si la somme cumulée de la liste des nombres entiers est toujours inférieure à T , imprimez ou renvoyez une valeur fausse , sinon imprimez ou renvoyez une valeur véridique.

Vous pouvez utiliser toutes les méthodes d'entrée habituelles (stdin, à partir d'un fichier, de la ligne de commande, des arguments pour fonctionner).

  • Au début de la liste, la somme cumulée est de 0. Un T positif signifie donc que le résultat est toujours faux.
  • + ne sera jamais devant des nombres entiers positifs.
  • La liste peut contenir 0.
  • La liste est peut-être vide.

Cas de test

T est -5 dans tous ces cas.

Falsy:

-6
1
2
3
-20
200
-300
1000

Vérité:

[empty list]
-5
4
-3
-6

Notation

La soumission avec le moins d'octets est gagnante. Tiebreaker passe à la première soumission publiée.

Le commentaire regrettable qui m'a forcé à le faire.

Loisirs de Calvin
la source
1
Le cas de test nécessaire T = 5, L = [10]. Peut-être que j'ai complètement raté le point
edc65
1
@ edc65 "Au début de la liste, la somme cumulée est 0. (Donc un T positif signifie que le résultat est toujours faux.)"
Martin Ender
@optimizer ne soyez pas triste, j'ai votre référence <3
undergroundmonorail
@undergroundmonorail trop tard. Et il y a un lien là-dedans.
Optimizer

Réponses:

2

gs2 - 6 octets

Supposons que la liste se trouve en haut de la pile et que le seuil se trouve dans le registre A. En mnémoniques:

inits
sum get-a lt filter3
not

En bytecode:

78 64 D0 70 F2 22
Lynn
la source
Est-ce vraiment la fonction équivalente dans gs2? En gros, pouvez-vous justifier un peu plus vos hypothèses? (J'accepterai probablement si vous le faites.)
Calvin's Hobbies
gs2 n'a pas vraiment de fonctions, mais vous pouvez mettre du code dans un bloc, le pousser en haut de la pile et appeler eval dessus, comme dans GolfScript. Si vous mettez ces six octets dans un bloc et les évaluez dans la situation que j'ai décrite, la liste au-dessus de la pile sera remplacée par la réponse (0 pour faux, 1 pour vrai). De même, si vous préfixez simplement ce code avec un code qui pousse une liste et attribue un seuil au registre A, vous obtiendrez le résultat correct.
Lynn
Cela fonctionne de manière assez similaire à d'autres solutions. initsest comme dans Haskell: "abcd" inits["" "a" "ab" "abc" "abcd"]nous obtient tous les préfixes. Ensuite, nous filtrons avec un "lambda" de trois commandes, qui est __ __ __ F2en bytecode: nous recherchons tous les préfixes dont la somme est inférieure à ce qui est dedans A. notDétermine ensuite si la liste est vide.
Lynn
11

Haskell, 22 octets

f t=all(>=t).scanl(+)0

Utilisation: f (-5) [4,-3,-6]quelles sorties True.

Faites une liste de sous-totaux et vérifiez si tous les éléments sont> = t.

Edit: Bugfix pour la liste vide et ts positifs

nimi
la source
@ MartinBüttner: L'initiale 0n'est pas dans la liste, car scanl1renvoie la liste vide si elle est alimentée avec la liste vide, mais allintercepte ce cas. f (-5) []retourne True.
nimi
@ MartinBüttner: Oups, vous avez raison. J'ai raté cette affaire et je l'ai réparée. Merci!
nimi
7

Python 2, 41

f=lambda a,t:t<=0<(a and f(a[1:],t-a[0]))

Le premier argument est le tableau; le second est le total cumulé minimum.

feersum
la source
6

J, 11 octets

   */@:<:0,+/\

Les tests

   _5 (*/@:<:0,+/\)  1 2 3 _20
0
   _5 (*/@:<:0,+/\)  >a: NB. empty list
1

Amélioration d'un octet grâce à FUZxxl .

Explication pour la version originale (*/@(<:0,+/\))

  • +/\crée une somme cumulée (somme +/des préfixes \)
  • 0,+/\ ajoute un 0 à la somme cumulée
  • (<:0,+/\)entrée côté gauche plus petite ou égale <:à (éléments de) résultat de 0,+/\l'entrée côté droit
  • @ avec le résultat précédent
  • */ produit de tous les éléments (1 si tous les éléments sont 1, 0 si un élément est 0)
randomra
la source
Vous pouvez le faire */@:<:0,+/\ pour un personnage, je pense.
FUZxxl
6

APL, 8 10

∧.≤∘(0,+\)

Il s'agit d'une fonction qui prend Tcomme argument de gauche et la liste comme argument de droite.

  • 0,+\: somme cumulée de l'argument de droite, ajoutée à un 0
  • ∧.≤: argument de gauche plus petit ou égal (≤) à tous les éléments (∧) de l'argument de droite
marinus
la source
J'ai également essayé ceci, mais "un T positif signifie donc que le résultat est toujours faux".
jimmy23013
@ user23013: bon sang. bon, c'est réparé maintenant mais ça ne gagnera pas.
marinus
4

Mathematica, 34 octets

FreeQ[Accumulate@{0,##2},n_/;n<#]&

Ceci définit une fonction variadic sans nom qui prend Tcomme premier paramètre et les transactions comme paramètres restants, et retourne un booléen:

FreeQ[Accumulate@{0,##2},n_/;n<#]&[-5, 1, 2, 3, -20]
(* False *)

J'aime ça parce que je pourrais utiliser le plutôt rare ##2qui "répartit" tous les arguments du second dans la liste. Pour plus de détails, voir la dernière section de cette astuce golf .

Martin Ender
la source
4

k, 8 caractères

Un verbe dyadique prenant le seuil comme premier argument et la liste comme deuxième. Remarquablement, cela fonctionne dans toutes les versions de k, y compris le Kona open-source.

&/~0<-\,

En k, la composition des fonctions se fait simplement en écrivant l'une puis l'autre, nous pouvons donc la décomposer par fonctions. De droite à gauche:

  • -\,prend des sommes courantes successives et les soustrait du seuil. (Si fest dyadique, puis se f\ (a; b; c; ...) développe en (a; a f b; (a f b) f c; ...). ,Joint simplement les listes.) La rupture se produit même lorsque quelque chose est égal à 0, et le surdénombrement donne des valeurs strictement positives.
  • ~0<n'est pas inférieur à 0. k n'a pas vraiment d' <=opérateur supérieur ou égal à , nous devons donc lancer booléen NOT sur un nombre inférieur à, mais cela vérifie si le résultat est non positif. Il s'applique automatiquement à chaque atome de la liste.
  • &/est le pli de ET logique sur une liste. (Pour fdyadique) Donc, cela teste si chaque booléen dans la liste est vrai.

Exemples:

  (&/~0<-\,)[-5; 1 2 3 -20]
0
  f:&/~0<-\,  /assign to a name
  f[-5; 4 -3 -6]
1
algorithmshark
la source
J'ajouterais probablement 2 caractères pour les parenthèses. Et vous pouvez raser 1 caractère si vous le faites~|/>+\,
tmartin
@tmartin Monadic >est une "permutation de tri décroissante", donc ~|/>+\,donne vrai uniquement lorsque la liste d'entrée est vide ...
algorithmshark
Ah tu as raison, mon erreur.
tmartin
3

CJam, 17 octets

l~0\{1$+}%+\f<:+!

Prend l'entrée comme un entier et un tableau de style CJam sur STDIN:

-5 [1 2 3 -20]

Testez-le ici.

Martin Ender
la source
3

Pyth, 16 15

!sm>vzs+0<QdhlQ

Essayez-le en ligne avec l'entrée

-5
[4, -3, 6]

Explication:

                   Implicit: z and Q read 2 line from input
                   z = "-5" (this is not evaluated, it's a string)
                   Q = [4, -3, 6] (this is a list though)
 m         hlQ     map each number d in [0, 1, 2, ..., len(Q)] to:
  >vz                 the boolean value of: evaluated z > 
     s+0<Qd                                 the sum of the first d elements in Q 
!s                  print the boolen value of: 1 > sum(...)

Et encore une fois, la sfonction stupide gaspille deux octets. Je pense que je vais signaler cela comme un bug au dépôt Pyth.

modifier: 13 (non valide)

Merci à isaacg pour un octet de sauvegarde ( >1to !) et pour avoir changé l'implémentation de sdans le repo Pyth. Maintenant, le code suivant est possible (mais bien sûr non valable pour ce défi).

!sm>vzs<QdhlQ
Jakube
la source
Je les utilise assez souvent. Voir ici: codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/… . Il sauverait 2 caractères dans ce cas, mais perdrait 5 caractères dans la liste des cas. Je vois s'il y a une lettre inutilisée pour les séparer en deux fonctions différentes. En outre, vous pouvez enregistrer un personnage en utilisant !au lieu de >1.
isaacg
@isaacg Définir la somme d'une liste vide comme 0 (presque) ne casse aucun code Pyth existant. Le seul code qu'il casserait est #sY. Et merci pour la sauvegarde de 1 octet.
Jakube
Je suppose que c'est juste - lever des exceptions n'aide personne. Fixé.
2015
3

R, 35

function(t,l)all(cumsum(c(0,l))>=t)

Essayez-le ici

MickyT
la source
3

Julia, 33 octets

(T,l)->all(i->i>=T,cumsum([0,l]))

Cela crée une fonction sans nom qui accepte deux paramètres, Tetl , et renvoie un booléen.

La all()fonction fait tout le gros du travail ici. Il prend deux arguments: un prédicat et un itérable. Pour le prédicat, nous lui disons qu'il ireprésente la valeur actuelle de l'itérable en utilisant une fonction sans nom, spécifiée par i->. Ensuite, à chaque itération, nous comparons ià l' Tutilisation i>=T.

Pour vous assurer que Julia ne panique pas d'utiliser cumsum()sur une liste vide, nous pouvons y mettre un zéro en utilisant [0, l].

Alex A.
la source
3

Prelude , 144 136 bytes

C'était ... dur ...

?
?(1- )v1+(1-
 ^    #       1) v #  -)1+(#
  v#         vv (##^v^+
   ^?+     v-(0## ^ #   01 #)(#)#
1         v#                  # )!

Je pense que 6 voix est un nouveau record pour moi, même si je suis sûr qu'il existe un moyen de réduire cela et de se débarrasser de beaucoup de ces espaces ennuyeux. Vérifier le signe d'une valeur (et donc vérifier si une valeur est supérieure à une autre) est assez délicat dans Prelude.

L'entrée et la sortie sont données sous forme de valeurs d'octets. Lorsque vous utilisez l'interpréteur Python , vous pouvez définir NUMERIC_OUTPUT = True, de sorte que vous obtenez réellement un ASCII 0ou 1. Pour la saisie numérique, vous devez ajouter un autre NUMERIC_INPUTindicateur (je devrais probablement publier mon interprète modifié à un moment donné).

Notez également que Prelude ne peut pas vraiment distinguer la fin d'une liste d'un 0dans la liste. Donc, pour autoriser zéro transaction, je lis T, puis la longueur Lde la liste, puis les Ltransactions.

Martin Ender
la source
2

CJam, 18 octets

Une autre approche dans les mêmes octets que l'autre.

q~_,),\f<1fb:)f<:&

Prend entrée via STDIN sous la forme de <threshold> <array of transactions>

Essayez-le en ligne ici

Optimiseur
la source
1
Je pense que vous pouvez utiliser à la f>:|!place de:)f<:&
aditsu
2

JavaScript (ES6) 38 33

Modifier le bug d'équilibre initial fixe. Thx @martin & @rainbolt

F=(t,l)=>![r=0,...l].some(v=>(r+=v)<t)

Tester dans la console Firefox / FireBug

console.log(F(-5,[-6]),F(-5,[1,2,3,-20]),F(-5,[200,-300,1000]))
console.log(F(-5,[]),F(-5,[-5]),F(-5,[4,-3,-6]))
console.log(F(5,[10]),F(5,[]))

faux faux faux
vrai vrai vrai
faux faux

edc65
la source
2
Le solde initial est nul. Le premier dépôt est de 10, mais nous sommes déjà en dessous de notre seuil avant que le premier dépôt ne parvienne à la banque.
Rainbolt
2

Python 2,7 - 55 octets

f=lambda T,l:all(T<=sum(l[:i])for i in range(len(l)+1))

Appelez comme print f(-5,[1,2,3,-20]). Testez-le ici .

Merci à Jakube pour son aide.

Rainbolt
la source
2

> <>, 29 + 3 = 32 octets

r0}&v >1n;n0<
&:&:<+^?=1l ^?(

Courir comme

py -3 fish.py bookkeep.fish -v -5 4 3 -6

où le seuil est le premier nombre.

Sp3000
la source
1

Octave, 27

@(t,l)all(cumsum([0,l])>=t)
alephalpha
la source
1

Perl 6 (21 octets)

{$^a>none [\+] 0,@^b}

C'est une fonction qui prend l'argument initial et la liste des éléments. Il fonctionne en vérifiant si aucun ( en utilisant des jonctions ) d'éléments n'est en dessous du seuil. [\+]est utilisé pour générer une somme cumulée, par exemple [\+] 1, 2, 3donne 1, 3, 6. 0,ajouter 0au début de la liste est nécessaire en raison de l'exigence selon laquelle le seuil positif doit toujours échouer.

À peu près la même chose que la solution Haskell, juste dans la syntaxe Perl 6 (Perl 6 a pris tellement de fonctionnalités de programmation soignées de Haskell).

Konrad Borowski
la source
0

Perl - 20

Prenez la liste des numéros STDINséparés par des sauts de ligne et prenez Tle -idrapeau.

die if$^I>($i+=$_)

+2 pour -iet -ndrapeaux. La valeur de sortie correspond 255aux échecs et0 au succès.

Courir avec:

echo -e "4\n3\n-6" | perl -i0 -ne'die if$^I>($i+=$_)'
hmatt1
la source
0

Clojure, 45

(fn[T t](every? #(<= T %)(reductions + 0 t)))

Par exemple

((fn[T t](every? #(<= T %)(reductions + 0 t))) -5 [1 2 3 -20])
;; =>false

Ou un peu plus agréable;

(defn f[T t](every? #(<= T %)(reductions + 0 t)))

(testing
  (testing "tests from question"
    (is (false? (f -5 [-6])))
    (is (false? (f -5 [1 2 3 -20])))
    (is (false? (f -5 [200 -300 1000])))
    (is (true? (f -5 [-5])))
    (is (true? (f -5 [4 -3 -6])))
    (is (true? (f -5 []))))
  (testing "the start of the list the running sum is 0. So a positive T means the result is always falsy"
    (is (false? (f 5 [5])))
    (is (false? (f 5 [10])))
    (is (false? (f 5 [])))))
cfrick
la source
0

Java 8 - 153 caractères

Fonction golf:

import java.util.stream.*;
boolean f(int t, IntStream s){int r=1;try{s.reduce(0,(a,b)->(a+b>=t)?(a+b):(a/(a-a)));}catch(Exception e){r=0;}return r==1;} 

Non golfé:

import java.util.stream.*;

boolean f(int t, IntStream s) {
    int r=1;
    try {
        s.reduce(0,(a,b) -> (a+b>=t) ? (a+b) : (a/(a-a)));
    } catch(Exception e) {
        r=0;
    }

    return r==1;
} 

Programme pilote:

import java.util.stream.*;
import java.util.*;

public class A {
    // function f as above

    public static void main(String... args) {
        int t = -5;
        IntStream s = null;

        s = Arrays.asList(-6).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(1,2,3,-20).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(200,-300,1000).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        System.out.println("above false, below true");

        s = IntStream.empty();
        System.out.println(new A().f(t,s));

        s = Arrays.asList(4,-3,-6).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));

        s = Arrays.asList(-5).stream().mapToInt(i->i);
        System.out.println(new A().f(t,s));
}

}

Production:

bash-3.2$ javac A.java ; java A

false
false
false
above false, below true
true
true
true
Michael Easter
la source