Hitung hasil edit yang dihitung untuk masa tenggang


23

Saat Anda mengedit posting di SE, suntingan lebih lanjut dalam tenggang waktu 5 menit digabungkan ke dalamnya. Diberikan daftar waktu Anda mengedit posting, hitung hasil edit tidak dalam tenggang waktu.

Katakanlah Anda mengedit pada menit [0,3,4,7,9,10,11,12]. Ini menghasilkan 3 suntingan pada waktu [0,7,12], dengan sisanya terjadi pada masa tenggang mereka.

0:  [3,4]
7:  [9,10,11]
12: []
  • Suntingan pertama adalah pada menit ke-0. Suntingan pada menit 3 dan 4 berada dalam tenggang waktu 5 menit, jadi jangan dihitung.
  • Suntingan kedua pada menit 7. Suntingan pada menit 9, 10, 11 berada dalam tenggang waktu.
  • Suntingan ketiga pada menit 12 baru saja melewati tepi periode tenggang 5 menit mulai dari menit 7.

Jadi, outputnya adalah 3.

Daftar waktu dalam hitungan menit akan menjadi daftar bilangan bulat yang bertambah. Angka pertama akan selalu 0 untuk posting awal, yang kami hitung sebagai hasil edit.

Kasus uji:

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

Output:

1
2
3
3
3
3
4
5
5
6

Untuk kemudahan penyalinan, berikut adalah input, output, dan pasangan input / output:

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

Papan peringkat:


Meskipun sangat menyebalkan jika hasil edit Anda tidak mencapai masa tenggang, karena Anda harus menggunakan masa tenggang baru Anda untuk membuatnya terlihat seolah-olah Anda bermaksud mengeditnya sepanjang ...
Neil

Jawaban:


20

JavaScript, 36 byte

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

Cobalah online!

Bagaimana itu bekerja

Dalam setiap panggilan rekursif kami menghapus semua elemen dari array yang berjarak lebih dari 4 menit dari elemen pertama.
Ada sedikit trik dengan nama variabel $. Pemeriksaan $>fpertama-tama mengubah array menjadi string dan kemudian membandingkannya dengan representasi string dari fungsi fdan kemudian membandingkannya secara leksikografis. Karakter pertama array yang diuraikan adalah angka dan karenanya hanya nama variabel satu karakter yang indeks ascii lebih kecil dari indeks semua digit $. Mengganti $dengan nama variabel lain akan selalu kembali false.


3
Saya suka situs ini karena jawaban seperti ini.
Cristian Lupascu

1
Trik yang sangat bagus!
Arnauld

1
Oh, sekarang, itu trik yang bagus!
Shaggy

8

Mathematica, 46 40 37 33 byte

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

Penjelasan

i=1;j=0

Setel ike 1dan jke 0.

... /@#

Peta ke semua elemen input ...

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

Jika (element) - j < 5salah, maka kenaikan idan atur jke elemen (evaluasi hubung singkat).

;i

Keluaran i.


5

Sekam , 8 byte

Γ(→₀f>+4

Cobalah online!

Penjelasan

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

Cobalah online!

  • Disimpan 2 byte berkat @Mr. Xcoder.

49 byte

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

Menggunakan metode rekursif yang ditunjukkan dalam solusi @ ThePirateBay .

  • Menyimpan satu byte berkat @Mr. Xcoder.
  • Disimpan 2 byte berkat @Halvard Hummel.

Cobalah online!


and 1+f(...)dapat diganti oleh and-~f(...)untuk 49 byte
Mr. Xcoder

@ Mr.Xcoder Oh, tidak bisa melupakan semua trik bitwise itu.
mil

x=a[:1]sama dengan x=[0], karena pertanyaan secara eksplisit menyatakan bahwa elemen pertama selalu 0( 62 byte )
Tn. Xcoder


3

J , 20 byte

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

Cobalah online!

Penjelasan

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

Fungsi anonim yang menginput array dan menghasilkan angka.

Ini menggunakan uniquetolfungsi, khususnya bentuknya y = uniquetol(x, t), yang memberikan yelemen unik berisi xtoleransi t. Dengan demikian, fungsi tersebut tampaknya mengikuti pendekatan "malas": mengurutkan x, memilih entri pertama, dan terus melewatkan entri selama mereka berada dalam toleransi terhadap entri yang dipilih terbaru. Itulah yang dibutuhkan di sini.

The uniquetolfungsi otomatis skala toleransi ditentukan oleh nilai absolut maksimum dalam a. Inilah mengapa kita perlu pembagian di sini. x+1digunakan alih-alih xuntuk menghindari pembagian oleh 0.

Verifikasi kasus uji:

>> 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 tentang uniquetol... Diperkenalkan pada R2015a . Saya punya R2014b :( Jawaban yang bagus :)
Stewie Griffin

@Stewie saya tahu itu ada, tapi saya pikir ini adalah pertama kalinya saya menggunakannya
Luis Mendo

2

05AB1E , 20 19 18 15 14 11 byte

v®y‹iy4+©\¼

Penjelasan:

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

Cobalah online!

Edit

  • -3 byte terima kasih kepada Riley dan penggunaan counter_variable
  • tidak perlu counter_variable
  • -3 byte lagi terima kasih kepada Riley dan penggunaan register_c

Anda dapat menggunakan variabel penghitung untuk menghemat 3 byte:¼4¹vDy‹i¼y4+}}¾
Riley

oooooh, ada variabel counter, itu berguna! Terima kasih!!
Cyril Gandon


2

Sekam, 6 byte

Lüo<+5

Cobalah online!

  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

Wah, saya tidak menyadari üpekerjaan seperti itu! Itu sangat berguna.
Zgarb

@Zgarb: Saya pertama kali mencoba ġtapi tidak bekerja, sedangkan Haskell groupBykarya: length.groupBy((>).(+5)). Kemudian saya menemukan üyang juga mengarah ke Haskell setara pendek: nubBy.
nimi



1

MATL , 13 12 byte

`ttX<4+>)t}@

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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

L&lbhyfg-Thb5b

Ini adalah fungsi rekursif. Sebut dengan y[0 1 2 3 4 5 6 7 8), di mana [...)daftar Anda.

Atau, Coba di sini! atau Verifikasi semua kasus uji.


Penjelasan

Ini kira-kira setara dengan solusi Python. Terjemahan akan memberikan hasil sebagai berikut:

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

Rincian Kode

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.

Saya mencoba mencari solusinya .U. Saran dipersilahkan
Tn. 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;}

Penjelasan:

Coba di sini.

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

Retina , 32 26 byte

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

Cobalah online! Penjelasan:

.+
$*11

Konversikan ke unary, tetapi tambahkan 1, karena 0 adalah konsep yang rumit di Retina.

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

Hitung jumlah suntingan, tetapi sertakan semua suntingan rahmat di setiap kecocokan.


0

Kotlin, 52 byte

Posting sebagai fungsi, jika ini tidak dapat diterima saya akan mengubahnya menjadi metode

pengajuan

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

Yg diperindahkan

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

Uji

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 byte

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

Solusi berulang. Panjang karena fenceposting pada forloop membutuhkan pemeriksaan tambahan di akhir. Saran bermain golf diterima.

Kami mengambil input $args[0]sebagai array literal, lepaskan elemen pertama menjadi $xdan sisanya menjadi $y. Lalu, selama masih ada elemen $y, kita loop.

Setiap iterasi, kami memeriksa apakah cap waktu saat $xini 5atau lebih jauh dari $lcap waktu edit ast. Jika demikian, kami menambah penghitung kami $i++dan mengatur stempel waktu kami menjadi terkini. Kemudian, pada iterasi dari loop, kita lepaskan elemen berikutnya $xdan biarkan sisanya masuk $y.

Setelah kami keluar dari loop, kami menampilkan $i, plus 1untuk pengeditan awal, ditambah apakah stempel waktu akhir lebih dari lima dari pengeditan terakhir (dengan nilai Boolean secara implisit dilemparkan ke integer). Hasil itu ditinggalkan di jalur pipa dan hasilnya tersirat.

Cobalah online!


0

R , 52 byte

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

Cobalah online!

Fungsi anonim sederhana yang secara iteratif menghilangkan elemen dari daftar yang berjarak kurang dari 5 dari elemen pertama hingga daftar kosong, lalu mengembalikan penghitung.


0

Clojure, 53 byte

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

Ini melacak "edit waktu mulai", dan kemudian mengembalikan hitungan berbeda mereka.


0

Japt , 14 byte

Ê©1+ßUf_aUg)>4

Cobalah


Penjelasan

Input array secara implisit U

Ê

Dapatkan panjangnya U.

©

Logis AND ( &&) - hanya jalankan yang berikut jika Êbenar (bukan nol).

ß

Panggilan rekursif.

Uf_

Saring ( f) Udengan melewatkan setiap elemen melalui suatu fungsi.

aUg

Dapatkan perbedaan ( a) antara elemen saat ini dan elemen pertama ( g) dari U.

>4

Lebih besar dari 4?

1+

Tambah 1.

Output implisit bilangan bulat yang dihasilkan.


0

Jelly , 11 byte

+4Ḣ<x@µÐĿL’

Cobalah online!

Penjelasan

+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

Cobalah online!

Penjelasan

;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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.