Prawie porównanie listy leksykograficznej

9

Wejście

Dwie listy Ai Bnieujemne liczby całkowite.

Wynik

Albo 1, 0albo -1, w zależności od tego, czy Ajest większy niż, równy, czy mniejszy niż Bw odniesieniu do skręconego uporządkowania leksykograficznego, jak zdefiniowano poniżej. Jeśli chcesz, możesz zastąpić 1, 0oraz -1z innymi trzema wartościami stałymi.

Skręcone uporządkowanie leksykograficzne jest podobne do zwykłego uporządkowania leksykograficznego, ponieważ porównuje listy element po elemencie i decyduje o ich kolejności przy pierwszym różnym indeksie. Jednak w wersji skręconej używamy innego porządku dla nieujemnych liczb całkowitych w każdym indeksie. Mianowicie, przy każdym indeksie i(indeksowanie zaczyna się od 1) kolejność pierwszych inieujemnych liczb całkowitych (od 0do i-1) jest odwrócona i są one przenoszone ponad wszystkie inne liczby. Ponadto „brakujący element”, który oznacza, że ​​jedna lista jest krótsza od drugiej, jest przenoszony bezpośrednio poniżej i-1. Wizualnie kolejność na indeksie ito

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

Zauważ, że pierwszy ...oznacza nieskończenie wiele liczb. Oznacza to, że następujące listy są uporządkowane rosnąco w odniesieniu do skręconego porządku leksykograficznego:

[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]

Zasady

Możesz podać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Przypadki testowe

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]
Zgarb
źródło
Czy listy wprowadzania są indeksowane od 0, od 1, czy od któregokolwiek odpowiedniego dla naszego języka?
Peter Taylor
@PeterTaylor Od 1. Wyjaśnię to.
Zgarb
Czy mogę użyć własnego wyliczenia Haskella dla wyników porównania zamiast -1/0/1 dla danych wyjściowych?
John Dvorak,
@JanDvorak Pozwolę na to i edytuję wyzwanie.
Zgarb

Odpowiedzi:

1

CJam - 57

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

Tak, to wciąż bardzo długo ...

Wypróbuj online

Krótkie wyjaśnienie:
kod zwraca 0, jeśli tablice są równe w tradycyjnym sensie, w przeciwnym razie konwertuje każdy element każdej tablicy na tablicę 2-elementową: [0 a i ], jeśli i > i (na podstawie 0), [1 niezależnie] Jeśli i brakuje i [2-a i ] Jeżeli i <i. W tym procesie krótsza tablica jest również rozszerzana do większego rozmiaru. Następnie transformowane tablice są porównywane leksykograficznie, a wynik jest korygowany do -1/1.

aditsu przestało działać, ponieważ SE jest ZŁEM
źródło
3

Python 2, 76 bajtów

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

Zastępuje to każdą liczbę całkowitą na obu listach 2-krotkami, aby uwzględnić skręcone uporządkowanie. Wbudowane w Python 2 cmpzajmuje się resztą.

Stosowanie:

>>> c([1,2,1,1,6], [1,2,1,1,7])
-1
grc
źródło
1
W jaki sposób ta lista krótszych list może przechodzić między różnymi dłuższymi listami ( [3,2,3,1341] < [3,2,3] < [3,2,3,0]?
nutki
@nutki dodaje krotkę (0,)na końcu każdej listy, która jest większa niż jakikolwiek (-1, x)i mniejsza niż (i-x, x)kiedy i-x >= 0.
grc
Och, oczywiście. Nie umiem czytać w języku Python.
nutki
1

Perl, 74

Bez dobrych funkcji manipulacji tablicami perl nie jest optymalnym narzędziem do zadania, ale działa.

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

Przetestuj mnie .

nutki
źródło
1

J, 95 bajtów

(Nie super krótkie, ale cokolwiek. Zdecydowanie do gry w golfa.)

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

Zaliczenie wszystkich przypadków testowych. (Świetny zestaw przypadków testowych! Dzięki!)

Metoda:

  • Wypełnianie krótszej listy maksymalną wartością + 1 ( m=.>:>./x,y).(],m$~>&#*-&#
  • Przekształcanie elementów listy, aby można było zastosować normalne porównanie. (|+(1+m)*0>:*)@(i.@#-~])
  • Obliczanie dwóch liczb baseX z dwóch list z wystarczającą liczbą X. ((m+#x,y)&#.)
  • Zwracanie znaku różnicy dwóch liczb.*@-&
randomra
źródło
0

Mathematica, 65

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

Stosowanie:

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

-1

alephalpha
źródło