Chuyên ngành chưa được sắp xếp của hai danh sách


13

Định nghĩa

Một vector một chứa n yếu tố được cho là majorize hoặc thống trị một vector b với n nguyên tố khi và chỉ khi cho tất cả các giá trị k như rằng 1 ≤ kn , tổng các phần tử đầu tiên của một qua k thứ yếu tố của một lớn hơn hoặc bằng tổng các đầu tiên thông qua k thứ yếu tố của b , nơi v đại diện cho vector v sắp xếp theo thứ tự giảm dần.

Đó là,

                          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

trong đó ab được sắp xếp theo thứ tự giảm dần.

Với mục đích của thách thức này, chúng tôi sẽ sử dụng một khái quát hóa nhỏ của chuyên ngành: chúng tôi sẽ nói một danh sách là một chuyên ngành chưa được sắp xếp của một danh sách khác nếu tất cả các bất đẳng thức trên là đúng mà không cần sắp xếp ab . (Tất nhiên, điều này là vô dụng về mặt toán học, nhưng làm cho thử thách trở nên thú vị hơn.)

Thử thách

Đưa ra một đầu vào gồm hai danh sách riêng biệt ab của các số nguyên trong phạm vi từ 0 đến 255 (bao gồm), cả hai danh sách có độ dài n ≥ 1, xuất ra cho dù danh sách thứ nhất chưa được sắp xếp - chính là thứ hai ( a > b ), thứ hai không được sắp xếp chuyên ngành đầu tiên ( b > a ), hoặc không.

Bạn có thể tùy chọn yêu cầu độ dài của hai danh sách được cung cấp làm đầu vào. Đầu ra phải luôn là một trong ba giá trị riêng biệt, nhưng bản thân các giá trị có thể là bất cứ thứ gì bạn muốn (vui lòng chỉ định giá trị nào đại diện cho a > b , b > a và không có trong câu trả lời của bạn).

Các trường hợp thử nghiệm cho a > b :

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

Các trường hợp thử nghiệm cho b > a :

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

Các trường hợp thử nghiệm không có chuyên ngành:

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

Chúng ta có thể lấy một mảng 2 cột làm đầu vào không?
Luis Mendo

1
@LuisMendo Có, đầu vào có thể ở bất kỳ định dạng nào không mã hóa thông tin bổ sung.
Doorknob

Một mảng các cặp sẽ được chấp nhận?
Dennis

Câu trả lời:


6

Thạch , 10 8 6 byte

2 byte nhờ @orlp.

2 byte nhờ @Dennis.

_+\ṠQS

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

1cho a>b, -1cho a<b, 0không có chuyên ngành.

_+\ṠQS

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

Nếu có cả hai 1-1hiện tại (một số tiền tích lũy lớn hơn, một số nhỏ hơn), thì bước cuối cùng sẽ tạo ra 0.


3

ngn / apl, 11 byte

{+/∪×+\⍺-⍵}

Dựa trên phương pháp trong câu trả lời của @Leaky Nun .

Với hai danh sách MộtB , biết sự khác nhau giữa mỗi elementwise giá trị, hoặc để C = A - B . Sau đó, tìm các tổng tích lũy của C và lấy dấu của mỗi. Tổng các giá trị dấu duy nhất sẽ là kết quả. Nếu A > B , kết quả là 1, nếu A < B kết quả là -1 và nếu không có đa số thì kết quả là 0.

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


3

Julia, 30 byte

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

Đã lưu 4 byte nhờ @Dennis!


Phiên bản nào của Julia bạn đã thử nghiệm điều này?
Dennis

Rất tiếc: PI nghĩ rằng điều này sẽ làm việc.
Mama Fun Roll

1
Thật. a^b=sum(sign(cumsum(a-b))∪0)tiết kiệm một vài 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]]]

Một chức năng lambda ẩn danh. Trả về [True,False]nếu a>b, [False,True]nếu b>a, hoặc [False,False]nếu cả hai đều không đúng. Tôi hy vọng điều này là ổn.

Dùng thử trực tuyến! (Ý)


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]

Về cơ bản là một cổng của câu trả lời Jelly của tôi .

Thực tế là phạm vi bên trong hàm bị hỏng khiến không thể xác định biến bên trong hàm có nghĩa là tôi sẽ cần phải làm [xxx].map(i->yyy)[0]thay vì var a=xxx;yyy.

Đưa mảng chuyển đổi làm đầu vào.

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 byte

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

Kiểm tra nó trên Ideone .


1

Ruby, 72 59 byte

Lợi nhuận 1cho a>b, -1cho a<b, 0cho không.

-13 byte từ việc đưa ra thủ thuật tổng hợp từ @Dennis trong câu trả lời Python của họ

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

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

1

Python 2, 59 byte

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

Đầu ra:

  • 1 cho a>b
  • 2 cho b>a
  • 3 cho cả

Lặp lại thông qua danh sách, theo dõi tổng tsố chênh lệch. Số stheo dõi những dấu hiệu nào đã được xem là số hai bit r: dương ở bit phải và âm ở bit trái. Điều này xảy ra thông qua cmp(t,0)%3, mang lại

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

Lấy orgiá trị này và giá trị hiện tại của rcập nhật 2 bit với or, với các giá trị 0 không có hiệu lực.


0

Javascript (sử dụng thư viện bên ngoài - Có thể đếm được) (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)

Liên kết đến lib: https://github.com/mvegh1/Enumerable

Giải thích mã: Truyền vào vectơ a và b, tạo hàm toàn cục z. z sẽ bắt đầu bằng cách tạo một mảng các số nguyên từ 1, với số lượng a.length. .Tất cả sẽ xác minh rằng vị ngữ là đúng cho mọi thành viên thuộc a. Vị từ đó nói rằng hãy tải một dạng vô số, hãy đếm số lượng tương đương với giá trị lặp hiện tại của phạm vi mà chúng ta đã tạo và tính tổng. Kiểm tra xem> = logic tương tự từ mảng "b". Vì vậy, chúng ta gọi z theo thứ tự (a, b) và so sánh với thứ tự của (b, a) ... nếu bằng nhau, chúng ta trả về 0 để biểu thị không có chính. Mặt khác, chúng tôi trả về 1 nếu (a, b) là đúng, khác -1

nhập mô tả hình ảnh ở đây

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.