런으로 숫자를 제한


15

자체 제한 목록

음수가 아닌 정수를 포함 하는 비어 있지 않은 목록 L 을 고려하십시오 . 실행 에서 L은 더 이상 할 수 없다 동일한 요소의 연속 하위 목록입니다. 예를 들어, [0,0,1,1,3,3,3,2,1,1] 의 런 은 [0,0], [1,1], [3,3,3], [2 ], [1,1] . 리스트 L 은 각 정수 N ≥ 1 에 대해 N 발생 횟수가 N-1 런 수보다 작거나 같으면 자체 제한 됩니다 . 위의 목록은 자체 제한적이지 않습니다. 1 이 4 번 발생 하지만 한 번만 0이 실행 되기 때문 입니다.

자체 제한 목록의 예는 다음과 같습니다. [0,0,3,4,1,0,2,1,1,0,2,1,0,0,0,1,0] . 그것은

  • 5 개 실행 0 과 5 개 발생 하나 ,
  • 1 과 2의 2 번의 4 회 실행 ,
  • 2 런 2 및 1 명의 발생 3 ,
  • 1 개 실행 3 및 1 명 발생 4 ,
  • 4의 1 런 , 5의 발생 없음 ,
  • 다른 정수는 발생하지 않습니다.

작업

당신의 임무는 목록이 자체 제한인지 여부를 결정하는 것입니다. 보다 명확하게, 입력은 음이 아닌 정수의 비어 있지 않은 목록이어야합니다. 리스트가 자체 제한적이라면, 당신의 결과는 진실해야합니다; 그렇지 않으면 허위가됩니다. 입력 및 출력은 임의의 합리적인 형식 일 수 있습니다.

각 프로그래밍 언어에서 가장 낮은 바이트 수가 승자입니다. 표준 규칙이 적용됩니다.

테스트 사례

진실한 사례 :

[0]
[1,0]
[0,1,1,0,2]
[3,1,1,0,0,2,0,0]
[5,0,4,1,3,0,2,2,0,1,1,1,0]
[0,0,1,1,0,0,1,1,0,0,2,2,0,0]
[6,0,0,0,2,2,1,0,5,0,3,4,0,1,1,1]
[5,0,1,0,0,0,0,4,0,3,1,1,1,2,2,0,0,0,0,0]
[4,5,1,3,2,0,5,2,0,3,0,1,0,1,0,0,0,1,0,0,1,0,3,4,4,0,2,6,0,2,6]
[0,4,1,3,10,6,0,1,3,7,9,5,5,0,7,4,2,2,5,0,1,3,8,8,11,0,0,6,2,1,1,2,0,4]

거짓 인스턴스 :

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

귀찮게하지 말고 진실성 / 거짓 성 대신 이 메타 토론 의 접근법 중 하나를 사용하는 것을 고려하십시오. 진실성은 여기에서 자주 사용되는 몇 가지 언어 이상의 속성이 아닙니다.
FryAmTheEggman

@LeakyNun 예, 그렇지 않으면 N-1 이없는 N에 대한 조건이 실패합니다 .
Zgarb

@ Mr.Xcoder [2]너무 있지만 그러한 경우는 거짓이어야합니다.
Outgolfer Erik

@FryAmTheEggman 그 토론을 보지 못했습니다. 연결해 주셔서 감사합니다. 여기서 논의 된 접근 방식을 잠시 처리하고 싶기 때문에이 과제를 그대로 유지하겠습니다.
Zgarb

물론, 나는 많은 사람들이 그것을 놓친 것처럼 느끼기 때문에 의견을 남기고 싶습니다. 레티 나와 같은 언어로 글을 올리는 것은 적어도 나에게 매우 중요합니다.
FryAmTheEggman

답변:


5

펄 6 , 29 바이트

{bag(.grep(?*)X-1)⊆.squish}

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

Perl 6에게는 매우 어려운 과제입니다. Bag에 서브 세트 연산자를 사용합니다 (정수 가중치 세트). 설명:

{
    bag(           # Create bag of
        .grep(?*)  # non-zero elements,
        X- 1       # decremented by one.
    )
                  # Subset test.
    .squish        # "squish" removes repeated elements in each run.
                   # The result is implicitly converted to a bag
                   # counting the number of runs.
}

1
아름다운. Bag + subset 접근 방식을 보았지만 비교할 내용이 달라졌습니다.
Phil H

3

자바 스크립트 (ES6), 92 89 바이트

a=>a.map(n=>g(~n,n!=p&&g(p=n)),c=[j=0],p=g=n=>c[n]=-~c[n])&&!c.some((n,i)=>i-j++|n<c[~j])

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

어떻게?

c [] 배열 은 실행 횟수와 정수 발생 횟수를 모두 저장하는 데 사용됩니다. 런은 음이 아닌 인덱스에 저장되고 정수 발생은 1의 보수 인덱스에 저장됩니다 ( c [-1] = 0 수 , c [-2] = 1 수 등).

음수 인덱스는 실제로 기본 배열 객체의 속성 으로 저장되며 .some ()은이를 반복하지 않습니다.

a =>                        // given the input array a[]
  a.map(n =>                // for each value n in a[]:
    g(                      //   update c[]:
      ~n,                   //     increment c[~n] (# of integer occurrences)
      n != p && g(p = n)    //     if n != p, set p to n and increment c[n] (# of runs)
    ),                      //   end of c[] update
    c = [j = 0],            //   start with c = [0] and j = 0 (used later)
    p =                     //   initialize p to a non-numeric value
    g = n => c[n] = -~c[n]  //   g = helper function to increment c[n]
  )                         // end of map()
  && !c.some((n, i) =>      // for each value n at position i in c[]:
    i - j++ |               //   make sure that i == j++
    n < c[~j]               //   and n is greater than or equal to c[~j]
  )                         // end of some()


3

젤리 , 10 바이트

œ-ŒgḢ€‘ƊS¬

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

작동 원리

œ-ŒgḢ€‘ƊS¬  Main link. Argument: A (array)

       Ɗ    Drei; group the three links to the left into a monadic chain.
  Œg          Group consecutive, identical elements of A into subarrays.
    Ḣ€        Head each; pop the first element of each run.
      ‘       Increment the extracted integers.
            The resulting array contains n repeated once for each run of (n-1)'s.
œ-          Perform multiset subtraction, removing one occurrence of n for each
            run of (n-1)'s.
       S    Take the sum. If only 0's remain, the sum will be 0.
        ¬   Take the logical NOT, mapping 0 to 1 and positive integers to 0.





2

Stax , 13 9 바이트

Dennis 는 훨씬 더 나은 알고리즘을 발견했습니다 . 나는 그것을 뻔뻔스럽게 stax에 포팅했습니다.

ä╨²@┬↕OR♣

온라인으로 실행 및 디버깅

포장을 풀고 포장을 풀고 주석을 달았습니다.

c   copy input
:g  get run elements
{^m increment each
|-  multiset-subtract from original input
|M! get maximum from result, and apply logical not

이것을 실행

기존 답변 :

║Ä|╤#╫∩▼cëózü

실행 및 디버깅

입력을 반복하고 조건을 확인합니다.

  • 요소인가 > 0 입니까?
  • 입니까 occurrences(element) >= runs(element - 1)?

요소에 대해 이러한 조건 중 하나에 해당하면 해당 요소가 준수하는 것입니다. 모든 요소가 호환되면 결과는1 입니다.

다음은 동일한 프로그램의 압축을 풀고 압축을 풀고 주석 처리 한 표현입니다.

O           push 1 under the input
F           iterate over the input using the rest of program
  |c        skip this iteration of the value is 0
  x#        number of occurrences of this value in input (a)
  x:g _v#   number of runs of (current-1) in input (b)
  >!        not (a > b); this will be truthy iff this element is compliant
  *         multiply with running result

이것을 실행


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