유예 기간에 대한 편집 횟수 계산


23

SE에서 게시물을 편집하면 5 분의 유예 기간 내에 추가로 편집 한 내용이 병합됩니다. 게시물을 편집 한 시간 목록이 있으면 유예 기간이 아닌 편집 내용을 계산합니다.

분 단위로 수정한다고 가정 해 보겠습니다 [0,3,4,7,9,10,11,12]. 그 결과 [0,7,12]유예 기간에 나머지가 발생하는 시간이 3 번 수정됩니다 .

0:  [3,4]
7:  [9,10,11]
12: []
  • 첫 번째 편집 시간은 0 분입니다. 3 분 및 4 분의 편집 내용은 5 분의 유예 기간 내에 있으므로 계산에 포함되지 않습니다.
  • 두 번째 편집 시간은 7 분입니다. 9, 10, 11 분 편집 내용은 유예 기간 내에 있습니다.
  • 12 분에 세 번째 편집은 7 분에 시작하는 5 분 유예 기간의 가장자리를지나갑니다.

따라서 출력은 3입니다.

분 단위 시간 목록은 증가하는 정수 목록입니다. 최초 게시의 경우 첫 번째 숫자는 항상 0이며 편집으로 계산됩니다.

테스트 사례 :

[0]
[0,3,5,7]
[0,3,4,7,9,10,11,12]
[0,30,120]
[0,4,8,12,16]
[0,4,8,12,16,20]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
[0,5,10,15,20]
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
[0,1,4,5,9,11,12,14,16,18,23,24,26,28,29,30]

출력 :

1
2
3
3
3
3
4
5
5
6

쉽게 복사 할 수 있도록 입력, 출력 및 입력 / 출력 쌍이 있습니다.

[[0], [0, 3, 5, 7], [0, 3, 4, 7, 9, 10, 11, 12], [0, 30, 120], [0, 4, 8, 12, 16], [0, 4, 8, 12, 16, 20], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [0, 5, 10, 15, 20], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [0, 1, 4, 5, 9, 11, 12, 14, 16, 18, 23, 24, 26, 28, 29, 30]]
[1, 2, 3, 3, 3, 3, 4, 5, 5, 6]
[([0], 1), ([0, 3, 5, 7], 2), ([0, 3, 4, 7, 9, 10, 11, 12], 3), ([0, 30, 120], 3), ([0, 4, 8, 12, 16], 3), ([0, 4, 8, 12, 16, 20], 3), ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 4), ([0, 5, 10, 15, 20], 5), ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 5), ([0, 1, 4, 5, 9, 11, 12, 14, 16, 18, 23, 24, 26, 28, 29, 30], 6)]

리더 보드 :


편집이 유예 기간을 만들지 않으면 실제로 성가신 일이지만, 새로운 유예 기간을 사용하여 마치 그 방식으로 편집하려는 것처럼 보이게해야하기 때문입니다.
Neil

답변:


20

자바 스크립트, 36 바이트

f=$=>$>f&&1+f($.filter(b=>b-$[0]>4))

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

작동 원리

각 재귀 호출에서 첫 번째 요소에서 4 분 이상 떨어진 배열의 모든 요소를 ​​삭제합니다.
변수 이름에는 약간의 트릭이 있습니다 $. 검사는 $>f먼저 배열을 문자열로 변환 한 다음 함수의 문자열 표현 f과 비교 한 다음 사전 식으로 비교합니다. 문자열 배열의 첫 번째 문자는 숫자이므로 ASCII 숫자가 모든 숫자의 인덱스보다 작은 하나의 문자 변수 이름 만입니다 $. 교체 $다른 변수의 이름으로 항상 돌아갑니다 false.


3
나는 이런 답변으로 인해이 사이트를 좋아합니다.
Cristian Lupascu

1
아주 좋은 트릭!
Arnauld

1
아, 지금, 그것은 큰 트릭입니다!
Shaggy

8

수학, 46 40 37 33 바이트

(i=1;j=0;#-j<5||(i++;j=#)&/@#;i)&

설명

i=1;j=0

설정 i1j0.

... /@#

입력의 모든 요소에 맵핑하십시오.

#-j<5||(i++;j=#)&

경우 (element) - j < 5다음 증분, 거짓 i및 설정 j소자 (단락 평가)한다.

;i

출력 i.


5

껍질 , 8 바이트

Γ(→₀f>+4

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

설명

Γ(→₀f>+4  Implicit input, a list of numbers.
Γ(        Deconstruct into head n and tail x (if empty, return 0).
    f>+4  Keep those elements of x that are greater than n+4.
   ₀      Call main function recursively on the result.
  →       Increment.

5

파이썬 2 , 58 바이트

a=input()
x=[0]
for k in a:x+=[k]*(k-x[-1]>4)
print len(x)

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

  • @Mr 덕분에 2 바이트를 절약했습니다. Xcoder.

49 바이트

f=lambda a:a>[]and-~f([x for x in a if x-a[0]>4])

@ThePirateBay의 솔루션에 표시된 재귀 적 방법 사용 .

  • @Mr 덕분에 바이트를 절약했습니다. Xcoder.
  • @Halvard Hummel 덕분에 2 바이트를 절약했습니다.

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


and 1+f(...) 에 의해 대체 될 수있다 and-~f(...)
Xcoder Mr.

@ Mr.Xcoder 아, 비트 비트 트릭을 모두 잊을 수는 없습니다.
마일

x=a[:1]상당는 x=[0]질문 명시 적으로 첫 번째 요소는 항상한다고하기 때문에, 0( 62 바이트 )
씨 Xcoder


3

J , 20 바이트

[:#(,}.~5>(-{.))/@|.

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

설명

[:#(,}.~5>(-{.))/@|.  Input: array A
                  |.  Reverse
                /@    Reduce from right-to-left
            {.          Head of RHS
           -            Subtract with LHS
        5>              Less than 5
     }.~                Drop that many from
    ,                   Join
[:#                   Length

3

MATLAB, 34 바이트

@(x)nnz(uniquetol(x+1,4/max(x+1)))

배열을 입력하고 숫자를 출력하는 익명 함수.

이것은 uniquetol함수, 특히 형식 y = uniquetol(x, t)을 사용 하여 내성을 y갖는 고유 한 요소를 포함 x합니다 t. 이렇게하면이 함수 는 "게으른"접근 방식을 따르는 것 같습니다 : sort x, 첫 번째 항목을 선택하고 최근에 선택한 항목의 허용 범위 내에있는 한 항목을 계속 건너 뜁니다. 이것이 바로 여기에 필요한 것입니다.

uniquetol기능은 최대 허용 값으로 지정된 공차를 자동으로 조정합니다.a . 이것이 우리가 여기에 구분이 필요한 이유입니다. 0으로 나누기를 피하는 x+1대신에 사용됩니다 x.

테스트 사례 검증 :

>> f = @(x)nnz(uniquetol(x+1,4/max(x+1)));
>> inputs = {...
       [0] ...
       [0,3,5,7] ...
       [0,3,4,7,9,10,11,12] ...
       [0,30,120] ...
       [0,4,8,12,16] ...
       [0,4,8,12,16,20] ...
       [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] ...
       [0,5,10,15,20] ...
       [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] ...
       [0,1,4,5,9,11,12,14,16,18,23,24,26,28,29,30] ...
   };
>> outputs = cellfun(f, inputs)
outputs =
     1     2     3     3     3     3     4     5     5     6

1
TIL about uniquetol... R2015a에 도입되었습니다 . 나는 R2014b있다 :( Nice answer :)
Stewie Griffin

@Stewie 나는 그것이 존재한다는 것을 알았지 만, 이것이 내가 처음 사용한다고 생각합니다.
Luis Mendo

2

05AB1E , 20 19 18 15 14 11 바이트

v®y‹iy4+©\¼

설명:

v          # loop on input
 ®          # push register_c, start at -1
  y‹i         # if current item greater than last item
   y4+         # push new max on stack
    ©\          # push new max on register_c, and pop it from stack
     ¼           # increment counter_variable
                  # implicit print of counter_variable

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

편집하다

  • Riley 및 counter_variable 사용으로 인해 -3 바이트
  • 결국 counter_variable 필요 없음
  • Riley 및 register_c 사용으로 인해 다시 3 바이트

카운터 변수를 사용하여 3 바이트를 절약 할 수 있습니다.¼4¹vDy‹i¼y4+}}¾
Riley

oooooh, 카운터 변수가있어 편리합니다! 고맙습니다!!
Cyril Gandon

1
11 바이트 :v®y‹iy4+©\¼
라일리

2

껍질, 6 바이트

Lüo<+5

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

  o<+5        a function that takes two arguments and checks if
              the second is less than the the first plus 5
 ü            remove equal elements from the input list using the above
              function as the equality test
L             return the length of the remaining list

우와, 나는 그런 ü작품을 몰랐어요 ! 매우 편리합니다.
Zgarb

@ Zgarb : 처음 시도 ġ했지만 작동하지 않지만 Haskell의 groupBy작품 : length.groupBy((>).(+5)). 그런 다음 ü더 짧은 Haskell에 해당하는 것을 발견했습니다 nubBy.
nimi



1

MATL , 13 12 바이트

`ttX<4+>)t}@

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

`        % Do..while
  t      %   Duplicate. Takes input (implicitly) the first time
  tX<    %   Duplicate and get minimum, i.e the first entry
  4+     %   Add 4
  >      %   Greater than? Element-wise
  )      %   Keep entries that fulfill that
  t      %   Duplicate. This is used as loop condition
}        % Finally (execute at the end of the loop)
  @      %   Push number of iterations. This is the output
         % End (implicit). A new iteration is run if top of the stack is truthy

1

피스 , 14 바이트

L&lbhyfg-Thb5b

재귀 함수입니다. 로 전화 하십시오. 목록이 y[0 1 2 3 4 5 6 7 8)어디에 있습니까 [...)?

또는 여기 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오.


설명

이것은 파이썬 솔루션과 거의 같습니다. 번역 결과는 다음과 같습니다.

def y(b):
 return (len(b) and y(filter(lambda T:T>=b[0]+5,b)) + 1)

코드 분석

L&lbhyfg-Thb5b   - Function called y that accepts a list parameter b.

L                - Define the function.
  lb             - The length of b...
 &               - ... Logical AND ...
    h            - Increment by 1.
     y           - The result given by calling the function recursively on the following:
      f      b     - b filtered...
        -Thb       - ... For the elements whose difference compared to the first element...
       g    5      - ... Is greater than or equal to 5.

에 대한 해결 방법을 찾으려고합니다 .U. 제안을 환영합니다
Mr. Xcoder


1

C # .NET, 63 바이트

a=>{int e=0;foreach(int l in a)if(l-a[e]>4)a[++e]=l;return-~e;}

설명:

여기에서 시도하십시오.

a=>{                   // Method with integer-array parameter and integer return-type
  int e=0;             //  Amount of edits (starting at 0)
  foreach(int l in a)  //  Loop over the input-array
    if(l-a[e]>4)       //   If the current value minus the current edit is larger than 4:
      a[++e]=l;        //    Raise the edit-count by 1 first,
                       //    and set the current value to this next current edit
                       //  End of loop (implicit / single-line body)
  return-~e;           //  Return the amount of edits + 1
}                      // End of method





0

망막 , 32 26 바이트

.+
$*11
(1+)(¶1{1,4}\1)*\b

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

.+
$*11

0은 Retina에서 까다로운 개념이므로 단항으로 변환하지만 1을 더하십시오.

(1+)(¶1{1,4}\1)*\b

편집 횟수를 세지 만 각 일치 항목에 모든 유예 편집 내용을 포함시킵니다.


0

코 틀린, 52 바이트

함수로 게시, 이것이 허용되지 않으면 메소드로 변경합니다

제출

{var x=it[0]
var o=1
it.map{if(it>x+4){o++
x=it}}
o}

미화

{
    // Last counted edit
    var x=it[0]
    // Current edit total
    var o = 1
    // For each edit
    it.map{
        // If it was 5 or more minutes ago
        if (it>x+4) {
            // Increase edit count
            o++
            // Make it the last counted edit
            x=it
        }
    }
    // Return the edit count
    o
}

테스트

var r:(IntArray)->Int=
{var x=it[0]
var o=1
it.map{if(it>x+4){o++
x=it}}
o}

fun main(args: Array<String>) {
    println(r(intArrayOf(0)))
    println(r(intArrayOf(0,3,5,7)))
    println(r(intArrayOf(0,3,4,7,9,10,11,12)))
    println(r(intArrayOf(0,30,120)))
    println(r(intArrayOf(0,4,8,12,16)))
    println(r(intArrayOf(0,4,8,12,16,20)))
    println(r(intArrayOf(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)))
    println(r(intArrayOf(0,5,10,15,20)))
    println(r(intArrayOf(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)))
    println(r(intArrayOf(0,1,4,5,9,11,12,14,16,18,23,24,26,28,29,30)))
}

TryItOnline


0

PowerShell , 74 바이트

for($x,$y=$args[0];$y;$x,$y=$y){if($l-le$x-5){$i++;$l=$x}}$i+1+($l-le$x-5)

반복 솔루션. for루프 에 펜스 포스트 가있어 끝에 추가 점검이 필요합니다. 골프 제안을 환영합니다.

우리는 입력 $args[0]을 리터럴 배열로 가져 와서 첫 번째 요소를 벗기고 $x나머지를에 입력 $y합니다. 그런 다음 요소가 여전히 존재하는 한$y 반복됩니다.

반복 할 때마다 현재 타임 스탬프 $x가 ast 편집 타임 스탬프 5에서 멀리 떨어져 있는지 확인합니다 $l. 그렇다면 카운터를 증가 $i++시키고 타임 스탬프를 현재로 설정합니다. 그런 다음 루프 반복에서 다음 요소를 벗겨 내고 $x나머지를에 남겨 둡니다 $y.

루프가 끝나면을 출력 $i하고1 최종 타임 스탬프 5 개 이상의 거리 (암시 적으로 정수로 캐스팅 부울 값) 마지막 편집에서이다 초기 편집을위한, 플러스 여부. 결과는 파이프 라인에 남고 출력은 암시 적입니다.

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



0

클로저, 53 바이트

#(count(set(reductions(fn[r v](if(<(- v r)5)r v))%)))

"편집 시작 시간"을 추적 한 다음 고유 카운트를 반환합니다.


0

apt , 14 바이트

Ê©1+ßUf_aUg)>4

시도 해봐


설명

배열의 암시 적 입력 U

Ê

의 길이를 구하십시오 U.

©

논리 AND ( &&) Ê-true (0이 아닌) 인 경우에만 다음을 실행하십시오 .

ß

재귀 호출

Uf_

각 요소를 함수에 전달하여 필터 ( f) U를 필터링하십시오 .

aUg

a현재 요소와의 첫 번째 요소 ( g)의 차이 ( )를 가져옵니다 U.

>4

4보다 큽니까?

1+

더하다 1 .

결과 정수의 내재적 출력.


0

젤리 , 11 바이트

+4Ḣ<x@µÐĿL’

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

설명

+4Ḣ<x@µÐĿL’  Input: array A
      µÐĿ    Repeat until the results converge
+4             Add 4
  Ḣ            Head
   <           Greater than
    x@         Copy only the true values
         L   Length
          ’  Decrement

12 바이트

;I4<1;x@;ð/L

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

설명

;I4<1;x@;ð/L  Input: array A
         ð/   Reduce A from left-to-right using
;               Concatenate
 I              Increment
  4<            Greater than 4
    1;          Prepend 1
      x@        Times each of
        ;       Concatenate
           L  Length
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.