거의 사전 식 목록 비교


9

입력

두 개의 목록 AB음이 아닌 정수

산출

어느 쪽 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부터. 나는 그것을 명확히 할 것이다.
Zgarb

출력에 -1/0/1 대신 비교 결과에 Haskell의 자체 열거 형을 사용할 수 있습니까?
John Dvorak

@JanDvorak 나는 그것을 허용하고 도전을 편집합니다.
Zgarb

답변:


1

CJam-57

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

그래, 여전히 길다 ...

온라인으로 사용해보십시오

간략한 설명 :
배열은, 그렇지 않으면 2 소자 어레이 각 어레이의 각 항목을 전환 전통적인 의미에서 동일한 경우 코드 출력 0 : 0 I ] 만약 I > I (0 기), 1 어떤]는 경우 누락되고, [2 -a I ] 만약 I <= I. 이 과정에서 더 짧은 어레이도 더 큰 크기로 확장됩니다. 그런 다음 변환 된 배열을 사전 식으로 비교하고 결과를 -1/1로 조정합니다.


3

파이썬 2, 76 바이트

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

이것은 꼬인 순서를 설명하기 위해 두 목록의 각 정수를 2- 튜플로 대체합니다. 파이썬 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는 튜플이 추가 (0,)어떤보다 큰 각리스트의 끝 (-1, x)보다 적은 (i-x, x)때를 i-x >= 0.
grc

오 당연하지. 나는 파이썬에서 글을 쓰지 않습니다.
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
)

모든 테스트 사례를 통과했습니다. (좋은 테스트 케이스 세트! 감사합니다!)

방법:

  • maxvalue + 1 ( m=.>:>./x,y)로 짧은 목록을 채 웁니다 .(],m$~>&#*-&#
  • 일반 비교를 사용할 수 있도록 목록 요소 변환 (|+(1+m)*0>:*)@(i.@#-~])
  • 충분한 X로 두 목록에서 두 baseX 숫자를 계산합니다. ((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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.