Pembukuan untuk Sex Bob-ombs (periksa apakah jumlah yang berjalan terlalu rendah)

15

Percaya atau tidak, Sex Bob-ombs telah menjadi band terkenal di dunia dan saat ini sedang dalam tur dunia! Sebagai pemegang buku, Anda harus mengawasi keuangan mereka sehari-hari dan memberikan laporan rutin.

Setiap beberapa minggu Anda menyusun daftar pengeluaran mereka (dalam seluruh USD ) sesuai urutan pengeluaran.

Misalnya, daftarnya

378
-95
2234

berarti bahwa $ 378 disetor ke akun mereka, dan setelah itu $ 95 ditarik, dan setelah itu $ 2234 disetor.

Anda ingin memastikan bahwa jumlah menjalankan nilai-nilai ini tidak pernah berjalan di bawah beberapa nilai ambang batas T . Anda memutuskan untuk menulis sebuah program untuk melakukan ini untuk Anda.

Tantangan

Tulis program atau fungsi yang mengambil dalam bilangan bulat tunggal T dan daftar bilangan bulat. Jika jumlah berjalan dari daftar bilangan bulat kurang dari T , maka cetak atau kembalikan nilai yang salah , cetak atau kembalikan nilai yang sebenarnya.

Anda dapat menggunakan metode input yang biasa (stdin, dari file, baris perintah, argumen berfungsi).

  • Pada awal daftar jumlah berjalan adalah 0. Jadi T positif berarti hasilnya selalu palsu.
  • + tidak akan pernah di depan bilangan bulat positif.
  • Daftar ini dapat berisi 0.
  • Daftarnya mungkin kosong.

Uji Kasus

T adalah -5 dalam semua ini.

Falsy:

-6
1
2
3
-20
200
-300
1000

Benar:

[empty list]
-5
4
-3
-6

Mencetak gol

Kiriman dengan byte paling sedikit menang. Tiebreaker pergi ke kiriman diposting paling awal.

Komentar menyesal yang memaksa saya untuk membuat ini.

Hobi Calvin
sumber
1
Test case diperlukan T = 5, L = [10]. Mungkin saya benar-benar merindukan intinya
edc65
1
@ edc65 "Pada awal daftar jumlah berjalan adalah 0. (Jadi T positif berarti hasilnya selalu palsu.)"
Martin Ender
@optimizer jangan sedih, saya dapat referensi Anda <3
undergroundmonorail
@undergroundmonorail terlambat. Dan ada tautan di sana.
Pengoptimal

Jawaban:

2

gs2 - 6 byte

Asumsikan daftar ada di atas tumpukan, dan ambangnya ada di register A. Dalam mnemonik:

inits
sum get-a lt filter3
not

Dalam bytecode:

78 64 D0 70 F2 22
Lynn
sumber
Apakah ini benar-benar fungsi yang setara di gs2? Pada dasarnya, dapatkah Anda menjustifikasi asumsi Anda sedikit lebih banyak? (Saya kemungkinan akan menerima jika Anda melakukannya.)
Calvin's Hobbies
gs2 tidak benar-benar memiliki fungsi, tetapi Anda dapat menempatkan beberapa kode dalam sebuah blok, mendorongnya di atas tumpukan, dan memanggil eval di atasnya, sama seperti di GolfScript. Jika Anda meletakkan enam byte ini dalam sebuah blok dan mengevaluasi mereka dalam situasi yang saya jelaskan, daftar di atas tumpukan akan diganti dengan jawabannya (0 untuk false, 1 untuk true). Demikian juga jika Anda baru saja mengawali kode ini dengan beberapa kode yang mendorong daftar dan menetapkan ambang batas untuk mendaftar A, Anda akan mendapatkan hasil yang benar.
Lynn
Ini bekerja dengan cara yang sangat mirip dengan solusi lain. initsseperti di Haskell: "abcd" inits["" "a" "ab" "abc" "abcd"]memberi kita semua awalan. Kemudian kita memfilter dengan "lambda" dari tiga perintah, yang ada __ __ __ F2dalam bytecode: kita mencari semua awalan yang jumlahnya kurang dari apa pun yang ada A. Kemudian nottentukan apakah daftar tersebut kosong.
Lynn
11

Haskell, 22 byte

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

Penggunaan: f (-5) [4,-3,-6]output manaTrue .

Buat daftar sub-total dan periksa apakah semua elemen>> t.

Edit: Bugfix untuk daftar kosong dan positif ts

nimi
sumber
@ MartinBüttner: Inisial 0tidak ada dalam daftar, karena scanl1mengembalikan daftar kosong jika diberi makan dengan daftar kosong, tetapi allmenangkap kasing itu. f (-5) []kembali True.
nimi
@ MartinBüttner: Ups, Anda benar. Merindukan kasing itu dan memperbaikinya. Terima kasih!
nimi
7

Python 2, 41

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

Argumen pertama adalah array; yang kedua adalah total minimum berjalan.

feersum
sumber
6

J, 11 byte

   */@:<:0,+/\

Tes

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

Peningkatan 1 byte berkat FUZxxl .

Penjelasan untuk versi aslinya (*/@(<:0,+/\))

  • +/\membuat jumlah yang berjalan (jumlah +/awalan\ )
  • 0,+/\ menambahkan 0 ke jumlah berjalan
  • (<:0,+/\)input sisi kiri lebih kecil atau sama dengan <:(elemen dari) hasil0,+/\ input sisi kanan
  • @ dengan hasil sebelumnya
  • */ produk dari semua elemen (1 jika semua elemen adalah 1, 0 jika suatu elemen adalah 0)
randomra
sumber
Anda dapat melakukannya */@:<:0,+/\ untuk satu karakter, saya pikir.
FUZxxl
6

APL, 8 10

∧.≤∘(0,+\)

Ini adalah fungsi yang mengambil Targumen kiri dan daftar sebagai argumen kanannya.

  • 0,+\: menjalankan jumlah argumen yang benar, ditambahkan ke 0
  • ∧.≤: argumen kiri lebih kecil atau sama (≤) dari semua (∧) item dalam argumen kanan
marinus
sumber
Saya juga mencoba ini tetapi, "Jadi T positif berarti hasilnya selalu palsu."
jimmy23013
@ user23013: sial. baik, sudah diperbaiki sekarang tapi tidak akan menang.
marinus
4

Mathematica, 34 byte

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

Ini mendefinisikan fungsi variadik tanpa nama yang mengambil Tsebagai parameter pertama dan transaksi sebagai parameter yang tersisa, dan mengembalikan boolean:

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

Saya suka ini karena saya bisa menggunakan yang agak jarang ##2yang "menyemprotkan" semua argumen dari yang kedua ke dalam daftar. Untuk lebih jelasnya lihat bagian terakhir di tip golf ini .

Martin Ender
sumber
4

k, 8 char

Kata kerja dyadic yang menggunakan ambang sebagai argumen pertama dan daftar sebagai yang kedua. Hebatnya, ini bekerja di setiap versi k, termasuk Kona open-source.

&/~0<-\,

Dalam k, komposisi fungsi hanya dilakukan dengan menulis satu dan kemudian yang lain, sehingga kita dapat memecahnya dengan fungsi. Dari kanan ke kiri:

  • -\,mengambil jumlah lari berturut-turut dan mengurangi mereka dari ambang batas. (Jika fbersifat diadik, kemudian f\ (a; b; c; ...) berkembang menjadi (a; a f b; (a f b) f c; ...). ,Cukup gabungkan daftar bersama-sama.) Breaking bahkan terjadi ketika sesuatu sama dengan 0, dan penarikan berlebih memberikan nilai yang benar-benar positif.
  • ~0<Bukan 0 Kurang Dari. k tidak benar-benar memiliki <=operator yang lebih besar dari atau sama dengan , jadi kita harus melempar Boolean TIDAK pada yang kurang dari, tetapi ini menguji apakah hasilnya tidak positif. Secara otomatis berlaku untuk setiap atom dalam daftar.
  • &/adalah lipatan logis DAN daftar. (Untuk fdiad) Jadi ini menguji apakah setiap boolean dalam daftar adalah Benar.

Contoh:

  (&/~0<-\,)[-5; 1 2 3 -20]
0
  f:&/~0<-\,  /assign to a name
  f[-5; 4 -3 -6]
1
algoritme hiu
sumber
Saya mungkin akan menambahkan 2 karakter untuk paranthes. Dan Anda dapat mencukur 1 char jika Anda melakukannya~|/>+\,
tmartin
@ tmartin Monadic >adalah "permutasi descending sort" jadi ~|/>+\,berikan true hanya ketika daftar input kosong ...
algorithmshark
Ah kamu benar, kesalahanku.
tmartin
3

CJam, 17 byte

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

Mengambil input sebagai integer dan larik gaya CJam di STDIN:

-5 [1 2 3 -20]

Uji di sini.

Martin Ender
sumber
3

Pyth, 16 15

!sm>vzs+0<QdhlQ

Cobalah online dengan input

-5
[4, -3, 6]

Penjelasan:

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

Dan lagi sfungsi bodoh membuang dua byte. Saya pikir saya akan melaporkan ini sebagai bug ke repo Pyth.

edit: 13 (tidak valid)

Terima kasih kepada isaacg untuk menyimpan satu byte ( >1ke !) dan untuk mengubah implementasi sdi repo Pyth. Sekarang kode berikut ini dimungkinkan (tetapi tentu saja tidak valid untuk tantangan ini).

!sm>vzs<QdhlQ
Jakube
sumber
Saya sering menggunakannya. Lihat di sini: codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/… . Ini akan menghemat 2 karakter dalam kasus ini, tetapi kehilangan 5 karakter dalam daftar kasus daftar. Saya melihat apakah ada surat yang tidak digunakan untuk memisahkan ini menjadi dua fungsi yang berbeda. Selain itu, Anda dapat menyimpan karakter dengan menggunakan !alih-alih >1.
isaacg
@isaacg Menentukan jumlah daftar kosong sebagai 0 (hampir) tidak merusak kode Pyth yang ada. Satu-satunya kode yang akan rusak adalah #sY. Dan terima kasih untuk save 1 byte.
Jakube
Saya kira itu adil - melempar pengecualian tidak membantu siapa pun. Tetap.
isaacg
3

R, 35

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

Coba di sini

MickyT
sumber
3

Julia, 33 byte

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

Ini menciptakan fungsi tanpa nama yang menerima dua parameter, Tdan l, dan mengembalikan boolean.

The all()fungsi melakukan semua angkat berat di sini. Dibutuhkan dua argumen: predikat dan iterable. Untuk predikat, kami beri tahu yang imewakili nilai saat ini dari iterable menggunakan fungsi yang tidak disebutkan namanya, ditentukan oleh i->. Kemudian pada setiap iterasi kita membandingkan ike Tmenggunakani>=T .

Untuk memastikan bahwa Julia tidak takut menggunakan cumsum()daftar kosong, kita bisa menggunakan nol di sana menggunakan [0, l].

Alex A.
sumber
3

Prelude , 144 136 byte

Ini ... sulit ...

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

Saya pikir 6 suara adalah rekor baru bagi saya, meskipun saya yakin ada cara untuk mengurangi itu dan menyingkirkan banyak ruang kosong yang mengganggu itu. Memeriksa tanda suatu nilai (dan karenanya, memeriksa apakah satu nilai lebih besar dari yang lain) cukup sulit di Prelude.

Input dan output diberikan sebagai nilai byte. Ketika Anda menggunakan interpreter Python , Anda bisa mengatur NUMERIC_OUTPUT = True, sehingga Anda benar-benar mendapatkan ASCII 0atau 1. Untuk input numerik, Anda harus menambahkan NUMERIC_INPUTflag lain (saya mungkin harus menerbitkan penerjemah tweak saya di beberapa titik).

Perhatikan juga bahwa Pendahuluan tidak dapat benar-benar membedakan akhir daftar dari 0dalam daftar. Jadi untuk memungkinkan nol transaksi, saya membaca T, lalu panjang Ldaftar, dan kemudian Ltransaksi.

Martin Ender
sumber
2

CJam, 18 byte

Pendekatan lain dalam byte yang sama dengan yang lain.

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

Mengambil input melalui STDIN dalam bentuk <threshold> <array of transactions>

Cobalah online di sini

Pengoptimal
sumber
1
Saya pikir Anda dapat menggunakan f>:|!sebagai gantinya:)f<:&
aditsu
2

JavaScript (ES6) 38 33

Edit bug keseimbangan awal diperbaiki. Thx @martin & @rainbolt

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

Uji di Firefox / konsol 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,[]))

false false false
benar benar benar
salah palsu

edc65
sumber
2
Saldo awal adalah nol. Setoran pertama adalah 10, tetapi kami sudah di bawah ambang batas kami sebelum setoran pertama sampai ke bank.
Rainbolt
2

Python 2.7 - 55 byte

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

Sebut seperti print f(-5,[1,2,3,-20]). Menguji sini .

Terima kasih kepada Jakube untuk membantu.

Rainbolt
sumber
2

> <>, 29 + 3 = 32 byte

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

Jalankan seperti

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

di mana ambangnya adalah angka pertama.

Sp3000
sumber
1

Oktaf, 27

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

Perl 6 (21 byte)

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

Ini adalah fungsi yang mengambil argumen awal, dan daftar elemen. Ini bekerja dengan memeriksa jika tidak ada ( dengan menggunakan persimpangan ) elemen di bawah ambang batas. [\+]digunakan untuk menghasilkan jumlah berjalan, misalnya [\+] 1, 2, 3memberi 1, 3, 6. 0,untuk menambahkan 0pada awal daftar diperlukan karena persyaratan bahwa ambang positif selalu harus gagal.

Hampir sama dengan solusi Haskell, hanya dalam sintaks Perl 6 (Perl 6 mengambil begitu banyak fitur pemrograman yang rapi dari Haskell).

Konrad Borowski
sumber
0

Perl - 20

Ambil daftar angka pada STDINdipisahkan oleh baris baru dan ambil Tdengan -ibendera.

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

+2 untuk -idan -nbendera. Nilai keluar adalah 255untuk kegagalan dan0 kesuksesan.

Jalankan dengan:

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

Clojure, 45

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

Misalnya

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

Atau sedikit lebih baik;

(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
sumber
0

Java 8 - 153 karakter

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

Tidak Disatukan:

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

Program pengemudi:

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

}

Keluaran:

bash-3.2$ javac A.java ; java A

false
false
false
above false, below true
true
true
true
Michael Easter
sumber