Paralel hesaplar (2.Gün)


10

Üniversite Kod Yarışması Yarışmamın izniyle Alınan Zorluk


Birkaç ay önce çalışmalarını bitirdikten sonra Marie, kasabadaki ilk işinin ödemesini almaya başlamak için bir banka hesabı açtı. O zamandan beri onunla birkaç işlem yapıyor. İlk ödemesi 1000 dolardı. Bu parayla anne ve babasını davet ettiği bir akşam yemeği için ödedi (Akşam yemeği 150 dolara mal oldu), daha sonra tanınmış bir süpermarkette (80 dolar) bir satın alma ve tatilleri (200 $) için bir otel rezervasyonu yaptı. Ayın sonunda ödemesini tekrar aldı (bir önceki aydan biraz daha fazla 1040 dolar) ve ertesi gün süpermarkette 70 dolar daha harcadı.

Bugün, süpermarkette ilk 80 dolar ödendikten sonra ikinci bir hesap oluşturulduktan ve ilk hesap dondurulduysa, her iki hesabın da tamamen aynı bakiyeye sahip olacağını fark etti:

100015080Total=770200104070Total=770

Olay onun için o kadar nadirdi ki, hesabının ve arkadaşlarının hareketlerinin de bu özelliğe sahip olup olmadığını tespit etmeye devam etmek istiyor.

Meydan okuma

İşlemlerin bir listesi verildiğinde, banka hesabının sahibinin ikinci bir hesap oluşturabileceği anların sayısını, böylece her ikisinin de aynı bakiyeye sahip olmasını sağlayın.

Örnek: [1000, -150, -80, -200, 1040, -70]

1)Total=0100015080200104070Total=1540
2)1000Total=100015080200104070Total=540
3)1000150Total=85080200104070Total=690
4)100015080Total=770200104070Total=770
5)100015080200Total=570104070Total=970
6)1000150802001040Total=161070Total=70
7)100015080200104070Total=1540Total=0

Test durumu

  • Giriş: 1000 -150 -80 -200 1040 -70Çıkış:1
  • Giriş: 100 -100Çıkış:2
  • Giriş: 1 2 3Çıkış:1
  • Giriş: 10 -20 15Çıkış:0
  • Giriş: 15 -15 15 -15Çıkış:3
  • Giriş: 1Çıkış:0

notlar


11
6 aylık dondurulmuş ve yeni oluşturulan hesaplardan sonra Marie'nin bankacısının şu anda bir sanitariumda staj yaptığı bildiriliyor. "Biz arkadaşız. Biraz dinlenmen lazım" dediler.
Arnauld

2
Tek bir işlem için önerilen test örneği
Veskah

Yanıtlar:



4

Perl 6 , 25 bayt

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

Çevrimiçi deneyin!

açıklama

Sadece belirli bir liste (bir sıfır prepend 0,|$_ile kısmi toplamlarının bir dizi yapmak) [\+](yani, birinci elemanın, birinci iki toplamı, ilk üç vb toplamı ile oluşturulan dizisi) ve görünüm ( grepherhangi) nihai hesap durumunun yarısına tam olarak eşit olan öğeler (verilen listenin toplamı). Son olarak, onları bir ile sayıyoruz +.


3

05AB1E , 11 bayt

0.ø.œ2ùO€ËO

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Düğmesini kullanarak 4 bayt kaydedin -~o[s]. Shaggy sayesinde.


Arnauld'u yenmek için +1: o
Luis felipe De jesus Munoz


@LuisfelipeDejesusMunoz, Arnauld (her zaman) rakipsiz değil! ;)
Shaggy

@Shaggy lider +olarak değiştirildi !, bu yüzden giriş için çalışabilir [100].
tsh

Ah, tekli dizilerle uğraşmamız gerektiğinin farkında değildik. Güzel düzeltildi.
Shaggy


2

JavaScript (ES6), 52 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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

Özyinelemeli sürüm,  54  53 bayt

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

Çevrimiçi deneyin!


52 baytlık bir versiyonunu önermek üzereydim!
Shaggy

@Shaggy Evet, özyinelemesiz sürümü çok erken attım çünkü özyinelemeli olanın daha kısa olabileceğini düşündüm.
Arnauld

2

APL (Dyalog Unicode) , 21 bayt SBCS

Anonim zımni önek fonksiyonu

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

Çevrimiçi deneyin!

ɩ ndices
 ait
 işlemlerin taksitli

0, sıfıra ekle

⊂()¨⍨ Her biri sol argüman olarak ve tüm işlem listesini sağ argüman olarak ( takas argümanı) aşağıdaki taklit işlevini uygulayın

 tüm işlem listesi
() aşağıdaki işleve sol argüman olarak  değiştirilen bağımsız değişkenlere sahip
  ¨ her bir indekse
   (yani sağdaki liste, soldaki endeksler) uygulanır:

   o kadarını soldan bırak

  1⊥ toplam (lit. baz-1'de değerlendirme)

  ()= (0/1) eşittir…

    bu kadar çok işlemi soldan al

   +/ onları topla

+/ doğruyu saymak için Boole listesinin toplamı


2

Toplu, 84 bayt

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

Girdiyi komut satırı bağımsız değişkenleri olarak alır. Açıklama:

@set s=%*

Boşluklarla argümanlara katılın.

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

Boşlukları +s ile değiştirin ve sonucu değerlendirin. Sayıyı da temizleyin.

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

Her bir miktar için, toplamın iki katını çıkarın. Sonuç sıfırsa, bu geçerli bir eşleşmedir, bu nedenle sayımı artırın. Başlangıçtaki ekstra sıfır, herhangi bir miktardan önce bir eşleşmeye izin verir.

@echo %c%

Sonucu yazdırın.


2

Kömür , 15 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

 θ              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

Ne yazık ki Kömür Sum([])değil 0bu yüzden her zaman toplam için en az bir eleman olduğundan emin olmak zorunda.


2

Python 3 , 67 58 bayt

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

Çevrimiçi deneyin!

@ Sayesinde -9 bayt x-üçlü nokta olma


1
Yerine filtrelemenin toplarsak size 7 bayt kurtaracak: lambda l:sum(sum(l[:x])==sum(l[x:])for x in range(len(l)+1)).
Bay Xcoder

sum(l[:x])*2==sum(l)size 2 bayt daha kaydeder.
Neil


2

MATL , 9 bayt

s0GhYsE=s

Çevrimiçi deneyin!

Diğer bazı cevaplarla aynı yaklaşım: sıfırı ekleyin ve kümülatif toplamın yarısının toplam meblağa ne kadar eşit olduğunu kontrol edin.

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 bayt

iT å+ ®¥nUx

Dene

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 bayt

Mazzy sayesinde -6 bayt

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

Çevrimiçi deneyin!

Bu çok beceriksiz bir yöntem gibi gözüküyor ama işi tamamladı. Gelecekte yenileyeceğim.


1
$i+=<predicate>bunun yerine yazabilirsinizif(<predicate>){$i++}
mazzy


2

Brachylog , 9 bayt

Gün 1 kadar iyi değil. Bu Jelly için kaybeder

{~c₂+ᵐ=}ᶜ

açıklama

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

Test takımı: Çevrimiçi deneyin!


1

bash, 52 bayt

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

TIO

Trick: setting IFS=+, aritmetik ifade değerlendirmesinde "$*"argümanların sınırlandığı bir dizeye genişler+



0

J , 19 bayt

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

Çevrimiçi deneyin!

açıklama

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.