국가는 1D 세계에서 일련의 영토를 소유합니다. 각 국가는 숫자로 고유하게 식별됩니다. 영토의 소유권은 다음과 같이 목록으로 표시 될 수 있습니다.
1 1 2 2 1 3 3 2 4
우리는 한 나라의 가장 중요한 영토를 어느 한 쪽 끝에서 가장 가까운 두 영토로 정의합니다. 위의 목록이 0으로 인덱스되지 않은 경우 국가 1
의 가장 영토가 위치 0
및 에서 발생합니다 4
.
두 최첨단 영토 사이의 하위 목록에 다른 국가의 모든 영토가 포함되어 있으면 한 국가가 다른 국가를 둘러 쌉니다 . 위의 예에서 국가 2
의 최첨단 영토 사이의 하위 목록은 다음과 같습니다.
2 2 1 3 3 2
그리고 우리는 나라의 모든 영토가 나라 3
의 최첨단 영토 사이 2
에 있으므로 나라가 나라를 2
둘러싼 다는 것을 알 수 있습니다 3
.
하나의 요소 만있는 국가는 다른 요소를 절대 둘러싸 지 않습니다.
도전
어떤 형식 으로든 정수 목록을 입력으로 취하고 다른 국가로 둘러싸인 경우 참 값을, 그렇지 않으면 거짓 값을 출력합니다.
입력 목록이 비어 있지 않고 양의 정수만 포함하며 숫자를 ‘건너 뛰지 않는다’고 가정 할 수 있습니다. 예를 들어, 1 2 1 5
유효하지 않은 입력입니다.
테스트 사례
+----------------------+--------+
| Input | Output |
+----------------------+--------+
| 1 | False |
| 2 1 3 2 | True |
| 2 1 2 1 2 | True |
| 1 2 3 1 2 3 | False |
| 1 3 1 2 2 3 2 3 | True |
| 1 2 2 1 3 2 3 3 4 | False |
| 1 2 3 4 5 6 7 8 9 10 | False |
+----------------------+--------+
답변
Pyth, 7 바이트
n{Q_{_Q
n Check whether the following are not equal:
{Q The unique elements in order of first appearance
_{_Q The unique elements in order of last appearance
(done by reversing, taking unique elts, then reversing again)
주변을 피하는 유일한 방법은 국가의 가장 왼쪽 영토를 가장 오른쪽 영토와 동일한 순서로 정렬하는 것입니다. 두 국가가이 순서로 교체되면 한 국가는 다른 국가보다 더 왼쪽과 오른쪽에 영토가 있으므로 주변을 둘러 쌉니다.
가장 왼쪽에있는 지역 순서대로 고유 한 국가를 확보하기 위해 중복 제거하여이 순서를 유지합니다. 가장 오른쪽 영역에 대해서도 반전, 중복 제거 및 다시 반전을 통해 동일하게 수행됩니다. 이것들이 다른 결과를 낳으면 국가가 둘러싸입니다.
답변
망막 , 61 60 바이트
내가 원하는 것보다 훨씬 오래
(\b(\d+)\b.* (?!\2 )(\d+) .*\b\2\b)(?!.* \3\b)(?<!\b\3 .*\1)
하나 이상의 다른 국가를 둘러싸는 국가 수를 인쇄합니다.
그것은 사양의 매우 간단한 구현이다 : 우리는 패턴을 찾아 A...B...A
같은 B
전이나 경기 후도 나타납니다.
답변
파이썬, 64 바이트
lambda l,S=sorted:S(l,key=l.index)!=S(l,key=l[::-1].index)[::-1]
주변을 피하는 유일한 방법은 국가의 가장 왼쪽 영토를 가장 오른쪽 영토와 동일한 순서로 정렬하는 것입니다. 두 국가가이 순서로 교체되면 한 국가는 다른 국가보다 더 왼쪽과 오른쪽에 영토가 있으므로 주변을 둘러 쌉니다.
이 기능은 가장 왼쪽 모양과 오른쪽 모양으로 영역을 정렬하면 동일한 결과를 제공합니다. 불행히도, 파이썬리스트 rindex
는와 유사 하지 않으므로 rfind
리스트를 뒤집은 다음 정렬 된 출력을 뒤집습니다.
보조 기능과 동일한 길이 (64) :
g=lambda l:sorted(l,key=l.index)
lambda l:g(l)[::-1]!=g(l[::-1])
답변
C #, 113 바이트
public bool V(int[] n){var u1=n.Distinct();var u2=n.Reverse().Distinct().Reverse();return !u1.SequenceEqual(u2);}
언 골프 드 :
public bool ContainsSurroundedCountry(int[] numbers)
{
int[] uniqueLeftmost = numbers.Distinct().ToArray();
int[] uniqueRightmost = numbers.Reverse().Distinct().Reverse().ToArray();
return !uniqueLeftmost.SequenceEqual(uniqueRightmost);
}
간결한 LINQ
접근 방식을 사용합니다 .
답변
답변
apt, 12 바이트
Uâ ¬¦Uw â ¬w
알고리즘을 알아 낸 @xnor에게 감사합니다. 입력 배열은에 자동으로 저장되고 U
, â
uniqify, w
반전 및 ¦
입니다 !=
. ¬
빈 문자열 ( [1,2,3] => "123"
) 과 결합합니다 . JavaScript의 비교는 두 객체가 동일한 객체가 아닌 한 두 개의 배열을 동일하지 않은 것으로 계산하기 때문에 필요합니다. 예를 들어 (Japt가 아닌 JS 코드) :
var a = [1], b = [1]; alert(a==b); // false
var a = [1], b = a; alert(a==b); // true
그렇지 않은 경우 각 배열을 조인하지 않고 두 바이트를 제거 할 수 있습니다.
Uâ ¦Uw â w
답변
ES6, 76 75 65 64 바이트
a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r|i))+a)()!=f(-1)
@xnor의 답변에 대한 간단한 포트.
편집 :로 교체 a.lastIndexOf(x)==i
하여 1 바이트를 저장 했습니다 a.indexOf(x,i+1)<0
.
편집 : @ user81655 덕분에 10 바이트가 절약되었습니다.
편집 :로 교체 r||i
하여 1 바이트를 저장 했습니다 r|i
.