Akun paralel (Hari 2)

10

Tantangan Diambil dengan izin dari Kontes Tantangan Kode Universitas saya


Setelah menyelesaikan studinya beberapa bulan yang lalu, Marie membuka rekening bank untuk mulai menerima pembayaran pekerjaan pertamanya di kota. Sejak itu dia telah melakukan beberapa transaksi dengannya. Pembayaran pertamanya adalah $ 1000 dolar. Dengan uang itu dia membayar untuk makan malam di mana dia mengundang orangtuanya (Makan malam biaya $ 150), kemudian, dia melakukan pembelian di supermarket terkenal ($ 80) dan pemesanan hotel untuk liburannya ($ 200). Pada akhir bulan dia menerima pembayarannya lagi (1040 dolar, sedikit lebih banyak dari bulan sebelumnya) dan sehari setelah dia menghabiskan lagi $ 70 dolar di supermarket.

Hari ini, dia menyadari bahwa jika setelah membayar $ 80 pertama di supermarket, akun kedua telah dibuat dan yang pertama dibekukan, kedua akun akan memiliki saldo yang sama persis:

1000-150-80THaitSebuahl=770-2001040-70THaitSebuahl=770

Acara itu sangat langka baginya sehingga dia ingin terus memastikan apakah pergerakan akunnya dan teman-temannya juga memiliki fitur ini atau tidak.

Tantangan

Diberikan daftar transaksi, hasilkan jumlah instance waktu di mana pemilik rekening bank dapat membuat akun kedua sehingga keduanya memiliki saldo akhir yang sama.

Contoh: [1000, -150, -80, -200, 1040, -70]

1)THaitSebuahl=01000-150-80-2001040-70THaitSebuahl=1540
2)1000THaitSebuahl=1000-150-80-2001040-70THaitSebuahl=540
3)1000-150THaitSebuahl=850-80-2001040-70THaitSebuahl=690
4)1000-150-80THaitSebuahl=770-2001040-70THaitSebuahl=770
5)1000-150-80-200THaitSebuahl=5701040-70THaitSebuahl=970
6)1000-150-80-2001040THaitSebuahl=1610-70THaitSebuahl=-70
7)1000-150-80-2001040-70THaitSebuahl=1540THaitSebuahl=0

Kasus cobaan

  • Input: 1000 -150 -80 -200 1040 -70Keluaran:1
  • Input: 100 -100Keluaran:2
  • Input: 1 2 3Keluaran:1
  • Input: 10 -20 15Keluaran:0
  • Input: 15 -15 15 -15Keluaran:3
  • Input: 1Keluaran:0

Catatan

Luis felipe De jesus Munoz
sumber
11
Setelah 6 bulan akun yang dibekukan dan baru dibuat, dilaporkan bahwa bankir Marie sekarang diinternir di sanatorium. "Kami adalah temanmu. Kamu perlu istirahat", kata mereka.
Arnauld
2
Kasus uji yang disarankan untuk satu transaksi
Veskah

Jawaban:

4

Perl 6 , 25 byte

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

Cobalah online!

Penjelasan

Kami hanya menambahkan nol ke daftar yang diberikan ( 0,|$_), membuat urutan jumlah parsial dengan [\+](yaitu urutan yang dibentuk oleh elemen pertama, jumlah dua pertama, jumlah tiga pertama dll), dan mencari ( grep) untuk setiap elemen yang persis sama dengan setengah dari status akun akhir (jumlah dari daftar yang diberikan). Akhirnya, kami menghitungnya dengan a +.

Ramillies
sumber
3

05AB1E , 11 byte

0.ø.œ2ùO€ËO

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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
Kevin Cruijssen
sumber
3

JavaScript (Node.js) , 45 byte

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

Cobalah online!

Hemat 4 byte dengan menggunakan -~o[s]. Terima kasih untuk Shaggy.

tsh
sumber
+1 untuk mengalahkan Arnauld: o
Luis felipe De jesus Munoz
45 byte
Shaggy
@LuisfelipeDejesusMunoz, Arnauld tidak (selalu) tidak terkalahkan! ;)
Shaggy
@Shaggy leading +diubah menjadi !, jadi itu bisa berfungsi untuk input [100].
tsh
Ah, tidak menyadari kami harus menangani array tunggal. Diperbaiki dengan baik.
Shaggy
2

Perl 5 -p , 42 41 byte

@NahuelFouilleul menghemat satu byte

y/ /+/;$\+=eval$'==eval$`while/^|$|\+/g}{

Cobalah online!

Xcali
sumber
y/ /+/;menghemat 1 byte
Nahuel Fouilleul
34 byte menggunakan pendekatan lain
Nahuel Fouilleul
30 byte
Nahuel Fouilleul
2

JavaScript (ES6), 52 byte

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

Cobalah online!

Berkomentar

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

Versi rekursif,  54  53 byte

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

Cobalah online!

Arnauld
sumber
Saya baru saja akan menyarankan bahwa versi 52-byte!
Shaggy
@Shaggy Ya, saya terlalu cepat membuang versi non-rekursif karena saya pikir versi rekursif bisa lebih pendek.
Arnauld
2

APL (Dyalog Unicode) , 21 byte SBCS

Fungsi awalan diam-diam anonim

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

Cobalah online!

ɩ ndices
 dari
 penghitungan transaksi

0, nol di depan

⊂(... )¨⍨ menerapkan fungsi diam-diam berikut dengan masing-masing sebagai argumen kiri dan seluruh daftar transaksi sebagai argumen benar ( argumen swap

 seluruh daftar transaksi
(... ) sebagai argumen kiri ke fungsi di bawah ini
  ¨ berlaku untuk masing-masing indeks
    dengan argumen bertukar (mis. daftar di kanan, indeks di sebelah kiri:

   jatuhkan sebanyak itu dari kiri

  1⊥ jumlah (lit. evaluasi dalam basis-1)

  (... Apakah )= (0/1) sama dengan ...

    ambil banyak transaksi dari kiri

   +/ jumlahkan mereka

+/ jumlah daftar Boolean itu untuk mendapatkan hitungan kebenaran

Adm
sumber
2

Batch, 84 byte

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

Mengambil input sebagai argumen baris perintah. Penjelasan:

@set s=%*

Gabung argumen dengan spasi.

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

Ganti spasi dengan +s dan evaluasi hasilnya. Hapus juga hitungannya.

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

Untuk setiap jumlah, kurangi dua kali lipat dari jumlah. Jika hasilnya nol, maka ini adalah kecocokan yang valid, jadi tambah hitungannya. Nol ekstra di awal memungkinkan pertandingan sebelum jumlah berapapun.

@echo %c%

Cetak hasilnya.

Neil
sumber
2

Arang , 15 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 θ              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

Sayangnya dalam Charcoal Sum([])tidak 0begitu saya harus memastikan bahwa selalu ada setidaknya satu elemen untuk dijumlahkan.

Neil
sumber
2

Python 3 , 67 58 byte

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

Cobalah online!

-9 byte terima kasih kepada @ Jangan menjadi x-triple dot

Black Owl Kai
sumber
1
Menjumlahkan bukan filtering akan menghemat 7 bytes: lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
Tn. Xcoder
sum(l[:x])*2==sum(l)menghemat 2 byte lagi.
Neil
2

R , 50 37 byte

sum(c(0,cumsum(x<-scan()))==sum(x)/2)

Cobalah online!

Kirill L.
sumber
2

MATL , 9 byte

s0GhYsE=s

Cobalah online!

Pendekatan yang sama seperti beberapa jawaban lain: tambahkan nol, dan periksa seberapa sering setengah jumlah kumulatif sama dengan jumlah total.

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
Sanchises
sumber
2

Japt -x , 14 11 byte

iT å+ ®¥nUx

Cobalah

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
Shaggy
sumber
2

PowerShell , 88 82 byte

-6 Bytes berkat mazzy

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

Cobalah online!

Ini sepertinya metode yang sangat kikuk tetapi menyelesaikan pekerjaan. Saya akan mencoba dan merubahnya di masa depan.

Veskah
sumber
1
Anda dapat menulis $i+=<predicate>sebagai gantinyaif(<predicate>){$i++}
mazzy
2

Brachylog , 9 byte

Tidak sebagus hari 1. Yang ini kalah dari Jelly

{~c₂+ᵐ=}ᶜ

Penjelasan

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

Test suite: Coba online!

Kroppeb
sumber
1

bash, 52 byte

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

TIO

Caranya: pengaturan IFS=+, "$*"memperluas ke string di mana argumen dibatasi oleh +, dalam ekspresi aritmatika eval ke jumlah

Nahuel Fouilleul
sumber
0

J , 19 byte

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

Cobalah online!

penjelasan

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