교차 시퀀스


11

교차 시퀀스

양의 정수 목록이 주어지면 각 요소가 이전 요소보다 크거나 같으면 증가하는 시퀀스A 라고 부릅니다 . 각 요소가 이전 요소보다 작거나 같으면이를 감소 시퀀스 라고합니다 .

일부 증가하는 시퀀스 :

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

일부 감소 시퀀스 :

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

횡단 서열 개의 이산 서브 번 증가 순서와 다른 감소 시퀀스로 분해 될 수있는리스트이다.

예를 들어 목록은 다음과 같습니다.

[3,5,2,4,1]

다음과 같이 분해 될 수 있기 때문에 교차 시퀀스입니다.

[3,    4  ]
[  5,2,  1]

[3,4]하위 시퀀스가 ​​증가하고 하위 시퀀스 [5,2,1]가 감소 하는 위치 는 어디 입니까? 우리는 이러한 한 쌍의 (증가, 감소) 하위 시퀀스를 교차 시퀀스 의 분해 라고 부릅니다 .

목록 :

[4,5,2,1,3]

교차 서열이 아니며; 하위 시퀀스를 증가 및 감소시키는 방법은 없습니다.

당신의 임무는 입력으로 양의 정수 목록을 취하는 프로그램 / 함수를 작성하는 것입니다; 교차 시퀀스 인 경우 두 목록을 분해 중 하나로 리턴하십시오. 목록이 교차 순서가 아닌 경우 일부 일관된 "거짓"값.

이것은 . 각 언어에서 가장 짧은 프로그램 / 기능이 승자입니다.

규칙 :

  • 입력이 유연합니다.
  • 일반적인 허점은 금지되어 있습니다.
  • 입력을 분해하는 여러 가지 유효한 방법이있는 경우 입력을 하나 또는 모두 출력 할 수 있습니다.
  • 분해의 출력 형식은 유연합니다. 그러나 두 서브 시퀀스의 구별에 대해서는 분명해야합니다.
  • 일관된 출력 값을 사용하여 입력이 교차 시퀀스가 ​​아님을 표시 할 수 있습니다. 교차 시퀀스의 출력과 비교할 때 모호하지 않는 한. 답에 허위 값을 지정해야합니다.

테스트 사례 :

비교 차 False순서를 나타내는 데 사용 :

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
가능한 중복 . 내가 아는 두 가지 차이점은 다른 도전 과제가 입력 길이의 다항식 시간으로 실행되어야하고 두 개의 하위 시퀀스 대신 진실한 가치를 허용한다는 것입니다 (서브 시퀀스 자체를 반환하면 20 % 보너스를받습니다). 여전히 속임수처럼 들리지만 망치지는 않을 것입니다.
Kevin Cruijssen

@KevinCruijssen 시간 제한은 아마도 이것을 속이지 않기에 충분할 것입니다.
Nick Kennedy

1
@NickKennedy 네, 아마도 망치는 것을 삼가는 이유입니다. :)
Kevin Cruijssen '

2
권장 테스트 사례 : [3, 5, 2, 4, 4, 1, 1]. 현재 테스트 사례를 사용하면 실제로 /가 되어야 할 때 >=/로 벗어날 수 있습니다 . <>=<=
Grimmy

1
@Arnauld : 그렇습니다. 어떤 값이든 가능합니다.
Chas Brown

답변:




1

자바 스크립트 (ES6),  110 (105)  104 바이트

[[decreasing], [increasing]]1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

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

어떻게?

02LL 은 입력 배열의 길이입니다.

b[0]b[1]in

1i=11i=0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

some()


1

하스켈, 84 바이트

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

유효한 모든 (decreasing,increasing)쌍 의 목록 또는 그러한 쌍이없는 경우 빈 목록을 반환합니다.

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


1

파이썬 3 , 109107 바이트

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

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

이 기능은 가능한 모든 분해를 표준 출력으로 인쇄합니다. 가능한 분해가 없으면 아무것도 인쇄되지 않습니다.

개선 제안에 대한 @Sriotchilism O'Zaic에게 감사합니다.


사이트에 오신 것을 환영합니다. 나는 바이트를 절약 s<i[-1]하기보다는 오히려 i[-1]>s 비슷한 작업을 수행하는 것이 좋습니다 d[-1]<s .
Ad Hoc Garf Hunter 1

제안 해 주셔서 감사합니다. 답변을 업데이트했습니다. 답변을 게시 할 수있는 복사 가능한 템플릿이 있습니까?
Joel

무슨 말인지 모르겠어요? TIO에는 이미 사용중인 템플릿이 있습니다.
Ad Hoc Garf Hunter 1

TIO에서만 링크를 생성하고 링크를 게시물에 추가했습니다. 거기에 템플릿을 사용하지 않았습니다. 어 Where 어?
Joel

1
@Joel-TIO 페이지 상단에는 체인 링크처럼 보이는 아이콘이 있습니다. 그것을 클릭하면 옵션 페이지가 나타납니다. 그중 하나는 '코드 골프 제출'입니다. 그것은 당신이 원하는 포맷 된 것들을 복사 버퍼에 넣을 것입니다! 또한 좋은 해결책입니다!
Chas Brown


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