Tính toán các chuỗi chạy


11

Hãy xem xét các định nghĩa sau đây được lấy từ Số lần chạy trong một chuỗi bởi W. Rytter. Lưu ý rằng từ, chuỗi và chuỗi con đều là từ đồng nghĩa.

Một chuỗi trong một chuỗi là một phân đoạn định kỳ không thể lặp lại (với cùng một khoảng thời gian tối thiểu) trong một chuỗi.

Một khoảng thời gian p của một từ w là bất kỳ số nguyên dương p nào sao cho w [i] = w [i + p] bất cứ khi nào cả hai mặt của phương trình này được xác định. Đặt per (w) biểu thị kích thước của khoảng thời gian nhỏ nhất của w. Chúng tôi nói rằng một từ w là iff định kỳ trên (w) <= | w | / 2.

Ví dụ, xem xét chuỗi x = abcab. per(abcab) = 3như x[1] = x[1+3] = a, x[2]=x[2+3] = bvà không có thời kỳ nhỏ hơn. Chuỗi abcabdo đó không phải là định kỳ. Tuy nhiên, chuỗi abablà định kỳ theo (abab) = 2.

Một lần chạy (hoặc định kỳ tối đa) trong chuỗi w là một khoảng [i ... j] với j> = i, sao cho

  • w [i ... j] là một từ định kỳ với khoảng thời gian p = per (w [i ... j])
  • Nó là tối đa. Chính thức, không w [i-1] = w [i-1 + p] cũng không w [j + 1] = w [j + 1-p]. Một cách không chính thức, việc chạy không thể được bao gồm trong một lần chạy lớn hơn với cùng thời gian.

Biểu thị bằng RUNS (w) tập hợp các lần chạy của w.

Ví dụ

Bốn lần chạy atattattlà [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt.

Chuỗi aabaabaaaacaacacchứa 7 lần chạy sau:

[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = aacaaca.

Đầu ra của bạn nên là một danh sách các hoạt động. Mỗi lần chạy nên chỉ định khoảng thời gian nó biểu thị nhưng không cần phải tự xuất chuỗi con. Các định dạng chính xác có thể là bất cứ điều gì thuận tiện cho bạn.

Các ví dụ sử dụng lập chỉ mục 1 nhưng bạn có thể tự do sử dụng lập chỉ mục 0 thay vào đó nếu thuận tiện hơn.

BÀI TẬP

Viết mã đã cho một chuỗi w, đầu ra RUNS (w).

Ngôn ngữ và đầu vào

Bạn có thể sử dụng bất kỳ ngôn ngữ nào bạn thích và lấy chuỗi đầu vào dưới bất kỳ hình thức nào thuận tiện nhất. Tuy nhiên, bạn phải cung cấp một chương trình đầy đủ và bạn sẽ hiển thị một ví dụ về mã của bạn đang chạy trên đầu vào ví dụ.


4
Thử thách thú vị, nhưng có một lý do chính đáng để ghi đè các chức năng mặc định và không cho phép?
Martin Ender

@MartinEnder Đó chỉ là sở thích của tôi. Nó giúp mọi người dễ dàng hơn chỉ cần sao chép và dán mã và tự mình thử nó, điều này làm cho câu trả lời thú vị hơn đối với nhiều người hơn.

4
Nhưng điều đó cũng gây ra rất nhiều mã trên cao, khiến cho sự cạnh tranh không công bằng đối với các ngôn ngữ có cú pháp dài dòng. Tôi sẽ không chơi golf ở Java chẳng hạn nếu tôi phải viết class A{public static ...}mỗi khi tôi muốn viết mã golf
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub Tôi có thể thấy có những ưu và nhược điểm. Tôi tình cờ để cân thuận thuận hơn. Tôi nghĩ thật thú vị khi so sánh độ dài câu trả lời của golf trong các ngôn ngữ tương tự trong mọi trường hợp thay vì so sánh APL với Python chẳng hạn.

"một lần chạy là tối đa nếu nó không được chứa hoàn toàn trong bất kỳ lần chạy lớn hơn nào" nhưng trong ví dụ đầu tiên của bạn, [7,8] được chứa đầy đủ trong [2,8]. Hay bạn đang nghiêm túc nói về các lần chạy lặp lại cùng một chuỗi con?
aditsu nghỉ việc vì SE là EVIL

Câu trả lời:


2

Bình thường, 38 byte

{smm,hk+ekdfgaFTdcx1xM.ttB+0qVQ>QdZ2Sl

  m                                 SlQ   map for d in [1, …, len(input)]:
                            qVQ>Qd          pairwise equality of input[:-d] and input[d:]
                        tB+0                duplicate this list, prepending 0 to one copy
                      .t          Z         transpose, padding with 0
                    xM                      pairwise xor
                  x1                        find all occurrences of 1
                 c                 2        chop into groups of 2
           f                                filter for groups T such that:
             aFT                              the absolute difference between its elements
            g   d                             is greater than or equal to d
   m                                        map for groups k:
     hk                                       first element
    ,  +ekd                                   pair with the last element plus d
 s                                        concatenate
}                                         deduplicate

Bộ kiểm tra


Tôi nhận được "[[3, 5], [6, 8], [0, 4], [1, 8]]" từ "atattatt". Có [3,5] đại diện cho "tt"? Sẽ thật tuyệt nếu bạn có thể giải thích thuật toán bạn đã sử dụng ở mức cao.

@Lembik Vâng, [i, j]đại diện cho khởi đầu lát giữa các nhân vật (0-lập chỉ mục) i-1ivà kết thúc giữa các nhân vật j-1j. Đây là quy ước tiêu chuẩn trong các ngôn ngữ Pyth và hầu hết lành mạnh, như nó phải vậy (xem tại đâyđây ).
Anders Kaseorg

Tuyệt quá. Có thể mô tả giải pháp của bạn bằng trực giác? Tôi không thể đảo ngược nó từ mô tả mã của bạn không may.

1
@Lembik Giả sử chúng ta đang tìm kiếm các giai đoạn d. Chúng tôi tìm thấy tất cả các vị trí mà nhân vật i khớp với nhân vật i + d. Sau đó chúng tôi tìm thấy chạy ít nhất d liên tiếp các địa điểm như vậy. Lặp lại cho tất cả d. Chúng tôi phải lặp lại vào cuối bởi vì thời kỳ thực có thể chỉ là một ước số của d.
Anders Kaseorg

1

Camam, 66

q:A,2m*{~A>_@)_@<2*@@2*<=},{_2$-2>2,.+={+}&}*]{[_1=\)\0=2*)+]}%_&p

Dùng thử trực tuyến

Giải thích ngắn gọn:

Thuật toán hoạt động theo 4 bước (3 bước đầu tiên tương ứng với 3 khối chính bạn có thể quan sát):

  1. Tìm tất cả các cặp [chỉ số độ dài] tương ứng với một chuỗi con trùng lặp (chẳng hạn như aba aba aaacaacac); đây là những phần của hoạt động
  2. Các cặp ghép là một phần của cùng một lần chạy, tức là các chỉ số liên tiếp và cùng độ dài / thời gian.
  3. Xây dựng các hoạt động thực tế, bằng cách lấy chỉ số tối thiểu và chỉ số tối đa + 2 * chiều dài - 1.
  4. Cuối cùng, loại bỏ các lần chạy trùng lặp (là cùng khoảng thời gian thu được với một khoảng thời gian khác nhau)

Tôi muốn chơi gôn nhiều hơn, vì vậy đây là tất cả có thể thay đổi.


Cảm ơn vì điều này. Bạn có thể giải thích thuật toán bạn đã sử dụng quá xin vui lòng?

1
@Lembik ok, cập nhật
aditsu bỏ vì SE là NGÀY 5 THÁNG 7/2016
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.