Майже лексикографічне порівняння списку


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 ] якщо i > i (на основі 0), [1 що завгодно], якщо i 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

Перл, 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
)

Проходження всіх тестових випадків. (Чудовий тестовий набір! Спасибі!)

Спосіб:

  • Заміщення коротшого списку максимальним значенням + 1 ( m=.>:>./x,y).(],m$~>&#*-&#
  • Трансформування елементів списку, щоб можна було використовувати звичайне порівняння. (|+(1+m)*0>:*)@(i.@#-~])
  • Обчислення двох базових чисел з двох списків з достатнім 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.