猶予期間を考慮した編集のカウント


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分の猶予期間内であるため、カウントしません。
  • 2番目の編集は7分です。9、10、11分での編集は猶予期間内です。
  • 12分目の3番目の編集は、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

JavaScript、36バイト

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

オンラインでお試しください!

使い方

各再帰呼び出しで、最初の要素から4分以上離れているすべての要素を配列から削除します。
変数名にはちょっとしたトリックがあります$。このチェックでは、$>fまず配列を文字列に変換してから、それを関数の文字列表現fと比較し、辞書式に比較します。文字列化された配列の最初の文字は数字であるため、ASCIIインデックスがすべての数字のインデックスより小さい1文字の変数名のみです$$他の変数名に置き換えると常に戻りfalseます。


3
このような答えがあるため、このサイトが大好きです。
クリスチャンルパスク

1
とてもいいトリックです!
アーナルド

1
ああ、今、それは素晴らしいトリックです!
シャギー

8

Mathematica、46 40 37 33バイト

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

説明

i=1;j=0

およびに設定iします。1j0

... /@#

入力のすべての要素にマップ...

#-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

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のおかげで1バイト節約できました。Xcoder。
  • @Halvard Hummelのおかげで2バイト節約されました。

オンラインでお試しください!


and 1+f(...)置き換えることができるand-~f(...)49バイトのために
氏Xcoder

@ Mr.Xcoderああ、これらのビットごとのトリックをすべて忘れることはできません。
マイル

x=a[:1]相当しx=[0]、質問が明示的に最初の要素は常にあると述べているので、062バイト
ミスターXcoder



3

MATLAB、34バイト

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

配列を入力し、数値を出力する匿名関数。

これは、uniquetol関数、特にその形式を使用し、withの許容値を持つ一意の要素y = uniquetol(x, t)y含むようにxtます。そうすることで、関数「遅延」アプローチに従うようです。つまり、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についてuniquetol... R2015aで導入。私はR2014bを持っています:(いい答え:)
Stewie Griffin

@Stewie私はそれが存在することを知っていましたが、これを使うのは初めてだと思います
ルイス・メンド

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

オンラインでお試しください!

編集

  • ライリーとcounter_variableの使用により-3バイト
  • 結局、counter_variableは必要ありません
  • ライリーとregister_cの使用により、再び-3バイト

あなたは、3つのバイトを保存するためにカウンタ変数を使用することができます¼4¹vDy‹i¼y4+}}¾
ライリー

ああ、カウンター変数があります、それは便利です!ありがとうございました!!
シリルガンドン

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:私は最初に試しましたġが、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

Retinaでは0は扱いにくい概念であるため、単項に変換しますが、1を追加します。

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

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.