Tài khoản song song (Ngày 2)


10

Thử thách được thực hiện với sự cho phép từ Cuộc thi Thử thách Mã trường Đại học của tôi


Sau khi hoàn thành việc học của mình vài tháng trước, Marie đã mở một tài khoản ngân hàng để bắt đầu nhận khoản thanh toán cho công việc đầu tiên của mình trong thị trấn. Kể từ đó, cô đã thực hiện một vài giao dịch với nó. Khoản thanh toán đầu tiên của cô là 1000 đô la. Với số tiền đó, cô đã trả cho một bữa tối trong đó cô mời bố mẹ (Bữa tối có giá 150 đô la), sau đó, cô đã mua hàng trong một siêu thị nổi tiếng (80 đô la) và đặt phòng khách sạn cho kỳ nghỉ của mình (200 đô la). Vào cuối tháng, cô lại nhận được khoản thanh toán của mình (1040 đô la, nhiều hơn một chút so với tháng trước) và một ngày sau khi cô chi thêm 70 đô la tại siêu thị.

Hôm nay, cô nhận ra rằng nếu sau khi trả 80 đô la đầu tiên trong siêu thị, một tài khoản thứ hai đã được tạo và tài khoản đầu tiên bị đóng băng, cả hai tài khoản sẽ có số dư chính xác như nhau:

100015080Total=770200104070Total=770

Sự kiện này rất hiếm với cô đến nỗi cô muốn tiếp tục xác định xem liệu các chuyển động của tài khoản của cô và những người bạn của cô có tính năng này hay không.

Thử thách

Đưa ra một danh sách các giao dịch, xuất ra số lượng thời gian mà chủ sở hữu của tài khoản ngân hàng có thể đã tạo một tài khoản thứ hai để cả hai có cùng số dư cuối cùng.

Ví dụ: [1000, -150, -80, -200, 1040, -70]

1)Total=0100015080200104070Total=1540
2)1000Total=100015080200104070Total=540
3)1000150Total=85080200104070Total=690
4)1000-150-80Totmộttôi= =770-2001040-70Totmộttôi= =770
5)1000-150-80-200Totmộttôi= =5701040-70Totmộttôi= =970
6)1000-150-80-2001040Totmộttôi= =1610-70Totmộttôi= =-70
7)1000-150-80-2001040-70Totmộttôi= =1540Totmộttôi= =0

Trường hợp thử nghiệm

  • Đầu vào: 1000 -150 -80 -200 1040 -70Đầu ra:1
  • Đầu vào: 100 -100Đầu ra:2
  • Đầu vào: 1 2 3Đầu ra:1
  • Đầu vào: 10 -20 15Đầu ra:0
  • Đầu vào: 15 -15 15 -15Đầu ra:3
  • Đầu vào: 1Đầu ra:0

Ghi chú

  • Bạn có thể cho rằng sẽ không có bất kỳ giao dịch nào là 0 đô la
  • Bạn có thể nhận đầu vào theo bất kỳ cách hợp lý

11
Sau 6 tháng đóng băng và các tài khoản mới được tạo, có thông tin rằng nhân viên ngân hàng của Marie hiện đang được thực tập tại một khu tập thể. "Chúng tôi là bạn của bạn. Bạn cần nghỉ ngơi một chút", họ nói.
Arnauld

2
Trường hợp thử nghiệm được đề xuất của một giao dịch duy nhất
Veskah

Câu trả lời:



4

Perl 6 , 25 byte

{+grep .sum/2,[\+] 0,|$_}

Hãy thử trực tuyến!

Giải trình

Chúng ta chỉ cần thêm một số 0 vào danh sách đã cho ( 0,|$_), tạo một chuỗi các tổng một phần với [\+](tức là chuỗi được tạo bởi phần tử đầu tiên, tổng của hai số đầu tiên, tổng của ba số đầu tiên, v.v.) và tìm ( grep) cho bất kỳ các phần tử chính xác bằng một nửa trạng thái tài khoản cuối cùng (tổng của danh sách đã cho). Cuối cùng, chúng tôi đếm chúng với a +.


3

05AB1E , 11 byte

0.ø.œ2ùO€ËO

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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 byte

a=>!a.map(v=>o[s+=v]=-~o[s],s=0,o=[1])|o[s/2]

Hãy thử trực tuyến!

Lưu 4 byte bằng cách sử dụng -~o[s]. Cảm ơn Shaggy.


+1 để đánh Arnauld: o
Luis felipe De jesus Munoz


@LuisfelipeDejesusMunoz, Arnauld không phải là (luôn luôn) không thể đánh bại! ;)
Xù xì

@Shaggy hàng đầu +được thay đổi thành !, vì vậy nó có thể hoạt động cho đầu vào [100].
tsh

Ah, không nhận ra chúng tôi phải xử lý mảng đơn. Cố định một cách độc đáo.
Xù xì


2

JavaScript (ES6), 52 byte

a=>a.map(x=>n+=(s+=x)==eval(a.join`+`)-s,n=s=0)|n+!s

Hãy thử trực tuyến!

Đã bình luận

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

Phiên bản đệ quy,  54  53 byte

f=(a,s=0)=>a+a?(s==eval(a.join`+`))+f(a,s+a.pop()):!s

Hãy thử trực tuyến!


Tôi chỉ đề nghị phiên bản 52 byte đó!
Shaggy

@Shaggy Vâng, tôi đã loại bỏ phiên bản không đệ quy quá sớm vì tôi nghĩ phiên bản đệ quy có thể ngắn hơn.
Arnauld

2

APL (Dyalog Unicode) , 21 byte SBCS

Hàm tiền tố ẩn danh

+/⊂((+/↑)=1⊥↓)¨⍨0,⍳∘≢

Hãy thử trực tuyến!

thông tin
 về
 kiểm đếm giao dịch

0, trả trước bằng không

⊂(... )¨⍨ áp dụng các chức năng ngầm sau đây với mỗi người trong số những người như lập luận trái và toàn bộ danh sách các giao dịch như là đối số bên phải ( lập luận giao dịch hoán đổi

 toàn bộ danh sách các giao dịch
(... ) như là đối số bên trái để dưới đây chức năng
  ¨ áp dụng cho mỗi người trong số các chỉ số
    với các đối số hoán đổi (danh sách tức là ở bên phải, chỉ số bên trái:

   thả rất nhiều từ bên trái

  1⊥ tổng (lit. đánh giá trong cơ sở-1)

  (... )= là nó (0/1) bằng để ...

    thực hiện nhiều giao dịch từ bên trái

   +/ tổng hợp chúng

+/ tổng hợp danh sách Boolean để có được số lượng sự thật


2

Mẻ, 84 byte

@set s=%*
@set/as=%s: =+%,c=0
@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s
@echo %c%

Đưa đầu vào làm đối số dòng lệnh. Giải trình:

@set s=%*

Tham gia các cuộc tranh luận với không gian.

@set/as=%s: =+%,c=0

Thay thế khoảng trắng bằng +s và đánh giá kết quả. Cũng xóa số đếm.

@for %%n in (0 %*)do @set/as-=%%n*2,c+=!s

Đối với mỗi số tiền, trừ hai lần từ tổng. Nếu kết quả bằng 0, thì đây là kết quả khớp hợp lệ, vì vậy hãy tăng số đếm. Số 0 thêm vào lúc bắt đầu cho phép khớp trước bất kỳ số tiền nào.

@echo %c%

In kết quả.


2

Than , 15 byte

⊞θ⁰IΣEθ⁼Σθ⊗Σ✂θκ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

 θ              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

Thật không may trong Char than Sum([])không phải 0vì vậy tôi phải đảm bảo rằng luôn có ít nhất một yếu tố để tổng hợp.


2

Python 3 , 67 58 byte

lambda l:sum(sum(l[:x])*2==sum(l)for x in range(len(l)+1))

Hãy thử trực tuyến!

-9 byte nhờ @ Đừng là dấu chấm x-triple


1
Tóm tắt thay vì lọc sẽ giúp bạn tiết kiệm 7 byte : lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
Ông Xcoder

sum(l[:x])*2==sum(l)giúp bạn tiết kiệm thêm 2 byte.
Neil


2

MATL , 9 byte

s0GhYsE=s

Hãy thử trực tuyến!

Cách tiếp cận tương tự như một số câu trả lời khác: trả trước một số 0 và kiểm tra tần suất một nửa tổng tích lũy bằng tổng số tiền.

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 byte

iT å+ ®¥nUx

Thử nó

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 byte

-6 byte nhờ mazzy

param($n)0..($x=$n.length)|%{$i+=+$z-eq($n[$_..$x]|measure -Su).sum;$z+=$n[$_]};$i

Hãy thử trực tuyến!

Đây có vẻ là một phương pháp rất vụng về nhưng nó đã hoàn thành công việc. Tôi sẽ thử và tân trang nó trong tương lai.


1
$i+=<predicate>thay vào đó bạn có thể viếtif(<predicate>){$i++}
mazzy 8/2/19


2

Brachylog , 9 byte

Không tốt như ngày 1. Cái này thua Jelly

{~c₂+ᵐ=}ᶜ

Giải trình

{      }ᶜ   # Count the ways to:
 ~c₂        #   Split the input array in 2 ...
    +ᵐ      #   so that their sums ...
      =     #   are equal

Bộ thử nghiệm: Dùng thử trực tuyến!


1

bash, 52 byte

IFS=+;for i in 0 $@;{((c+=2*(x+=i)=="$*"));};echo $c

TIO

Thủ thuật: thiết lập IFS=+, "$*"mở rộng thành một chuỗi trong đó các đối số được phân định bởi +, trong biểu thức số học được tính bằng tổng



0

J , 19 byte

1#.[:(={:-])0+/\@,]

Hãy thử trực tuyến!

giải trình

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