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


13

Определение

Вектор , содержащий п элементы называются мажорируют или доминировать вектор Ь с п элементами , если для всех значений K таким образом, что 1 ≤ KN , сумма первого элемента в через к - й элемент в больше чем или равно сумме элементов с первого по 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 Да, входные данные могут быть в любом формате, который не кодирует дополнительную информацию.
Дверная ручка

Будет ли приемлем массив пар?
Деннис

Ответы:


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 . Затем найдите кумулятивные суммы C и возьмите знак каждого. Сумма уникальных значений знака будет результатом. Если A > B , результат равен 1, если A < B, результат равен -1, а если нет большинства, результат равен 0.

Попробуйте онлайн.


3

Юлия, 30 байт

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

Сохранено 4 байта благодаря @Dennis!


В какой версии Юлии вы это тестировали?
Денис

К сожалению: PI думаю, что это должно работать.
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] если ни один из них не является истинным. Я надеюсь, что это нормально.

Попробуйте онлайн! (Ideone)


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, 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 (с использованием внешней библиотеки-Enumerable) (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/Enumerable

Объяснение кода: передать вектор a и b, создать глобальную функцию z. z начнет с создания массива целых чисел от 1 для подсчета длины a.length. .All проверит, что предикат верен для каждого члена, принадлежащего. Этот предикат говорит, что нужно загрузить a как перечислимое, взять подсчет этого перечислимого эквивалента текущему значению итерации того диапазона, который мы сделали, и суммировать это. Проверьте, что> = та же логика из массива "b". Итак, мы называем z в порядке (a, b) и сравниваем это с порядком (b, a) ... если мы равны, мы возвращаем 0, чтобы показать, что мажора нет. В противном случае мы возвращаем 1, если (a, b) истинно, иначе -1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.