计算宽限期的编辑次数


23

当您在SE上编辑帖子时,在5分钟宽限期内的所有进一步编辑都会合并到其中。给定您编辑帖子的次数列表,请在宽限期内不算编辑次数。

假设您在几分钟内进行编辑[0,3,4,7,9,10,11,12]。有时会导致3次修改,[0,7,12]其余的会在其宽限期内发生。

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

Answers:


20

JavaScript,36个字节

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

在线尝试!

怎么运行的

在每个递归调用中,我们从数组中删除与第一个元素相距4分钟以上的所有元素。
有一个使用变量名的小技巧$。该检查$>f首先将数组转换为字符串,然后将其与函数的字符串表示形式f进行比较,然后按字典顺序对它们进行比较。字符串化数组的第一个字符是数字,因此,只有ascii索引小于所有数字的索引的一个char变量名称是$。替换$为任何其他变量名将始终返回false


3
我喜欢这个网站,是因为这些答案。
Cristian Lupascu

1
很不错的把戏!
Arnauld

1
哦,现在,这真是个绝招!
毛茸茸的

8

Mathematica,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为false,则递增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

Python 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(...)为49个字节
Xcoder先生,17年

@ Mr.Xcoder噢,不能忘记所有这些按位技巧。
英里

x=a[:1]等价于x=[0],因为问题明确指出第一个元素始终为062个字节
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),该函数给出yx具有公差的独特元素t。这样做时,该函数似乎遵循“惰性”方法:排序x,选择其第一个条目,并保持跳过条目的时间,只要它们在最新选择的条目的容许范围内即可。这正是这里所需要的。

uniquetol功能将按中的最大绝对值自动缩放指定的公差a。这就是为什么我们需要在这里划分。x+1用于x避免被0除。

验证测试用例:

>> 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关于uniquetol... 在R2015a中引入。我有R2014b :(不错的答案:)
Stewie Griffin

@Stewie我知道它的存在,但是我认为这是我第一次使用它
Luis Mendo

2

05AB1E20 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

在线尝试!

编辑

  • -3个字节,这要归功于Riley和counter_variable的用法
  • 毕竟不需要counter_variable
  • 还要感谢Riley和register_c的使用,使-3个字节

您可以使用counter变量保存3个字节:¼4¹vDy‹i¼y4+}}¾
Riley

哦,有一个计数器变量,很方便!谢谢!!
西里尔·甘登

1
11个字节:v®y‹iy4+©\¼
Riley

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

MATL13 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

Pyth,14个字节

L&lbhyfg-Thb5b

这是一个递归函数。用调用它y[0 1 2 3 4 5 6 7 8)[...)您的列表在哪里。

或者,在这里尝试!验证所有测试用例。


说明

这大致相当于Python解决方案。翻译将产生以下结果:

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。欢迎提出建议
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

转换为一元,但加1,因为0在Retina中是一个棘手的概念。

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

计算编辑次数,但在每个匹配项中包括所有宽限期编辑。


0

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

在线试用


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,我们就会循环。

每次迭代时,我们检查当前时间戳 $x5以上远离$lAST编辑时间戳。如果是这样,我们将增加计数器$i++并将时间戳设置为当前时间戳。然后,在循环的迭代中,我们将下一个元素剥离$x为剩余元素,$y

一旦退出循环,我们将输出$i,加上1用于初始编辑的内容,以及最终时间戳记是否比上次编辑超出五倍(布尔值隐式转换为整数)。该结果留在管道上,并且输出是隐式的。

在线尝试!


0

[R,52个字节

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

在线尝试!

简单的匿名函数,该函数以迭代方式从列表中删除距离第一个元素小于5的元素,直到列表为空,然后返回计数器。


0

Clojure,53个字节

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

这会跟踪“编辑开始时间”,然后返回其不同的计数。


0

Japt,14个字节

Ê©1+ßUf_aUg)>4

试试吧


说明

数组的隐式输入 U

Ê

取得的长度U

©

逻辑AND(&&)-仅在Ê为真(非零)时才执行以下操作。

ß

递归调用。

Uf_

通过将每个元素传递给函数来过滤(fU

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.