Неортимована мажоризація двох списків


13

Визначення

Кажуть, що вектор, що містить n елементів, мажоризує чи домінує над вектором b з n елементами iff для всіх значень k таким, що 1 ≤ kn , сума першого елемента a через k- й елемент a більша ніж або дорівнює сумі перших через k- й елементів b , де v являє собою вектор v, відсортований у низхідному порядку.

Тобто,

                          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

де a і b сортуються у порядку зменшення.

Для цілей цього виклику ми будемо використовувати невелике узагальнення мажоризації: ми скажемо, що список є несортованою мажоризацією іншого, якщо всі перераховані вище нерівності є істинними без сортування a і b . (Це, звичайно, математично марно, але робить виклик цікавішим.)

Виклик

З огляду на введення двох чітких списків a і b цілих чисел у діапазоні від 0 до 255 (включно), обидва списки довжиною n ≥ 1 виводять, чи є перший список несортованим - мажоризує другий ( a > b ), другий несортований- мажоризує перший ( b > a ), або ні один.

Ви можете необов'язково вимагати, щоб довжина двох списків була надана як вхідна інформація. Вихідні дані завжди повинні бути одним із трьох різних значень, але самі значення можуть бути будь-якими (ви, будь ласка, вкажіть, які значення представляють a > b , b > a , а ні у вашій відповіді).

Тестові приклади для a > b :

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

Тестові приклади для b > a :

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

Тестові приклади без капіталізації:

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

Чи можемо ми взяти 2-стовпецький масив як вхідний?
Луїс Мендо

1
@LuisMendo Так, вхід може бути у будь-якому форматі, що не кодує додаткову інформацію.
Doorknob

Чи буде масив пар прийнятним?
Денніс

Відповіді:


6

Желе , 10 8 6 байт

2 байти завдяки @orlp.

2 байти завдяки @Dennis.

_+\ṠQS

Спробуйте в Інтернеті!

1для a>b, -1для a<b, 0не мажоризації.

_+\ṠQS

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

Якби було і те, 1і -1теперішнє (деякі сукупні суми більше, деякі менші), то останній крок мав би результат 0.


3

ngn / apl, 11 байт

{+/∪×+\⍺-⍵}

На основі методу в @Leaky Черниці відповідь .

З огляду на два списки A і B , знайти різницю між кожним значенням поелементно, або нехай C = A - B . Потім знайдіть кумулятивні суми С і візьміть знак кожної. Сума унікальних знакових знаків буде результатом. Якщо A > B , результат дорівнює 1, якщо A < B результат -1, а якщо немає більшості, результат дорівнює 0.

Спробуйте в Інтернеті.


3

Джулія, 30 байт

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

Збережено 4 байти завдяки @Dennis!


У якій версії Юлії ви це тестували?
Денніс

На жаль, я вважаю, що це має працювати.
Mama Fun Roll

1
Справді. a^b=sum(sign(cumsum(a-b))∪0)економить кілька байт.
Денніс

2

Python 3,5, 85 байт:

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

Анонімна лямбда-функція. Повертає, [True,False]якщо a>b, [False,True]якщо b>aабо [False,False]якщо жодне з цих не відповідає дійсності. Я сподіваюся, що це нормально.

Спробуйте в Інтернеті! (Ідеон)


2

Чеддар , 118 114 байт

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]

В основному порт моєї відповіді на желе .

Той факт, що сфера дії всередині функції порушена, викликає неможливість визначити змінну внутрішню функцію, означає, що мені доведеться це робити [xxx].map(i->yyy)[0]замість var a=xxx;yyy.

Приймає транспонований масив як вхідний.

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 байти

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

Перевірте це на Ideone .



1

Python 2, 59 байт

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

Виходи:

  • 1 для a>b
  • 2 для b>a
  • 3 для жодного

Ітераціює через список, відстежуючи поточну суму tвідмінностей. Число sвідстежує, які знаки розглядаються як дворозрядне число r: позитиви в правому біті та негативи в лівому біті. Це відбувається черезcmp(t,0)%3 , що дає

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

Беручи до orуваги це та поточне значення, rоновлюються 2 біти or, при цьому нульові значення не мають ефекту.


0

Javascript (за допомогою зовнішньої бібліотеки - кількість) (123 байти)

(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: https://github.com/mvegh1/Eumerable

Пояснення коду: перейдіть у вектор a і b, створіть глобальну функцію z. z почнеться зі створення масиву цілих чисел з 1, для підрахунку довжини a.le. .Всі перевірять, що присудок відповідає кожному члену, що належить до. Цей предикат говорить, що завантажувати a як число, врахуйте це число, еквівалентне поточному значенню ітерації того діапазону, який ми створили, і підсумуйте це. Перевірте, чи це> = та сама логіка з масиву "b". Отже, ми називаємо z у порядку (a, b) і порівнюємо це з порядком (b, a) ... якщо рівним, ми повертаємо 0 для позначення немає головного. Інакше повернемо 1, якщо (a, b) вірно, інакше -1

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.