숫자의 안전


22

양의 정수의 주기적 시퀀스가 ​​시퀀스에서 n발생하는 모든 정수 에 대해 n두 개의 연속 발생 사이에 다른 정수를 넘지 않는 특성을 갖는지 판별하는 프로그램을 작성하십시오 n.

예를 들어, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...연속 발생의 모든 쌍 :이 속성을 가지고 2같은 그들 사이의 가장 두 정수 (에서 가지고 2, 3, 5, 22, 3, 6, 2, 연속 발생의 모든 쌍 3이 그들 사이의 가장 세 정수에서, 그리고에 같은 56.

그러나이 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...속성이 없습니다. 두 개의 연속 발생 4, 즉 4, 2, 3, 5, 2, 3, 4사이에 정수가 4 개 이상 있습니다.

입력 : 양의 정수의 주기적 시퀀스를 합리적으로 표현합니다. 예를 들어,와 같은 유한 목록 {2, 3, 5, 2, 3, 6}2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...위 의 첫 번째 무한 시퀀스를 나타낼 수 있습니다 . (그 문제에 대해, 무한주기리스트 대신에 랩핑되는 유한리스트에 대해 문제점이 언급 될 수 있습니다.)

출력 : 진실 / 거짓 값.

참신한 예 :

{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}

잘못된 예 :

{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}

이것은 이므로 가장 짧은 코드가 승리합니다. 모든 언어로 답변을 권장합니다.


입력 목록에 항상 하나 이상의 요소가 포함되어 있습니까?
nimi

2
그렇지 않으면 @nimi는 무한주기 시퀀스를 나타내지 않습니다.
Martin Ender

1
thue-morse 시퀀스를 취하고 각 항에 1보다 큰 고정 양의 정수를 추가하면이 속성을 가진 비 주기적 무한 시퀀스가됩니다.
SuperJedi224

답변:


7

하스켈, 60 57 56 55 바이트

f(a:b)=b==[]||length(fst$span(/=a)b)<=a&&f b
g x=f$x++x

입력 목록에 하나 이상의 요소가 포함되어 있다고 가정합니다.

사용 예 : g [1]-> True. 온라인으로 사용해보십시오!

a목록의 머리와 b꼬리를 보자 . 결과는 True경우에 b비어 있거나의 시작 소자의 수 b와 동일하지 않은 즉, a보다 크지 a그리고 재귀 호출이 f b또한 True다른, False. 입력 목록의 두 배로 시작하십시오.

편집 : @ 레오는 3 바이트를 저장했습니다. 감사!

편집 2 : @Laikoni는 1 바이트를 저장했습니다. 감사!


span 대신 takeWhile을 사용하면 패턴 일치를 피하고 3 바이트를 절약 할 수 있습니다 . :)
Leo

@ 레오 : 좋은 캐치! 일반적으로 사용하는 것이을 사용하는 span것보다 짧 takeWhile으므로 전혀 보지 않았습니다.
nimi

takeWhile거의 항상 fst$span또는 로 단축되어 fst.span다른 바이트를 절약 할 수 있습니다 .
Laikoni

@Laikoni : 물론입니다! 감사!
nimi

Love haskell;)
theonlygusti

6

파이썬 , 57 56 바이트

데니스 -1 바이트에 감사 (대체 i+1:i+v+2i:i-~vi에서 오프셋 1 enumerate)

lambda a:all(v in(a+a)[i:i-~v]for i,v in enumerate(a,1))

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

이름 기능리스트를 가지고 a, 각 값, 즉 시험 조건 v, 표시 in의 연결에 오른쪽에 해당 슬라이스 a, 자체 (a+a)[i:i-~v]의 1 기반의 인덱스 v에은 a, i에 의해 제공된다 enumerate(a,1).


1
이는 8 바이트 젤리 답변에 영감을주었습니다. :) 이와 같이 바이트를 저장할 수 있습니다 .
Dennis

6

자바 스크립트 (ES6), 67 65 55 54 51 49 바이트

@ETHproductions 덕분에 3B 절약 및 @Arnauld 덕분에 2B 절약

a=>!a.some((b,c)=>a.concat(a).indexOf(b,++c)>b+c)

설명

이것은 배열 a을 입력으로 받는 함수를 정의합니다 . 그런 다음 .some메소드는 해당 배열을 반복하여 모든 요소에 대해 다른 함수를 실행합니다.

이 내부 함수는 두 개의 인수 bc현재 값과 색인을 사용합니다. 이 함수는 index에서 시작하여 현재 값의 인덱스를 찾습니다 c + 1. 그런 다음이 색인이 현재 값과 현재 색인보다 큰지 확인합니다 (동일한 값의 두 발생 간의 차이가보다 큼 b). 이것은 우리가 원하는 것과 정확히 반대되는 것을 반환합니다.

이 반환 값 중 하나가 true인 경우 .some함수도 반환 true됩니다. 검사 중 어느 것도 반환하지 않는 경우 true.some함수가 반환을 false. 다시 한번 우리가 반환하고자하는 값의 반대이므로,이 결과는 무시되고 반환됩니다.

그것을 테스트

여기에서 모든 테스트 사례를 시도하십시오.

let f=
a=>!a.some((b,c)=>a.concat(a).indexOf(b,++c)>b+c)

let truthy = [[1], [8, 9], [2, 3, 4], [5, 5, 3, 3, 6], [2, 3, 5, 2, 3, 6], [6, 7, 3, 5, 3, 7], [9, 4, 6, 7, 4, 5], [1, 1, 1, 1, 1, 100, 1], [1, 9, 1, 8, 1, 7, 1, 11]];
let falsy  = [[1, 2, 3], [2, 3, 9, 5], [3, 5, 4, 4, 6], [2, 3, 5, 2, 3, 4], [3, 5, 7, 5, 9, 3, 7], [5, 6, 7, 8, 9, 10, 11], [1, 9, 1, 8, 1, 6, 1, 11]];

console.log("Truthy test cases:");
for (let test of truthy) {
    console.log(`${test}: ${f(test)}`);
}

console.log("Falsy test cases:");
for (let test of falsy) {
    console.log(`${test}: ${f(test)}`);
}


아주 좋은 점이 바로 그것입니다 .shift().a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
ETHproductions

Hehe, 훌륭한 골퍼들도 똑같이 생각합니다 ;-). 시프트도 사용하려고 생각했지만 더 길어 졌기 때문에 사용하지 않았습니다. 이중 배열을 한 번 만들고 매번 이동하는 것은 정말 영리합니다. 감사!
Luke

시겠습니까 a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)일?
Arnauld

그렇습니다. 감사!
Luke

4

젤리 , 11 바이트

ṣZL
;çЀ<‘P

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

작동 원리

;çЀ<‘P  Main link. Argument: A (array)

;        Concatenate A with itself.
 çD€     For each n in A, call the helper with left arg. A + A and right arg. n.
     ‘   Increment all integers in A.
    <    Perform element-wise comparison of the results to both sides.
      P  Take the product of the resulting Booleans.


ṣZL      Helper link. Left argument: A. Right argument: n

ṣ        Split A at all occurrences of n.
 Z       Zip to transpose rows and columns.
  L      Length; yield the number of rows, which is equal to the number of columns
         of the input to Z.

3

젤리 , 8 바이트

ṙJḣ"‘Œpċ

@JonathanAllan 의 Python answer에 의해 시작되었습니다 .

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

작동 원리

ṙJḣ"‘Œpċ  Main link. Argument: A (array)

 J        Yield the indicies of A, i.e., [1, ..., len(A)].
ṙ         Rotate; yield A, rotated 1, ..., and len(A) units rotated to the left.
    ‘     Increment; add 1 to all elements of A.
  ḣ"      Head zipwith; truncate the n-th rotation to length A[n]+1.
     Œp   Take the Cartesian product of all resulting truncated rotations.
       ċ  Count the number of times A appears in the result.

2

SWI- 프롤로그, 83 바이트

a(L,[H|R]):-nth0(X,R,H),H>=X,a(L,R);length(R,N),nth0(X,L,H),H>=N+X,a(L,R).
a(_,[]).


목록은 두 번 입력해야합니다.

a([1,2,3],[1,2,3]).

이것이 허용 가능한 것으로 간주되지 않으면 술어를 추가 할 수 있습니다

a(L):-a(L,L).

14 바이트가 추가됩니다.

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


nb : ';'으로 검색어를 분리하여 한 번에 다른 잘못된 사례를 테스트 할 수 있습니다 (또는) ','(및)로 구분하여 다른 실제 사례를 테스트

즉, OP 예제 사용 :

a([1],[1]),
a([8, 9],[8, 9]),
a([2, 3, 4],[2, 3, 4]),
a([5, 5, 3, 3, 6],[5, 5, 3, 3, 6]),
a([2, 3, 5, 2, 3, 6],[2, 3, 5, 2, 3, 6]),
a([6, 7, 3, 5, 3, 7],[6, 7, 3, 5, 3, 7]),
a([9, 4, 6, 7, 4, 5],[9, 4, 6, 7, 4, 5]),
a([1, 1, 1, 1, 1, 100, 1],[1, 1, 1, 1, 1, 100, 1]),
a([1, 9, 1, 8, 1, 7, 1, 11],[1, 9, 1, 8, 1, 7, 1, 11]).

a([1, 2, 3],[1, 2, 3]);
a([2, 3, 9, 5],[2, 3, 9, 5]);
a([3, 5, 4, 4, 6],[3, 5, 4, 4, 6]);
a([2, 3, 5, 2, 3, 4],[2, 3, 5, 2, 3, 4]);
a([3, 5, 7, 5, 9, 3, 7],[3, 5, 7, 5, 9, 3, 7]);
a([5, 6, 7, 8, 9, 10, 11],[5, 6, 7, 8, 9, 10, 11]);
a([1, 9, 1, 8, 1, 6, 1, 11],[1, 9, 1, 8, 1, 6, 1, 11]).

2

PHP, 52 바이트

for(;$n=$argv[++$i];$$n=$i)!$$n|$i-$$n<$n+2?:die(1);

명령 행 인수에서 순서를 가져옵니다. 1허위, 진실을 0위한 코드 로 종료합니다 .
로 실행하십시오 -nr.

  • $n인수를 반복 :
    • 이전에 발생하지 않았거나 최근에 발생한
      경우 아무것도하지 않으면 코드로 종료하십시오.1
    • $$n( 변수 변수 ) 에서 이전에 발생한 것을 기억하십시오
  • 코드로 종료 0(암시 적)

미친 변수 이름은 유효하지 않지만 좋아합니다.
Jörg Hülsermann

2

망막 , 50 바이트

$
,$`
M!&`\b(1+),.*?\b\1\b
+%`(^1*)1,1+
$1
M`1,
^0

쉼표로 구분 된 단항 목록으로 입력하십시오.

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

설명

$
,$`

끝을 감싸는 단계를 확인할 수 있도록 입력을 복제하십시오.

M!&`\b(1+),.*?\b\1\b

두 개의 동일한 값 사이에서 각 (가장 짧은) 섹션을 일치시키고 반환합니다 (예 :) 11,111,1,11.

+%`(^1*)1,1+
$1

첫 번째 숫자에서 숫자와 그 뒤의 정수를 반복해서 제거하십시오. 간격이 충분히 작 으면 첫 번째 숫자가 완전히 제거됩니다. 그렇지 않으면 하나 이상의 숫자가 남아 있습니다.

M`1,

1,모든 줄에 얼마나 자주 나타나는지 세십시오 . 아무 곳에 나 표시되면 단계 중 하나가 너무 넓은 것입니다.

^0

로 시작하는 숫자 0(예 : 0자체 만 ) 를 일치 시키십시오 . 이것은 사실상 출력의 논리적 부정입니다.


2

자바 스크립트 (ES6), 47 바이트

a=>![...a,...a].some((n,i)=>a[-n]-(a[-n]=i)<~n)

작동 원리

입력 배열 a을 다시 사용하여 에 마지막으로 발생한 각 정수의 위치를 ​​저장합니다 a. 키 -n를 사용하여이 위치를 저장하여의 원래 색인을 방해하지 않도록 a합니다.

a[-n]존재, 실제 시험이 발생합니다. 때 a[-n]존재하지 않는, 표현은 a[-n] - (a[-n] = i)동일 undefined - i == NaN하고과의 비교는 ~n예상 된 결과이다, 항상 falsy입니다.

테스트 사례


2

망막 ,  41 39 바이트

2 바이트는 방법으로 자신과 그룹을 균형에 저를 소개 마틴 청산, 덕분에 golfed SO에 환상적인 가이드

$
,$`,
((1)+,)(?=(?<-2>1+,)*(\1|$))

^$

입력은 쉼표로 구분 된 단항 번호 목록입니다. 출력은 0거짓과 1참입니다.

온라인으로 사용해보십시오! (10 진수에서 자동으로 변환되는 테스트 스위트)

최근에 그룹 균형 조정에 대해 배웠으므로 시험해보고 싶었습니다. 사용하기 가장 쉬운 도구는 아니지만 강력합니다.

설명

$
,$`,

다른 많은 제출물과 마찬가지로 래핑을 처리하기 위해 목록을 복제합니다. 또한 끝에 쉼표를 추가하므로 모든 숫자 뒤에 쉼표가옵니다 (이는 나중에 조금 더 쉬워집니다)

((1)+,)(?=(?<-2>1+,)*(\1|$))

흥미로운 일이 있습니다. 이것은 교체 단계이며 첫 번째 줄과 일치하는 모든 것을 두 번째 줄로 바꿉니다.이 경우 다른 숫자가 n아닌 모든 숫자를 제거하려고 n+1합니다.

이를 위해 먼저 1그룹의 각 그룹을 캡처하여 숫자를 일치시킵니다 (이 경우 그룹 번호 2 캡처). 그런 다음 긍정적 인 예측을 통해 너비가 0 인 어설 션을 갖기 위해 밸런싱 그룹에서 반복적으로 일치 시키려고 시도합니다. 그룹 -2에 의해 캡처 2된 수, 쉼표가 뒤 따릅니다. 이 일련의 숫자 후에 우리는 첫 번째 숫자에 다시 도달하거나 줄의 끝에 도달하면 만족합니다.

참고 :이 표현식은 전체 숫자와 일치하는 항목을 찾지 못하면 숫자의 마지막 부분과 만 일치 할 수 있습니다. 숫자의 첫 번째 부분이 문자열에 남아 있고 교체가 완전히 성공하지 못했음을 알기 때문에 이것은 문제가되지 않습니다.

^$

마지막으로, 목록에서 모든 숫자를 완전히 제거했다면 결과는 진실해야합니다. 빈 문자열을 일치시키고 찾은 일치 수를 반환하려고합니다.


1
잘 하셨어요! :) 필요가 없습니다 \b. 그것을 제거하면 길 잃은 일치가 발생하지만 전체 숫자를 제거하지 못하므로 빈 문자열로 끝나지 않습니다.
Martin Ender

@MartinEnder 당신은 물론입니다, 감사합니다 :)
Leo

1

젤리 , 11 바이트

ẋ2ĠṢI_2<"QȦ

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

ẋ2ĠṢI_2<"QȦ  Main link. Argument: A (array)

ẋ2           Repeat A twice to account for wrap-around.
  Ġ          Group all indices of A + A by their respective values, sorting the
             index groups by the associated values.
   Ṣ         Sort the groups lexicographically, i.e., by first appearance in A.
    I        Increments; compute the forward differences of adjacent indices in
             each of the groups.
     _2      Subtract 2 from the differences.
         Q   Unique; yield A, deduplicated.
       <"    Compare all differences in the index group corresponding to the n-th
             unique value in A with the n-th unqiue value in A.
          Ȧ  All; yield 1 if and only if none of the comparisons returned 0.


1

로다 , 50 바이트

f a{seq 0,#a-1|[indexOf(a[_],a[_1+1:]..a)<=a[_1]]}

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

마침내! 나는 한 대기 를 위해 이 문제 ...

진실하거나 거짓된 값을 반환하는 함수입니다. 배열 하나의 인수가 필요합니다.

인덱스 스트림을 반복하고 각 인덱스 _1가 현재 인덱스와 다음 인덱스의 거리가을 a[_1]넘지 않는지 확인합니다 a[_1].


정확히 어떻게 _1작동합니까?
Kritixi Lithos

@KritixiLithos와 _같지만 처음 가져온 값을 나타냅니다. 여러을 사용했다면 _각각 별도의 값을 가져 왔을 것입니다. 예를 들어, [1, 2, 3] | print(_, _, _)인쇄 123하지만 별도의 행에 [1,2,3] | print(_, _1, _1)인쇄합니다 111 222 333.
fergusq

0

05AB1E , 13 바이트

Dì©v®¦©yky›_P

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

Dì             # duplicate input and prepend the copy to the original
  ©            # store a copy in the register
   v           # for each element in the list
    ®          # push the list from register
     ¦©        # remove the first element and store a copy in the register
       yk      # get the index of the current element in the list
         y›_   # check if it's less than or equal to the current element
            P  # product of stack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.