Sổ sách kế toán cho Bob ombs Sex (kiểm tra xem tổng tiền đang chạy có quá thấp không)


15

Dù bạn có tin hay không, Sex Bob-ombs đã trở thành một ban nhạc nổi tiếng thế giới và hiện đang trong chuyến lưu diễn thế giới! Là kế toán viên của họ, bạn phải giám sát tài chính hàng ngày của họ và cung cấp các báo cáo thường xuyên.

Cứ sau vài tuần, bạn lập một danh sách các chi phí của họ (bằng toàn bộ USD ) theo thứ tự phát sinh.

Ví dụ, danh sách

378
-95
2234

có nghĩa là $ 378 đã được gửi vào tài khoản của họ và sau đó $ 95 đã được rút và sau đó $ 2234 đã được gửi.

Bạn muốn chắc chắn rằng tổng chạy của những giá trị này không bao giờ đi dưới một số giá trị ngưỡng T . Bạn quyết định viết một chương trình để làm điều này cho bạn.

Thử thách

Viết chương trình hoặc hàm lấy một số nguyên T và danh sách các số nguyên. Nếu tổng số chạy của danh sách các số nguyên nhỏ hơn T , thì in hoặc trả về giá trị giả , nếu không thì in hoặc trả về giá trị trung thực.

Bạn có thể sử dụng bất kỳ phương thức nhập thông thường nào (stdin, từ tệp, dòng lệnh, đối số cho đến chức năng).

  • Khi bắt đầu danh sách, tổng chạy là 0. Vì vậy, T dương có nghĩa là kết quả luôn sai lệch.
  • + sẽ không bao giờ đứng trước các số nguyên dương.
  • Danh sách có thể chứa 0.
  • Danh sách có thể trống.

Các trường hợp thử nghiệm

T là -5 trong tất cả những điều này.

Giả mạo:

-6
1
2
3
-20
200
-300
1000

Sự thật:

[empty list]
-5
4
-3
-6

Chấm điểm

Việc gửi với ít byte nhất sẽ thắng. Tiebreaker đi đến trình sớm nhất được đăng.

Những bình luận đáng tiếc đã buộc tôi phải thực hiện điều này.


1
Trường hợp thử nghiệm cần T = 5, L = [10]. Có lẽ tôi đã hoàn toàn bỏ lỡ quan điểm
edc65

1
@ edc65 "Khi bắt đầu danh sách, tổng tiền chạy là 0. (Vì vậy, T dương có nghĩa là kết quả luôn bị sai lệch.)"
Martin Ender

@optimizer đừng buồn, tôi đã nhận tài liệu tham khảo của bạn <3
undergroundmonorail

@undergroundmonorail quá muộn. Và có một liên kết trong đó.
Tối ưu hóa

Câu trả lời:


2

gs2 - 6 byte

Giả sử danh sách nằm trên cùng của ngăn xếp và ngưỡng nằm trong thanh ghi A. Trong phần ghi nhớ:

inits
sum get-a lt filter3
not

Trong mã byte:

78 64 D0 70 F2 22

Đây thực sự là chức năng tương đương trong gs2? Về cơ bản, bạn có thể biện minh cho các giả định của mình hơn một chút không? (Tôi có thể sẽ chấp nhận nếu bạn làm như vậy.)
Sở thích của Calvin

gs2 không thực sự có chức năng, nhưng bạn có thể đặt một số mã vào một khối, đẩy nó lên trên ngăn xếp và gọi eval trên đó, giống như trong GolfScript. Nếu bạn đặt sáu byte này trong một khối và đánh giá chúng trong tình huống tôi đã mô tả, danh sách trên cùng của ngăn xếp sẽ được thay thế bằng câu trả lời (0 cho sai, 1 cho đúng). Tương tự như vậy, nếu bạn chỉ tiền tố mã này với một số mã đẩy danh sách và gán ngưỡng để đăng ký A, bạn sẽ nhận được kết quả chính xác.
Lynn

Nó hoạt động theo một cách khá giống như các giải pháp khác. initsgiống như trong Haskell: "abcd" inits["" "a" "ab" "abc" "abcd"]lấy cho chúng ta tất cả các tiền tố. Sau đó, chúng tôi lọc với một "lambda" gồm ba lệnh, đó là __ __ __ F2mã byte: chúng tôi tìm tất cả các tiền tố trong đó tổng nhỏ hơn bất kỳ thứ gì trong đó A. Sau đó notxác định xem danh sách có trống không.
Lynn

11

Haskell, 22 byte

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

Cách sử dụng: f (-5) [4,-3,-6]đầu ra nào True.

Lập danh sách các tổng phụ và kiểm tra xem tất cả các phần tử có> = t.

Chỉnh sửa: Sửa lỗi cho danh sách trống và ts dương


@ MartinBüttner: Tên ban đầu 0không có trong danh sách, vì scanl1trả về danh sách trống nếu được cung cấp với danh sách trống, nhưng allbắt được trường hợp đó. f (-5) []trả lại True.
nimi

@ MartinBüttner: Rất tiếc, bạn đã đúng. Bỏ lỡ trường hợp đó và sửa nó. Cảm ơn!
nimi

7

Con trăn 2, 41

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

Đối số đầu tiên là mảng; thứ hai là tổng số chạy tối thiểu.


6

J, 11 byte

   */@:<:0,+/\

Xét nghiệm

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

Cải thiện 1 byte nhờ FUZxxl .

Giải thích cho phiên bản gốc (*/@(<:0,+/\))

  • +/\tạo ra một tổng chạy (tổng +/tiền tố \)
  • 0,+/\ nối 0 vào tổng chạy
  • (<:0,+/\)đầu vào bên trái nhỏ hơn hoặc bằng <:(phần tử của) kết quả của 0,+/\đầu vào bên phải
  • @ với kết quả trước đó
  • */ tích của tất cả các phần tử (1 nếu tất cả các phần tử là 1, 0 nếu một phần tử bằng 0)

Bạn có thể làm */@:<:0,+/\ cho một nhân vật tôi nghĩ.
FUZxxl

6

APL, 8 10

∧.≤∘(0,+\)

Đây là một hàm lấy Tđối số bên trái của nó và danh sách làm đối số bên phải của nó.

  • 0,+\: chạy tổng của đối số đúng, được thêm vào 0
  • ∧.≤: đối số bên trái nhỏ hơn hoặc bằng (≤) so với tất cả các mục (∧) trong đối số bên phải

Tôi cũng đã thử điều này nhưng, "Vì vậy, một chữ T dương có nghĩa là kết quả luôn sai lệch."
jimmy23013

@ user23013: chết tiệt. tốt, nó đã được sửa bây giờ nhưng nó sẽ không thắng.
bến tàu

4

Toán học, 34 byte

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

Điều này xác định một hàm matrixdic không tên được lấy Tlàm tham số đầu tiên và các giao dịch làm các tham số còn lại và trả về một boolean:

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

Tôi thích điều này bởi vì tôi có thể sử dụng cái khá hiếm ##2mà "lách" tất cả các đối số từ thứ hai vào danh sách. Để biết thêm chi tiết, xem phần cuối cùng trong mẹo chơi gôn này .


4

k, 8 char

Một động từ dyadic lấy ngưỡng làm đối số đầu tiên và danh sách làm đối số thứ hai. Đáng chú ý, điều này hoạt động trong mọi phiên bản của k, bao gồm cả Kona nguồn mở.

&/~0<-\,

Trong k, thành phần của các hàm chỉ được thực hiện bằng cách viết cái này rồi cái kia, vì vậy chúng ta có thể phá vỡ cái này bằng các hàm. Từ phải qua trái:

  • -\,mất các khoản tiền liên tiếp và trừ chúng khỏi ngưỡng. (Nếu flà dyadic, sau đó f\ (a; b; c; ...) mở rộng thành (a; a f b; (a f b) f c; ...). ,Chỉ cần nối các danh sách lại với nhau.) Sự phá vỡ thậm chí xảy ra khi một cái gì đó bằng 0 và rút tiền mang lại giá trị tích cực nghiêm ngặt.
  • ~0<không phải là 0 ít hơn. k thực sự không có toán tử lớn hơn hoặc bằng với <=toán tử, vì vậy chúng ta phải ném boolean KHÔNG trên ít hơn, nhưng điều này kiểm tra xem kết quả có phải là không có chủ đích hay không. Nó tự động áp dụng cho từng nguyên tử trong danh sách.
  • &/là nếp gấp logic VÀ trên một danh sách. (Đối với fdyadic) Vì vậy, điều này kiểm tra xem mọi boolean trong danh sách là True.

Ví dụ:

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

Có lẽ tôi sẽ thêm 2 ký tự cho các dấu phẩy. Và bạn có thể tắt 1 char nếu bạn làm thế~|/>+\,
tmartin 5/03/2015

@tmartin Monadic >là "hoán vị sắp xếp giảm dần" vì vậy ~|/>+\,chỉ đúng khi danh sách đầu vào trống ...
thuật toán đánh dấu

Ah bạn nói đúng, lỗi của tôi.
tmartin 6/03/2015


3

Bình thường, 16 15

!sm>vzs+0<QdhlQ

Dùng thử trực tuyến với đầu vào

-5
[4, -3, 6]

Giải trình:

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

Và một lần nữa shàm ngu ngốc lãng phí hai byte. Tôi nghĩ rằng tôi sẽ báo cáo đây là một lỗi cho repo Pyth.

chỉnh sửa: 13 (không hợp lệ)

Cảm ơn isaacg cho một byte lưu ( >1đến !) và để thay đổi việc thực hiện strong repo Pyth. Bây giờ mã sau đây là có thể (nhưng tất nhiên không hợp lệ cho thử thách này).

!sm>vzs<QdhlQ

Tôi sử dụng chúng khá thường xuyên. Xem tại đây: codegolf.stackexchange.com/questions/45264/fill-in-the-blanks/ . Nó sẽ lưu 2 ký tự trong trường hợp này, nhưng mất 5 ký tự trong danh sách các trường hợp danh sách. Tuy nhiên, tôi thấy nếu có một lá thư chưa sử dụng để tách chúng thành hai chức năng khác nhau. Ngoài ra, bạn có thể lưu một ký tự bằng cách sử dụng !thay vì >1.
isaacg

@isaacg Xác định tổng của một danh sách trống là 0 (gần như) không phá vỡ bất kỳ mã Pyth hiện có nào. Mã duy nhất nó sẽ phá vỡ là #sY. Và cảm ơn vì đã tiết kiệm 1 byte.
Jakube

Tôi cho rằng điều đó công bằng - ném ngoại lệ không giúp được ai. Đã sửa.
isaacg


3

Julia, 33 byte

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

Điều này tạo ra một hàm không tên, chấp nhận hai tham số, Tl , và trả về một boolean.

Các all() chức năng làm tất cả các nâng nặng ở đây. Phải có hai đối số: một vị ngữ và một lần lặp. Đối với vị từ, chúng ta nói với nó iđại diện cho giá trị hiện tại của lần lặp bằng cách sử dụng hàm không tên, được chỉ định bởi i->. Sau đó, ở mỗi lần lặp, chúng ta so sánh ivớiT việc sử dụngi>=T .

Để chắc chắn rằng Julia không sợ hãi về việc sử dụng cumsum() trong danh sách trống, chúng ta có thể giải quyết số 0 trên đó bằng cách sử dụng[0, l] .


3

Mở đầu , 144 136 byte

Điều này thật ... khó ...

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

Tôi nghĩ rằng 6 giọng nói là một kỷ lục mới đối với tôi, mặc dù tôi chắc chắn có cách để giảm bớt điều đó và loại bỏ rất nhiều khoảng trắng phiền phức đó. Kiểm tra dấu hiệu của một giá trị (và do đó, kiểm tra xem một giá trị này có lớn hơn giá trị khác hay không) khá khó khăn trong Prelude.

Đầu vào và đầu ra được đưa ra dưới dạng giá trị byte. Khi bạn sử dụng trình thông dịch Python , bạn có thể đặt NUMERIC_OUTPUT = True, để bạn thực sự có được ASCII 0hoặc1 . Đối với đầu vào số, bạn phải thêm một đầu vào khácNUMERIC_INPUT cờ (có lẽ tôi nên xuất bản trình thông dịch đã điều chỉnh của mình tại một số điểm).

Cũng lưu ý rằng Prelude thực sự không thể phân biệt cuối danh sách với danh sách 0trong danh sách. Vì vậy, để cho phép giao dịch bằng 0, tôi đang đọc T, sau đó là độ dài Lcủa danh sách và sau đó là Lgiao dịch.



2

JavaScript (ES6) 38 33

Chỉnh sửa lỗi số dư ban đầu. Thx @martin & @rainbolt

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

Kiểm tra trong bảng điều khiển 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,[]))

sai sai sai
đúng đúng đúng
sai sai sai


2
Số dư ban đầu bằng không. Khoản tiền gửi đầu tiên là 10, nhưng chúng tôi đã ở dưới ngưỡng của chúng tôi trước khi khoản tiền gửi đầu tiên được gửi đến ngân hàng.
Rainbolt

2

Python 2.7 - 55 byte

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

Gọi như thế print f(-5,[1,2,3,-20]). Kiểm tra nó ở đây .

Cảm ơn Jakube đã giúp đỡ.


2

> <>, 29 + 3 = 32 byte

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

Chạy như

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

trong đó ngưỡng là số đầu tiên.



1

Perl 6 (21 byte)

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

Đây là một hàm lấy đối số ban đầu và danh sách các phần tử. Nó hoạt động bằng cách kiểm tra nếu không ( bằng cách sử dụng các mối nối ) của các phần tử nằm dưới ngưỡng. [\+]được sử dụng để tạo tổng chạy, ví dụ [\+] 1, 2, 3cho 1, 3, 6. 0,để nối 0vào đầu danh sách là cần thiết vì yêu cầu rằng ngưỡng tích cực luôn luôn phải thất bại.

Khá giống với giải pháp Haskell, chỉ trong cú pháp Perl 6 (Perl 6 có rất nhiều tính năng lập trình gọn gàng từ Haskell).


0

Perl - 20

Lấy danh sách các số được phân STDINtách bằng các dòng mới và mang Ttheo -icờ.

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

+2 cho -i-ncờ. Giá trị thoát là 255cho thất bại và 0thành công.

Chạy với:

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

0

Clojure, 45

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

Ví dụ

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

Hoặc một lil 'đẹp hơn;

(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 ký tự

Chức năng đánh gôn:

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

Ung dung:

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

Chương trình lái xe:

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

}

Đầu ra:

bash-3.2$ javac A.java ; java A

false
false
false
above false, below true
true
true
true
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.