Contabilità per le Bob-ombs sessuali (controlla se una somma corrente diventa mai troppo bassa)


15

Che ci crediate o no, i Sex Bob-ombs sono diventati una band di fama mondiale e sono attualmente in tournée mondiale! Come loro contabile devi controllare le loro finanze quotidiane e fornire rapporti periodici.

Ogni poche settimane compili un elenco delle loro spese (in dollari USA ) nell'ordine in cui sono state sostenute.

Ad esempio, l'elenco

378
-95
2234

significa che $ 378 sono stati depositati sul loro conto e dopo che $ 95 sono stati ritirati, e dopo che $ 2234 sono stati depositati.

Si vuole fare in modo che la somma parziale di questi valori non scende mai sotto un certo valore di soglia T . Decidi di scrivere un programma per farlo per te.

Sfida

Scrivi un programma o una funzione che accetta un singolo numero intero T e un elenco di numeri interi. Se la somma corrente dell'elenco di numeri interi è sempre inferiore a T , quindi stampare o restituire un valore errato , altrimenti stampare o restituire un valore veritiero.

È possibile utilizzare qualsiasi metodo di input usuale (stdin, da file, riga di comando, argomenti per funzionare).

  • All'inizio dell'elenco la somma corrente è 0. Quindi una T positiva indica che il risultato è sempre falso.
  • + non sarà mai di fronte a numeri interi positivi.
  • L'elenco può contenere 0.
  • L'elenco potrebbe essere vuoto.

Casi test

T è -5 in tutti questi.

Falsy:

-6
1
2
3
-20
200
-300
1000

Truthy:

[empty list]
-5
4
-3
-6

punteggio

Vince l'invio con il minor numero di byte . Tiebreaker arriva al primo invio pubblicato.

Il commento deplorevole che mi ha costretto a farlo.


1
Test case necessario T = 5, L = [10]. Forse ho completamente perso il punto
edc65

1
@ edc65 "All'inizio dell'elenco la somma corrente è 0. (Quindi una T positiva significa che il risultato è sempre falso.)"
Martin Ender

@optimizer non essere triste, ho il tuo riferimento <3
undergroundmonorail

@undergroundmonorail troppo tardi. E c'è un link lì dentro.
Ottimizzatore

Risposte:


2

gs2 - 6 byte

Supponiamo che l'elenco sia in cima allo stack e che la soglia sia nel registro A. In mnemonici:

inits
sum get-a lt filter3
not

Nel bytecode:

78 64 D0 70 F2 22

Questa è davvero la funzione equivalente in gs2? Fondamentalmente, puoi giustificare un po 'di più le tue ipotesi? (Probabilmente accetterò se lo fai.)
Calvin's Hobbies

gs2 non ha davvero funzioni, ma puoi mettere un po 'di codice in un blocco, spingerlo sopra lo stack e chiamare eval su di esso, proprio come in GolfScript. Se metti questi sei byte in un blocco e li valuti nella situazione che ho descritto, l'elenco in cima allo stack verrà sostituito con la risposta (0 per falso, 1 per vero). Allo stesso modo se si applica semplicemente questo prefisso con un codice che inserisce un elenco e assegna una soglia al registro A, si otterrà il risultato corretto.
Lynn,

Funziona in modo abbastanza simile alle altre soluzioni. initsè come in Haskell: "abcd" inits["" "a" "ab" "abc" "abcd"]ci dà tutti i prefissi. Quindi filtriamo con un "lambda" di tre comandi, che è __ __ __ F2in bytecode: cerchiamo tutti i prefissi di cui la somma è inferiore a qualsiasi cosa ci sia A. Quindi notdetermina se l'elenco è vuoto.
Lynn,

11

Haskell, 22 byte

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

Utilizzo: f (-5) [4,-3,-6]quali outputTrue .

Crea un elenco di totali parziali e controlla se tutti gli elementi sono> = t.

Edit: Bugfix per la lista vuota e positivi ts


@ MartinBüttner: l'iniziale 0non è nell'elenco, poiché scanl1restituisce l'elenco vuoto se alimentato con l'elenco vuoto, ma allrileva tale caso. f (-5) []ritorna True.
nimi

@ MartinBüttner: Oops, hai ragione. Perso quel caso e risolto. Grazie!
nimi

7

Python 2, 41

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

Il primo argomento è l'array; il secondo è il totale parziale minimo.


6

J, 11 byte

   */@:<:0,+/\

test

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

Miglioramento di 1 byte grazie a FUZxxl .

Spiegazione per la versione originale (*/@(<:0,+/\))

  • +/\crea una somma parziale (somma +/dei prefissi \)
  • 0,+/\ aggiunge uno 0 alla somma corrente
  • (<:0,+/\)input sul lato sinistro più piccolo o uguale <:a (elementi di del) risultato 0,+/\dell'ingresso sul lato destro
  • @ con il risultato precedente
  • */ prodotto di tutti gli elementi (1 se tutti gli elementi sono 1, 0 se un elemento è 0)

Puoi farlo */@:<:0,+/\ per un personaggio, penso.
FUZxxl

6

APL, 8 10

∧.≤∘(0,+\)

Questa è una funzione che assume Tcome argomento di sinistra e l'elenco come argomento di destra.

  • 0,+\: somma corrente dell'argomento giusto, aggiunta a uno 0
  • ∧.≤: argomento sinistro più piccolo o uguale (≤) di tutti gli elementi (∧) nell'argomento destro

Ho anche provato questo, ma "Quindi una T positiva significa che il risultato è sempre falso."
jimmy23013,

@ user23013: accidenti. bene, è stato risolto ora ma non vincerà.
marinus

4

Mathematica, 34 byte

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

Questo definisce una funzione variadica senza nome che accetta Tcome primo parametro e le transazioni come parametri rimanenti e restituisce un valore booleano:

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

Mi piace perché potrei usare ##2l'elenco piuttosto raro che "splats" tutti gli argomenti dal secondo nell'elenco. Per maggiori dettagli, vedere l'ultima sezione di questo consiglio sul golf .


4

k, 8 caratteri

Un verbo diadico che prende la soglia come primo argomento e l'elenco come secondo. Sorprendentemente, questo funziona in ogni versione di k, incluso Kona open-source.

&/~0<-\,

In k, la composizione delle funzioni è fatta semplicemente scrivendo l'una e poi l'altra, quindi possiamo dividerla per funzioni. Da destra a sinistra:

  • -\,prende le somme consecutive e le sottrae dalla soglia. (Se fè diadico, quindi si f\ (a; b; c; ...) espande a (a; a f b; (a f b) f c; ...). ,Unisce solo gli elenchi.) La rottura si verifica anche quando qualcosa è uguale a 0 e il superamento dà valori strettamente positivi.
  • ~0<non è 0 minore di. k non ha realmente un <=operatore maggiore o uguale a , quindi dobbiamo lanciare il valore booleano NOT su un valore minore di, ma questo verifica se il risultato non è positivo. Si applica automaticamente a ciascun atomo nell'elenco.
  • &/è la piega dell'AND logico su un elenco. (Per fdiadico) Quindi questo verifica se ogni valore booleano nell'elenco è True.

Esempi:

  (&/~0<-\,)[-5; 1 2 3 -20]
0
  f:&/~0<-\,  /assign to a name
  f[-5; 4 -3 -6]
1

Probabilmente aggiungerei 2 caratteri per le paratie. E puoi radere 1 carattere se lo fai~|/>+\,
tmartin

@tmartin Monadica >è "discendente sorta permutazione" così ~|/>+\,dà vero solo quando la lista di input è vuota ...
algorithmshark

Ah hai ragione, errore mio.
tmartin,


3

Pyth, 16 15

!sm>vzs+0<QdhlQ

Provalo online con l'input

-5
[4, -3, 6]

Spiegazione:

                   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(...)

E ancora una volta la stupida sfunzione spreca due byte. Penso che lo segnalerò come un bug al repository Pyth.

modifica: 13 (non valido)

Grazie a isaacg per un byte save ( >1to !) e per aver modificato l'implementazione snel repository Pyth. Ora è possibile il seguente codice (ma ovviamente non valido per questa sfida).

!sm>vzs<QdhlQ

Li uso abbastanza spesso. Vedi qui: codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/… . In questo caso risparmierebbe 2 caratteri, ma perderà 5 caratteri nell'elenco delle liste. Vedo se c'è una lettera inutilizzata per separarli in due diverse funzioni, però. Inoltre, puoi salvare un personaggio usando !invece di >1.
isaacg

@isaacg La definizione della somma di un elenco vuoto come 0 (quasi) non rompe alcun codice Pyth esistente. L'unico codice che si spezzerebbe è #sY. E grazie per il salvataggio di 1 byte.
Jakube

Immagino sia giusto: lanciare eccezioni non aiuta nessuno. Fisso.
isaacg


3

Julia, 33 byte

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

Questo crea una funzione senza nome che accetta due parametri, Te l, e restituisce un valore booleano.

La all()funzione fa tutto il sollevamento pesante qui. Ci vogliono due argomenti: un predicato e un iterabile. Per il predicato, diciamo che irappresenta il valore corrente dell'iterabile usando una funzione senza nome, specificata da i->. Quindi ad ogni iterazione confrontiamo icon l' Tutilizzo i>=T.

Per assicurarci che Julia non impazzisca sull'uso cumsum()in una lista vuota, possiamo virare su uno zero usando [0, l].


3

Preludio , 144 136 byte

Questo è stato ... difficile ...

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

Penso che 6 voci sia un nuovo record per me, anche se sono sicuro che c'è un modo per ridurlo e sbarazzarsi di quel fastidioso spazio bianco. Controllare il segno di un valore (e quindi verificare se un valore è maggiore di un altro) è abbastanza complicato in Prelude.

Input e output sono dati come valori byte. Quando si utilizza l'interprete Python , è possibile impostare NUMERIC_OUTPUT = True, in modo da ottenere effettivamente un ASCII 0o 1. Per un input numerico, dovresti aggiungere un altro NUMERIC_INPUTflag (probabilmente dovrei pubblicare il mio interprete ottimizzato ad un certo punto).

Si noti inoltre che Prelude non può davvero distinguere la fine di un elenco da un 0all'interno dell'elenco. Quindi, per consentire zero transazioni, sto leggendo T, quindi la lunghezza Ldell'elenco e quindi le Ltransazioni.


2

CJam, 18 byte

Un altro approccio negli stessi byte dell'altro.

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

Riceve input tramite STDIN sotto forma di <threshold> <array of transactions>

Provalo online qui


1
Penso che puoi usare f>:|!invece di:)f<:&
aditsu l'

2

JavaScript (ES6) 38 33

Modifica Corretto errore del saldo iniziale. Thx @martin & @rainbolt

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

Test nella 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,[]))

falso falso falso
vero vero vero
falso falso


2
Il saldo iniziale è zero. Il primo deposito è 10, ma siamo già al di sotto della nostra soglia prima che il primo deposito arrivi alla banca.
Rainbolt

2

Python 2.7 - 55 byte

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

Chiama come print f(-5,[1,2,3,-20]) . Provatelo qui .

Grazie a Jakube per l'aiuto.


2

> <>, 29 + 3 = 32 byte

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

Corri come

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

dove la soglia è il primo numero.



1

Perl 6 (21 byte)

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

È una funzione che prende l'argomento iniziale e un elenco di elementi. Funziona verificando che nessuno ( utilizzando le giunzioni ) di elementi sia inferiore alla soglia. [\+]viene utilizzato per generare la somma corrente, ad esempio [\+] 1, 2, 31, 3, 6. 0,da aggiungere 0all'inizio dell'elenco è necessario a causa del requisito che la soglia positiva dovrebbe sempre fallire.

Praticamente la stessa cosa della soluzione Haskell, proprio nella sintassi di Perl 6 (Perl 6 ha preso così tante funzioni di programmazione pulite da Haskell).


0

Perl - 20

Prendi l'elenco dei numeri STDINseparati da newline e prendi Tcon la -ibandiera.

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

+2 per -ie -nbandiere. Il valore di uscita è255 per guasti e 0successo.

Corri con:

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

0

Clojure, 45

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

Per esempio

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

O un po 'più bello;

(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 [])))))

0

Java 8 - 153 caratteri

Funzione golfizzata:

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;} 

Ungolfed:

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;
} 

Programma driver:

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));
}

}

Produzione:

bash-3.2$ javac A.java ; java A

false
false
false
above false, below true
true
true
true
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.