Majorisasi dua daftar yang tidak disortir

13

Definisi

Sebuah vektor yang mengandung n elemen dikatakan majorize atau mendominasi vektor b dengan n elemen IFF untuk semua nilai k sehingga 1 ≤ kn , jumlah dari elemen pertama dari sebuah melalui k th unsur sebuah lebih besar dari atau sama dengan jumlah elemen pertama hingga k dari b , di mana v mewakili vektor v yang diurutkan dalam urutan menurun.

Itu adalah,

                          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

di mana a dan b diurutkan dalam urutan menurun.

Untuk tujuan tantangan ini, kami akan menggunakan sedikit generalisasi mayorisasi: kami akan mengatakan daftar adalah mayorisasi yang tidak disortir dari yang lain jika semua ketidaksetaraan di atas benar tanpa menyortir a dan b . (Ini, tentu saja, secara matematis tidak berguna, tetapi membuat tantangan lebih menarik.)

Tantangan

Diberikan input dari dua daftar berbeda a dan b dari bilangan bulat dalam kisaran 0 hingga 255 (inklusif), kedua daftar panjang n ≥ 1, output apakah daftar pertama tidak disortir-mengambil jurusan yang kedua ( a > b ), yang kedua tidak disortir- mengambil jurusan pertama ( b > a ), atau tidak keduanya.

Anda dapat secara opsional meminta panjang dua daftar yang akan disediakan sebagai input. Outputnya harus selalu salah satu dari tiga nilai yang berbeda, tetapi nilai itu sendiri bisa berupa apa pun yang Anda inginkan (sebutkan nilai mana yang mewakili a > b , b > a , dan tidak ada dalam jawaban Anda).

Uji kasus untuk a > b :

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

Uji kasus untuk b > a :

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

Uji kasus tanpa jurusan:

[200,100] [150,250]
[3,1,4] [2,3,3]
[9,9,9,9,9,0] [8,8,8,8,8,9]
Gagang pintu
sumber
Bisakah kita mengambil array 2 kolom sebagai input?
Luis Mendo
1
@LuisMendo Ya, input mungkin dalam format apa pun yang tidak menyandikan informasi tambahan.
Gagang Pintu
Apakah array pasangan dapat diterima?
Dennis

Jawaban:

6

Jelly , 10 8 6 byte

2 byte berkat @orlp.

2 byte berkat @Dennis.

_+\ṠQS

Cobalah online!

1untuk a>b, -1untuk a<b, 0tanpa jurusan.

_+\ṠQS

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

Jika ada keduanya 1dan -1sekarang (beberapa jumlah kumulatif lebih besar, beberapa lebih kecil), maka langkah terakhir akan menghasilkan 0.

Biarawati Bocor
sumber
3

ngn / apl, 11 byte

{+/∪×+\⍺-⍵}

Berdasarkan metode dalam jawaban @ Leaky Nun .

Mengingat dua daftar A dan B , menemukan perbedaan antara setiap nilai elementwise, atau membiarkan C = A - B . Kemudian, cari jumlah kumulatif C dan ambil tanda masing-masing. Jumlah nilai tanda unik akan menjadi hasilnya. Jika A > B , hasilnya adalah 1, jika A < B hasilnya adalah -1, dan jika tidak ada mayoritas hasilnya adalah 0.

Cobalah online.

mil
sumber
3

Julia, 30 byte

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

Disimpan 4 byte berkat @Dennis!

Mama Fun Roll
sumber
Di versi Julia mana Anda menguji ini?
Dennis
Ups: PI kira ini seharusnya berhasil.
Mama Fun Roll
1
Memang. a^b=sum(sign(cumsum(a-b))∪0)menghemat beberapa byte.
Dennis
2

Python 3.5, 85 byte:

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

Fungsi lambda anonim. Mengembalikan [True,False]jika a>b, [False,True]jika b>a, atau [False,False]jika tidak ada yang benar. Saya harap ini baik-baik saja.

Cobalah secara Online! (Ideone)

R. Kap
sumber
2

Cheddar , 118 114 byte

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]

Pada dasarnya port jawaban Jelly saya .

Fakta bahwa lingkup di dalam fungsi rusak menyebabkan ketidakmampuan untuk mendefinisikan variabel di dalam fungsi berarti bahwa saya perlu melakukan [xxx].map(i->yyy)[0]alih - alih var a=xxx;yyy.

Mengambil array yang dialihkan sebagai input.

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
Biarawati Bocor
sumber
1

Python 2, 73 byte

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

Uji di Ideone .

Dennis
sumber
1

Ruby, 72 59 byte

Pengembalian 1untuk a>b, -1untuk a<b, 0untuk keduanya.

-13 byte dari cribbing the trick dari @Dennis dalam jawaban Python mereka

Cobalah online!

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

Python 2, 59 byte

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

Output:

  • 1 untuk a>b
  • 2 untuk b>a
  • 3 untuk keduanya

Iterate melalui daftar, melacak jumlah tperbedaan yang berjalan. Nomor smelacak tanda apa yang telah dilihat sebagai angka dua-bit r: positif di bit kanan dan negatif di bit kiri. Ini terjadi melalui cmp(t,0)%3, yang memberi

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

Mengambil orini dan nilai saat ini rmemperbarui 2 bit dengan or, dengan nilai nol tidak berpengaruh.

Tidak
sumber
0

Javascript (menggunakan library eksternal-Enumerable) (123 byte)

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

Tautan ke lib: https://github.com/mvegh1/Enumerable

Penjelasan kode: Lulus dalam vektor a dan b, buat fungsi global z. z akan mulai dengan membuat array bilangan bulat dari 1, untuk hitungan a.length. . Semua akan memverifikasi bahwa predikat itu benar untuk setiap anggota yang dimiliki oleh. Predikat itu mengatakan untuk memuat a sebagai enumerable, ambil hitungan enumerable yang setara dengan nilai iterasi saat ini dari rentang yang kami buat, dan jumlahkan itu. Periksa apakah itu> = logika yang sama dari array "b". Jadi, kita memanggil z dalam urutan (a, b), dan membandingkannya dengan urutan (b, a) ... jika sama kita mengembalikan 0 untuk menandakan tidak ada mayor. Kalau tidak, kita mengembalikan 1 jika (a, b) benar, kalau tidak -1

masukkan deskripsi gambar di sini

applejacks01
sumber