Đếm các chỉnh sửa kế toán cho thời gian ân hạn


23

Khi bạn chỉnh sửa bài đăng trên SE, mọi chỉnh sửa tiếp theo trong thời gian gia hạn 5 phút sẽ được hợp nhất vào bài đăng đó. Đưa ra một danh sách các lần bạn chỉnh sửa một bài đăng, đếm số lần chỉnh sửa không trong thời gian gia hạn.

Nói rằng bạn chỉnh sửa trong vài phút [0,3,4,7,9,10,11,12]. Điều này dẫn đến 3 lần chỉnh sửa [0,7,12], phần còn lại xảy ra trong thời gian ân hạn của họ.

0:  [3,4]
7:  [9,10,11]
12: []
  • Lần chỉnh sửa đầu tiên là vào phút 0. Các chỉnh sửa ở phút 3 và 4 nằm trong thời gian ân hạn 5 phút, và vì vậy đừng tính.
  • Chỉnh sửa thứ hai là vào phút 7. Các chỉnh sửa ở phút 9, 10, 11 nằm trong thời gian gia hạn.
  • Lần chỉnh sửa thứ ba ở phút 12 chỉ vừa qua thời hạn ân hạn 5 phút bắt đầu từ phút 7.

Vì vậy, đầu ra là 3.

Danh sách thời gian tính bằng phút sẽ là danh sách các số nguyên tăng dần. Số đầu tiên sẽ luôn là 0 cho bài đăng đầu tiên, chúng tôi tính là một chỉnh sửa.

Các trường hợp thử nghiệm:

[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]

Đầu ra:

1
2
3
3
3
3
4
5
5
6

Để dễ sao chép, đây là các cặp đầu vào, đầu ra và đầu vào / đầu ra:

[[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)]

Bảng xếp hạng:


Mặc dù thật sự khó chịu nếu bản chỉnh sửa của bạn không tạo ra thời gian ân hạn, bởi vì sau đó bạn phải sử dụng thời gian ân hạn mới của mình để làm cho nó trông giống như bạn có ý định chỉnh sửa theo cách đó suốt ...
Neil

Câu trả lời:


20

JavaScript, 36 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Trong mỗi cuộc gọi đệ quy, chúng tôi xóa tất cả các phần tử khỏi mảng cách xa phần tử đầu tiên hơn 4 phút.
Có một mẹo nhỏ với tên biến $. $>fTrước tiên, kiểm tra chuyển đổi mảng thành một chuỗi và sau đó so sánh nó với biểu diễn chuỗi của hàm fvà sau đó so sánh chúng theo từ vựng. Ký tự đầu tiên của mảng được xâu chuỗi là một chữ số và do đó chỉ có tên biến một char có chỉ số ascii nhỏ hơn chỉ số của tất cả các chữ số là $. Thay thế $bằng bất kỳ tên biến nào khác sẽ luôn trở lại false.


3
Tôi thích trang web này vì câu trả lời như thế này.
Cristian Lupascu

1
Thủ thuật rất hay!
Arnauld

1
Oh, bây giờ, đó là một mẹo tuyệt vời!
Xù xì

8

Toán học, 46 40 37 33 byte

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

Giải trình

i=1;j=0

Đặt ithành 1jthành 0.

... /@#

Ánh xạ vào tất cả các yếu tố của đầu vào ...

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

Nếu (element) - j < 5là sai, sau đó tăng ivà đặt thành jphần tử (đánh giá ngắn mạch).

;i

Đầu ra i.


5

Husk , 8 byte

Γ(→₀f>+4

Hãy thử trực tuyến!

Giải trình

Γ(→₀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

Python 2 , 58 byte

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

Hãy thử trực tuyến!

  • Đã lưu 2 byte nhờ @Mr. Xcoder.

49 byte

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

Sử dụng phương pháp đệ quy được hiển thị trong giải pháp của @ ThePirateBay .

  • Đã lưu một byte nhờ @Mr. Xcoder.
  • Đã lưu 2 byte nhờ @Halvard Hummel.

Hãy thử trực tuyến!


and 1+f(...)có thể được thay thế bằng and-~f(...)49 byte
Ông Xcoder

@ Mr.Xcoder Ồ, không thể quên tất cả những mánh khóe đó.
dặm

x=a[:1]tương đương với x=[0], vì câu hỏi nói rõ rằng phần tử đầu tiên luôn luôn là 0( 62 byte )
Ông Xcoder

1
Đệ

3

J , 20 byte

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

Hãy thử trực tuyến!

Giải trình

[:#(,}.~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 byte

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

Hàm ẩn danh nhập một mảng và xuất ra một số.

Cái này sử dụng uniquetolhàm, cụ thể là dạng của nó y = uniquetol(x, t), nó ychứa các phần tử duy nhất xcó dung sai t. Khi làm như vậy, hàm dường như tuân theo cách tiếp cận "lười biếng": sắp xếp x, chọn mục nhập đầu tiên và tiếp tục bỏ qua các mục miễn là chúng nằm trong phạm vi cho phép của mục được chọn mới nhất. Đó chính xác là những gì cần thiết ở đây.

Các uniquetol chức năng tự động quy mô dung sai quy định bởi giá trị tuyệt đối tối đa trong a. Đây là lý do tại sao chúng ta cần sự phân chia ở đây. x+1được sử dụng thay vìx để chia cho 0.

Xác minh các trường hợp thử nghiệm:

>> 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 về uniquetol... Được giới thiệu vào R2015a . Tôi có R2014b :( Câu trả lời hay :)
Stewie Griffin

@Stewie Tôi biết nó tồn tại, nhưng tôi nghĩ đây là lần đầu tiên tôi sử dụng nó
Luis Mendo

2

05AB1E , 20 19 18 15 14 11 byte

v®y‹iy4+©\¼

Giải trình:

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

Hãy thử trực tuyến!

Chỉnh sửa

  • -3 byte nhờ Riley và việc sử dụng counter_variable
  • Rốt cuộc, không cần phản đối
  • -3 byte một lần nữa nhờ Riley và việc sử dụng register_c

Bạn có thể sử dụng biến đếm để lưu 3 byte:¼4¹vDy‹i¼y4+}}¾
Riley

oooooh, có một biến đếm, thật tiện dụng! Cảm ơn bạn!!
Cyril Gandon


2

Husk, 6 byte

Lüo<+5

Hãy thử trực tuyến!

  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

Whoa, tôi đã không nhận ra ücông việc như thế! Điều đó rất tiện dụng.
Zgarb

@Zgarb: Lần đầu tiên tôi thử ġnhưng nó không hoạt động, trong khi groupBycác tác phẩm của Haskell : length.groupBy((>).(+5)). Sau đó, tôi tìm thấy ücũng dẫn đến một tương đương Haskell ngắn hơn : nubBy.
nimi



1

MATL , 13 12 byte

`ttX<4+>)t}@

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

`        % 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

Bình thường , 14 byte

L&lbhyfg-Thb5b

Đây là một hàm đệ quy. Gọi nó với y[0 1 2 3 4 5 6 7 8), [...)danh sách của bạn ở đâu .

Ngoài ra, hãy thử nó ở đây! hoặc Xác minh tất cả các trường hợp thử nghiệm.


Giải trình

Điều này gần tương đương với giải pháp Python. Một bản dịch sẽ cho kết quả như sau:

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

Sự cố mã

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.

Tôi đang cố gắng tìm một cách giải quyết với .U. Gợi ý được chào đón
Ông Xcoder


1

C # .NET, 63 byte

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

Giải trình:

Hãy thử nó ở đây.

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

Võng mạc , 32 26 byte

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

Hãy thử trực tuyến! Giải trình:

.+
$*11

Chuyển đổi thành unary, nhưng thêm 1, vì 0 là một khái niệm phức tạp trong Retina.

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

Đếm số lần chỉnh sửa, nhưng bao gồm tất cả các chỉnh sửa ân sủng trong mỗi trận đấu.


0

Kotlin, 52 byte

Đăng như một chức năng, nếu điều này không được chấp nhận, tôi sẽ thay đổi nó thành một phương thức

Nộp hồ sơ

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

Làm đẹp

{
    // 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
}

Kiểm tra

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)))
}

Dùng thử


0

PowerShell , 74 byte

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

Giải pháp lặp lại. Dài dòng vì hàng rào trên forvòng lặp yêu cầu kiểm tra bổ sung vào cuối. Gợi ý chơi golf chào mừng.

Chúng tôi lấy đầu vào $args[0]là một mảng theo nghĩa đen, bóc phần tử đầu tiên $xvà phần còn lại vào $y. Sau đó, miễn là vẫn còn các yếu tố$y , chúng ta lặp.

Mỗi lần lặp, chúng tôi kiểm tra xem dấu thời gian hiện tại $x5hay đi nhiều hơn từ $last chỉnh sửa dấu thời gian. Nếu vậy, chúng tôi tăng bộ đếm của chúng tôi $i++và đặt dấu thời gian của chúng tôi là hiện tại. Sau đó, trên vòng lặp của vòng lặp, chúng ta bóc phần tử tiếp theo vào $xvà để phần còn lại vào $y.

Khi chúng tôi thoát khỏi vòng lặp, chúng tôi sẽ xuất ra $i, cộng 1với lần chỉnh sửa ban đầu, cộng với việc dấu thời gian cuối cùng có cách xa lần chỉnh sửa cuối cùng hơn năm lần hay không (với giá trị Boolean được chuyển thành số nguyên). Kết quả đó được để lại trên đường ống và đầu ra là ẩn.

Hãy thử trực tuyến!


0

R , 52 byte

function(l){while(sum(l|1)){l=l[l-l[1]>=5]
F=F+1}
F}

Hãy thử trực tuyến!

Hàm ẩn danh đơn giản lặp đi lặp lại loại bỏ các phần tử khỏi danh sách cách phần tử đầu tiên ít hơn 5 cho đến khi danh sách trống, sau đó trả về bộ đếm.


0

Clojure, 53 byte

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

Điều này theo dõi "thời gian bắt đầu chỉnh sửa", và sau đó trả về số lượng riêng biệt của chúng.


0

Japt , 14 byte

Ê©1+ßUf_aUg)>4

Thử nó


Giải trình

Đầu vào ngầm định của mảng U

Ê

Lấy chiều dài của U.

©

Logic AND ( &&) - chỉ thực hiện như sau nếu Êtrung thực (khác không).

ß

Gọi đệ quy.

Uf_

Lọc ( f) Ubằng cách chuyển từng phần tử qua một hàm.

aUg

Lấy sự khác biệt ( a) giữa phần tử hiện tại và phần tử đầu tiên ( g) của U.

>4

Lớn hơn 4?

1+

Thêm 1.

Ngõ ra ngầm định của số nguyên kết quả.


0

Thạch , 11 byte

+4Ḣ<x@µÐĿL’

Hãy thử trực tuyến!

Giải trình

+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 byte

;I4<1;x@;ð/L

Hãy thử trực tuyến!

Giải trình

;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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.