İki listenin ayrıştırılmamış özeti


13

Tanım

Bir vektör, bir ihtiva eden n elemanları söylenir majorize veya hakim bir vektör b ile n tüm değerler için IFF elemanları k şekilde 1 ≤ kn , birinci elemanın toplamı bir yoluyla k inci elemanı bir büyüktür veya daha üzerinden ilk toplamına eşit k unsurları inci b , hac vektörü temsil eder v azalan sırayla dizildi.

Yani,

                          a_1 >= b_1
                    a_1 + a_2 >= b_1 + b_2
              a_1 + a_2 + a_3 >= b_1 + b_2 + b_3
                              ...
      a_1 + a_2 + ... + a_n-1 >= b_1 + b_2 + ... + b_n-1
a_1 + a_2 + ... + a_n-1 + a_n >= b_1 + b_2 + ... + b_n-1 + b_n

burada a ve b azalan sırada sıralanır.

Bu zorluğun amacı için, büyük bir genelleme genellemesi kullanacağız: a ve b'yi sıralamaksızın yukarıdaki eşitsizliklerin tümü doğruysa bir listenin diğerinin ayrıştırılmamış bir büyükelleşmesi olduğunu söyleyeceğiz . (Bu, elbette, matematiksel olarak işe yaramaz, ancak meydan okumayı daha ilginç hale getirir.)

Meydan okuma

0 ila 255 (dahil) aralığındaki iki tam liste a ve b tamsayısının bir girişi verildiğinde , her iki n ≥ 1 uzunluk listesi de birinci listenin sıralanmamış-ikinciyi ( a > b ), ikinci sıralanmamış- ilki ( b > a ) ' yı belli eder veya hiçbirini.

İsteğe bağlı olarak, giriş olarak iki listenin uzunluğunun girilmesini isteyebilirsiniz. Çıktı her zaman üç ayrı değerden biri olmalıdır, ancak değerlerin kendileri ne olursa olsun olabilir (lütfen hangi değerlerin a > b , b > a ve hangisinin cevabınızı temsil etmediğini belirtin ).

A > b için test senaryoları :

[255] [254]
[3,2,1] [3,1,2]
[6,1,5,2,7] [2,5,4,3,7]

B > a için test senaryoları :

[9,1] [10,0]
[6,5,4] [7,6,5]
[0,1,1,2,1,2] [0,1,2,1,2,1]

Majorizasyon için test örnekleri:

[200,100] [150,250]
[3,1,4] [2,3,3]
[9,9,9,9,9,0] [8,8,8,8,8,9]

Giriş olarak 2 sütunlu bir dizi alabilir miyiz?
Luis Mendo

1
@LuisMendo Evet, giriş fazladan bilgileri kodlamayan herhangi bir biçimde olabilir.
Kapı tokmağı

Bir çift çifti kabul edilebilir mi?
Dennis

Yanıtlar:


6

Jöle , 10 8 6 bayt

@Orlp sayesinde 2 bayt.

@Dennis sayesinde 2 bayt.

_+\ṠQS

Çevrimiçi deneyin!

1için a>b, -1için a<b, 0hiçbir majorlaştırma için.

_+\ṠQS

_       Difference (vectorized)
 +\     Cumulative sum.
   Ṡ    Sign of every difference
    Q   Deduplicate
     S  Sum

Her ikisi de 1ve -1mevcut olsaydı (bazı kümülatif toplamlar daha büyük, bazıları daha küçük), o zaman son adım üretecekti 0.


3

ngn / apl, 11 bayt

{+/∪×+\⍺-⍵}

@Leaky Nun en yönteme dayanarak cevap .

İki A ve B listesi verildiğinde , her bir değer arasındaki farkı öğe olarak bulun veya C = A - B olsun . Ardından, C'nin toplamlarını bulun ve her birinin işaretini alın. Benzersiz işaret değerlerinin toplamı sonuç olacaktır. Eğer bir > B ise, sonuç 1 olduğu bir < B sonucu -1 ve çoğunluk varsa sonuç 0'dır.

Çevrimiçi deneyin.


3

Julia, 30 bayt

a^b=sum(sign(cumsum(a-b))∪0)

@Dennis sayesinde 4 bayt tasarruf edildi!


Julia'nın hangi versiyonunda bunu test ettin?
Dennis

Hata: PI bunun işe yarayacağını düşünüyorum.
Mama Fun Roll

1
Aslında. a^b=sum(sign(cumsum(a-b))∪0)birkaç bayt kaydeder.
Dennis

2

Python 3,5, 85 bayt:

lambda*e:[all(sum(g[:k])>=sum(h[:k])for k in range(1,-~len(h)))for g,h in[e,e[::-1]]]

Anonim bir lambda işlevi. İade [True,False]durumunda a>b, [False,True]eğer b>a, ya [False,False]bu ikisi de doğruysa. Umarım bu iyidir.

Çevrimiçi Deneyin! (Ideone)


2

Cheddar , 118 114 bayt

n->[n.map(i->i[0]-i[1]).map((j,k,l)->l.slice(0,k+1).sum).map(i->i>0?1:i<0?-1:0)].map(j->j has 1?j has-1?0:1:-1)[0]

Temelde Jelly cevabımın bir limanı .

İç fonksiyonun kapsamının kırılması, iç fonksiyonun değişkenini tanımlayamamasına neden olmak [xxx].map(i->yyy)[0]yerine bunun yerine yapmam gerektiği anlamına gelir var a=xxx;yyy.

Aktarılan diziyi girdi olarak alır.

n->[n
.map(i->i[0]-i[1])                     Difference (vectorized)
.map((j,k,l)->l.slice(0,k+1).sum)      Cumulative sum.
.map(i->i>0?1:i<0?-1:0)]               Sign of every difference
.map(j->j has 1?j has-1?0:1:-1)[0]     Deduplicate and Sum

1

Python 2, 73 bayt

a,=b,=r={0}
for x,y in zip(*input()):a+=x;b+=y;r|={cmp(a,b)}
print sum(r)

Ideone üzerinde test edin .


1

Yakut, 72 59 bayt

Hiçbiri 1için a>b, -1için a<b, döndürür 0.

Python cevabında @Dennis'in toplam hilesini toplayan -13 bayt

Çevrimiçi deneyin!

->a,b{x=y=0;a.zip(b).map{|i,j|(x+=i)<=>y+=j}.uniq.inject:+}

1

Python 2, 59 bayt

t=r=0
for x,y in zip(*input()):t+=x-y;r|=cmp(t,0)%3
print r

Çıktılar:

  • 1 için a>b
  • 2 için b>a
  • 3 ikisi için de

tFarklılıkların çalışma toplamını takip ederek liste boyunca yinelenir . Sayı, shangi işaretlerin iki bitlik bir sayı olarak görüldüğünü izler r: sağ bitte pozitifler ve sol bitte negatifler. Bu cmp(t,0)%3, üzerinden gerçekleşir ,

  • t>0+1→ 1
  • t==00 → 0
  • t<0-1→ 2

Bunu ve güncellemelerin orgeçerli değerini r2 bit ile orbirlikte alarak sıfır değerlerinin hiçbir etkisi yoktur.


0

Javascript (harici kütüphane-Numaralandırılabilir kullanılarak) (123 bayt)

(a,b)=>(z=(c,d)=>_.Range(1,c.length).All(x=>_.From(c).Take(x).Sum()>=_.From(d).Take(x).Sum()))(a,b)==z(b,a)?0:(z(a,b)?1:-1)

Lib bağlantısı: https://github.com/mvegh1/Enumerable

Kod açıklaması: a ve b vektörünü geçirin, global fonksiyon z'yi yaratın. z, bir uzunluk uzunluğu için 1'den bir tamsayılar dizisi oluşturarak başlayacaktır. Tümü, yüklemin a'ya ait her üye için doğru olduğunu doğrulayacaktır. Bu yüklem, bir numaralandırılabilir olarak yüklendiğini, yaptığımız aralığın mevcut yineleme değerine bu numaralandırılabilir eşdeğerin bir miktarını aldığını ve bunu özetlediğini söylüyor. Bunun = = "b" dizisindeki aynı mantığın olup olmadığını kontrol edin. Yani, z'yi (a, b) sırasıyla çağırırız ve bunu (b, a) sırasıyla karşılaştırırız ... eşit olursa, büyük olmadığını belirtmek için 0 döndürür. Aksi takdirde, (a, b) doğruysa 1 döndürür, başka -1

resim açıklamasını buraya girin

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.