Почти лексикографическое сравнение списков


9

вход

Два списка Aи Bнеотрицательных целых чисел.

Вывод

Либо 1, 0либо -1, в зависимости от того A, больше ли , равно или меньше, чем в Bотношении витого лексикографического порядка, как определено ниже. Если вы хотите, вы можете заменить 1, 0и -1с любыми другими тремя значениями постоянных.

Скрученный лексикографический порядок подобен обычному лексикографическому порядку в том, что вы сравниваете списки элемент за элементом и определяете их порядок по первому отличающемуся индексу. Однако в скрученной версии мы используем различный порядок неотрицательных целых чисел в каждом индексе. А именно, в каждом индексе i(индексация начинается с 1) порядок первых iнеотрицательных целых чисел (от 0до i-1) меняется на противоположный, и они перемещаются над всеми другими числами. Более того, «отсутствующий элемент», который означает, что один список короче другого, перемещается непосредственно ниже i-1. Визуально, заказ по индексу iявляется

i < i+1 < i+2 < i+3 < ... < [missing element] < i-1 < i-2 < i-3 < ... < 2 < 1 < 0

Обратите внимание, что первый ...обозначает бесконечно много чисел. Это означает, что следующие списки расположены в порядке возрастания относительно витого лексикографического порядка:

[3,2,3,4]
[3,2,3,5]
[3,2,3,10]
[3,2,3,1341]
[3,2,3]
[3,2,3,3]
[3,2,3,2]
[3,2,3,1]
[3,2,3,0]

правила

Вы можете дать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Тестовые случаи

Output 1:
[0] []
[] [1]
[] [1,2,1,2]
[2,1] [1,1]
[0,1,2] [0,2,1]
[3,0] [3,1]
[3,1] [3]
[2] [2,2]
[2] [2,23]
[2,24] [2,23]
[2,1] [2,23]

Output 0:
[] []
[0] [0]
[1,1] [1,1]
[2,1,2] [2,1,2]

Output -1:
[1,2,1,1,2] [1,2,1,1,1]
[1,2,1,1,5] [1,2,1,1,4]
[1,2,1,1,5] [1,2,1,1]
[1,2,1] [1,2,1,1]
[1,2,1,1,5] [1,2,1,1,6]
[1,2,1,1,6] [1,2,1,1,7]

Индексируются ли входные списки от 0, от 1 или от того, что подходит для нашего языка?
Питер Тейлор

@PeterTaylor С 1. Я проясню это.
Згарб

Могу ли я использовать собственное перечисление Haskell для сравнения результатов вместо -1/0/1 для вывода?
Джон Дворжак

@JanDvorak Я позволю это и отредактирую вызов.
Згарб

Ответы:


1

CJam - 57

q:S~=0{S~]:A:,~e>{A{_,I>{I=_I>0{W*2}?}1?[\]}%}fI]z~>2*(}?

Да, это все еще очень долго ...

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

Краткое объяснение:
Код выводит 0, если массивы равны в традиционном смысле, в противном случае он преобразует каждый элемент каждого массива в массив из 2 элементов: [0 a i ], если a i > i (на основе 0), [1 что угодно], если a i отсутствует, и [2 -a i ], если a i <= i. При этом более короткий массив также расширяется до большего размера. Затем преобразованные массивы сравниваются лексикографически и результат корректируется до -1/1.


3

Python 2, 76 байт

c=lambda*a:cmp(*[[(max(i-x,-1),x)for i,x in enumerate(L)]+[(0,)]for L in a])

Это заменяет каждое целое число в обоих списках 2-кортежем для учета витого порядка. Встроенный в Python 2 cmpделает все остальное.

Применение:

>>> c([1,2,1,1,6], [1,2,1,1,7])
-1

1
Как это объясняет укорочение списка между более длинными списками ( [3,2,3,1341] < [3,2,3] < [3,2,3,0]?
nutki

@nutki добавляет кортеж (0,)в конец каждого списка, который больше любого (-1, x)и меньше, чем (i-x, x)когда i-x >= 0.
grc

О Конечно. Я не грамотный в Python.
Nutki

1

Perl, 74

Без хороших функций манипулирования массивами Perl не является оптимальным инструментом для работы, но он работает.

#!perl -pa
$i=0,s/\d+,?/$s=sprintf"%9d",$&;$&>$i++?$s:~$s/ge for@F;$_=$F[0]cmp$F[1]

Проверь меня .


1

J, 95 байт

(Не супер-короткий, но какой угодно. Определенно пригодный для игры в гольф.)

f=.4 :0
m=.>:>./x,y
t=.(|+(1+m)*0>:*)@(i.@#-~])@(],m$~>&#*-&#)
x(t~(*@-&((m+#x,y)&#.))t)y
)

Проходя все тесты. (Отличный тестовый набор! Спасибо!)

Метод:

  • Заполнение более короткого списка maxvalue + 1 ( m=.>:>./x,y).(],m$~>&#*-&#
  • Преобразование элементов списка, чтобы можно было использовать нормальное сравнение. (|+(1+m)*0>:*)@(i.@#-~])
  • Вычисление двух чисел baseX из двух списков с достаточным X. ((m+#x,y)&#.)
  • Возврат знака разности двух чисел.*@-&

0

Математика, 65

f=-Order@@MapIndexed[If[#>Last@#2,#,a-b#]&,PadRight[{##}+1],{2}]&

Применение:

f[{1, 2, 1, 1, 6}, {1, 2, 1, 1, 7}]

-1

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