주변 국가


54

국가는 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  |
+----------------------+--------+

21
PPCG에 오신 것을 환영합니다! 첫 번째 질문을 축하합니다. 이거 진짜 좋아 보인다!
Mego

6
그리고 다음 차례 에 한 국가를 둘러싼 군대는 몇 명 입니까?
ThisSuitIsBlackNot

답변:


33

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)

주변을 피하는 유일한 방법은 국가의 가장 왼쪽 영토를 가장 오른쪽 영토와 동일한 순서로 정렬하는 것입니다. 두 국가가이 순서로 교체되면 한 국가는 다른 국가보다 더 왼쪽과 오른쪽에 영토가 있으므로 주변을 둘러 쌉니다.

가장 왼쪽에있는 지역 순서대로 고유 한 국가를 확보하기 위해 중복 제거하여이 순서를 유지합니다. 가장 오른쪽 영역에 대해서도 반전, 중복 제거 및 다시 반전을 통해 동일하게 수행됩니다. 이것들이 다른 결과를 낳으면 국가가 둘러싸입니다.


12

망막 , 61 60 바이트

내가 원하는 것보다 훨씬 오래

(\b(\d+)\b.* (?!\2 )(\d+) .*\b\2\b)(?!.* \3\b)(?<!\b\3 .*\1)

하나 이상의 다른 국가를 둘러싸는 국가 수를 인쇄합니다.

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

그것은 사양의 매우 간단한 구현이다 : 우리는 패턴을 찾아 A...B...A같은 B전이나 경기 후도 나타납니다.


11

파이썬, 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])

6

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접근 방식을 사용합니다 .


1
PPCG에 오신 것을 환영합니다. 이것은 매우 훌륭한 ungolfed 솔루션입니다. 나는 종종 새로운 사용자에게 사람들이 자신의 코드를 볼 수없는 (읽고 주석 처리 한) 버전을보고 싶어한다는 사실을 알려야한다. 그러나 골프 버전을 포함하는 것을 잊었습니다! 1char 변수 이름, 공백 제거 및 " int별도의 언급 이 없는 한 가정 된 변수"를 포함하여 사용할 수있는 몇 가지 트릭이 있습니다 . 알고리즘 및 구현의 경우 +1
wizzwizz4

2
아, 알 겠어요 네, 나는 이것에 익숙하지 않습니다. 약간의 지방을 제거하고 다시 시도하십시오. 충고 감사합니다.
Jason Evans

한 문자 변수 이름을 사용하여 2 바이트를 절약 할 수 있습니다. 실제로 변수를 전혀 사용하지 않고 단순히 단일 표현식으로 만들어서 더 많은 바이트를 절약 할 수 있습니다.
Doorknob

나는 당신이 생략 할 수 있다고 생각합니다 .ToArray().
Vlad

1
나는 그것이 거의 2.5 년이라는 것을 알고 있지만 82 바이트 로 골프를 줄 수 있습니다 : using System.Linq;+ n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())(Linq 가져 오기는 불행히도 필수입니다). 온라인으로 사용해보십시오. 좋은 답변, 나에게서 +1!
Kevin Cruijssen 12


4

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

Japt와 같은 소리는 가치 평등을 구현하기를 원할 수 있습니다.
isaacg

4

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.


2
함수를 사용한 65 바이트 :a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
user81655

<0 대신 ~를 사용하십시오.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ 아니요, -1이 되길 원합니다. ~와 동일합니다 >=0.
Neil

Oh wait nevermind : P
Mama Fun Roll

@ user81655 죄송합니다. 어떤 이유로 든 귀하의 의견을 전에는 알지 못했습니다. 간계, 그러나 나는 그것을 좋아한다!
Neil


1

자바, 281 자

class K{public static void main(String[]a){System.out.println(!k(a[0]).equals(new StringBuffer(k(new StringBuffer(a[0]).reverse().toString())).reverse().toString()));}static String k(String k){for(char i=49;i<58;i++){k=k.replaceFirst(""+i,""+(i-9)).replaceAll(""+i,"");}return k;}}

1

파이썬 3, 90 바이트

이 함수는 입력을 Python 목록으로 가져옵니다. 안타깝게도, 파이썬리스트는 문자열이하는 것처럼 끝에서부터 검색하는 것을 직접 지원하지는 않습니다 rindex().

def t(c):i,I=c.index,c[::-1].index;return any(i(n)<i(m)and I(n)<I(m)for m in c for n in c)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.