Kết hợp các chuỗi có độ dài là một sức mạnh thứ tư


28

Trong phạm vi câu hỏi này, chúng ta chỉ xem xét các chuỗi bao gồm các ký tự được xlặp lại số lần tùy ý.

Ví dụ:

<empty>
x
xx
xxxxxxxxxxxxxxxx

(Chà, thực ra không cần phải như vậy x- bất kỳ ký tự nào cũng được miễn là toàn bộ chuỗi chỉ có 1 loại ký tự)

Viết một regex trong bất kỳ hương vị regex nào bạn chọn để khớp với tất cả các chuỗi có độ dài là n 4 cho một số nguyên không âm n (n> = 0). Ví dụ: các chuỗi có độ dài 0, 1, 16, 81, v.v ... là hợp lệ; phần còn lại không hợp lệ.

Do giới hạn kỹ thuật, các giá trị của n lớn hơn 128 rất khó kiểm tra. Tuy nhiên, regex của bạn nên hoạt động chính xác bất kể.

Lưu ý rằng bạn không được phép thực thi mã tùy ý trong regex của mình (đối với người dùng Perl). Bất kỳ cú pháp nào khác (nhìn xung quanh, tham chiếu ngược, v.v.) đều được cho phép.

Xin vui lòng bao gồm một lời giải thích ngắn về cách tiếp cận vấn đề của bạn.

(Vui lòng không dán giải thích cú pháp regex được tạo tự động, vì chúng vô dụng)


"Xx" không hợp lệ, phải không?
Kendall Frey

@KendallFrey: Không. Nó không hợp lệ.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh bạn có nghĩ rằng có một câu trả lời khả dĩ cho điều đó không?
xem

1
@Timwi: Vâng. Java, PCRE (có thể là Perl, nhưng không thể kiểm tra), .NET. Của tôi không hoạt động trong Ruby / JS, mặc dù.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Câu hỏi này đã được thêm vào Câu hỏi thường gặp về Stack Overflow thường xuyên , trong phần "Regex-Fu nâng cao".
aliteralmind

Câu trả lời:


21

Biểu thức (ir) thường xuyên này dường như làm việc.

^((?(1)((?(2)\2((?(3)\3((?(4)\4x{24}|x{60}))|x{50}))|x{15}))|x))*$

Regex này tương thích với các hương vị PCRE, Perl, .NET.

Điều này về cơ bản theo sau một "cây khác biệt" (không chắc có tên thích hợp cho nó không), cho biết regex có bao nhiêu x nữa để phù hợp với sức mạnh thứ tư tiếp theo:

1     16    81    256   625   1296  2401 ...
   15    65    175   369   671   1105 ...
      50    110   194   302   434 ...
         60    84    108   132 ...
            24    24    24 ...  # the differences level out to 24 on the 4th iteration

\2, \3, \4Cửa hàng và cập nhật phần chênh lệch như hình vào ngày 2, 3 và 4 hàng, tương ứng.

Cấu trúc này có thể dễ dàng được mở rộng cho các quyền lực cao hơn.

Chắc chắn không phải là một giải pháp thanh lịch, nhưng nó làm việc.


+1. Câu trả lời chính xác. Mặc dù câu trả lời này khác với câu trả lời của tôi (nó sử dụng regex có điều kiện, trong khi câu trả lời của tôi thì không), nó có cùng tinh thần với giải pháp của tôi (khai thác cây khác biệt và sử dụng tham chiếu ngược được khai báo trước của một số công cụ regex).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

ý tưởng gọn gàng cây khác nhau. cho hình vuông cây là 1 4 9 16 ... 3 5 7 ... 2 2 2, phải không?
Sparr

@Sparr cảm ơn, và vâng
Biến động

24

Giải pháp khác

Đây là, theo tôi, một trong những vấn đề thú vị nhất trên trang web. Tôi cần phải cảm ơn deadcode vì đã đưa nó trở lại đầu trang.

^((^|xx)(^|\3\4\4)(^|\4x{12})(^x|\1))*$

39 byte , không có bất kỳ điều kiện hoặc xác nhận ... sắp xếp. Các thay thế, như chúng đang được sử dụng ( ^|), là một loại điều kiện theo cách, để chọn giữa "lần lặp đầu tiên" và "không phải lần lặp đầu tiên".

Regex này có thể được nhìn thấy để làm việc ở đây: http://regex101.com/r/qA5pK3/1

Cả PCRE và Python đều diễn giải chính xác regex và nó cũng đã được thử nghiệm trong Perl lên đến n = 128 , bao gồm n 4 -1n 4 +1 .


Định nghĩa

Kỹ thuật chung giống như trong các giải pháp khác đã được đăng: xác định biểu thức tự tham chiếu mà trên mỗi lần lặp tiếp theo khớp với độ dài bằng với số hạng tiếp theo của hàm chênh lệch chuyển tiếp, D f , với bộ định lượng không giới hạn ( *). Một định nghĩa chính thức của hàm chênh lệch chuyển tiếp:

Định nghĩa 1: hàm chênh lệch chuyển tiếp

Ngoài ra, các hàm chênh lệch bậc cao hơn cũng có thể được xác định:

Định nghĩa 2: hàm chênh lệch chuyển tiếp thứ hai

Hoặc, nói chung hơn:

Định nghĩa 3: hàm khác biệt thứ k

Hàm khác biệt chuyển tiếp có rất nhiều tính chất thú vị; đó là để giải trình tự đạo hàm là gì đối với các hàm liên tục. Ví dụ: D f của đa thức bậc n sẽ luôn là đa thức bậc 1 và với mọi i , nếu D f i = D f i + 1 , thì hàm f là hàm mũ, theo cách tương tự rằng đạo hàm của e x bằng chính nó. Hàm rời rạc đơn giản nhất mà f = D f2 n .


f (n) = n 2

Trước khi chúng tôi kiểm tra giải pháp trên, chúng ta hãy bắt đầu với một thứ dễ dàng hơn một chút: một regex khớp với các chuỗi có độ dài là một hình vuông hoàn hảo. Kiểm tra chức năng khác biệt chuyển tiếp:

FDF: n ^ 2

Có nghĩa là, lần lặp đầu tiên phải khớp với chuỗi có độ dài 1 , chuỗi thứ hai có độ dài 3 , chuỗi thứ ba có độ dài 5 , v.v. và nói chung, mỗi lần lặp phải khớp với chuỗi dài hơn hai lần so với trước. Regex tương ứng theo gần như trực tiếp từ tuyên bố này:

^(^x|\1xx)*$

Có thể thấy rằng lần lặp đầu tiên sẽ chỉ khớp với một xlần lặp và mỗi lần lặp tiếp theo sẽ khớp với một chuỗi dài hơn hai lần trước đó, chính xác như được chỉ định. Điều này cũng ngụ ý một bài kiểm tra vuông hoàn hảo ngắn đáng kinh ngạc trong perl:

(1x$_)=~/^(^1|11\1)*$/

Regex này có thể được khái quát hóa hơn nữa để phù hợp với bất kỳ độ dài n- chéo nào:

Số tam giác:
^(^x|\1x{1})*$

Số vuông:
^(^x|\1x{2})*$

Số ngũ giác:
^(^x|\1x{3})*$

Số lục giác:
^(^x|\1x{4})*$

v.v.


f (n) = n 3

Chuyển sang n 3 , một lần nữa kiểm tra chức năng khác biệt chuyển tiếp:

FDF: n ^ 3

Có thể không rõ ràng ngay lập tức về cách thực hiện điều này, vì vậy chúng tôi cũng kiểm tra chức năng khác biệt thứ hai:

FDF ^ 2: n ^ 3

Vì vậy, hàm khác biệt chuyển tiếp không tăng theo hằng số, mà là giá trị tuyến tính. Thật tuyệt khi giá trị ban đầu (' -1 th') của D f 2 bằng 0, giúp lưu một khởi tạo trên lần lặp thứ hai. Regex kết quả là như sau:

^((^|\2x{6})(^x|\1))*$

Lặp lại đầu tiên sẽ khớp với 1 , như trước, lần thứ hai sẽ khớp với chuỗi 6 dài hơn ( 7 ), lần lặp thứ ba sẽ khớp với chuỗi 12 dài hơn ( 19 ), v.v.


f (n) = n 4

Hàm chênh lệch chuyển tiếp cho n 4 :

FDF: n ^ 4

Hàm khác biệt chuyển tiếp thứ hai:

FDF ^ 2: n ^ 4

Hàm khác biệt chuyển tiếp thứ ba:

FDF ^ 3: n ^ 4

Bây giờ thì xấu xí. Các giá trị ban đầu cho D f 2D f 3 lần lượt là khác không, 212 , sẽ cần phải được tính. Bây giờ bạn có thể nhận ra rằng regex sẽ theo mô hình này:

^((^|\2\3{b})(^|\3x{a})(^x|\1))*$

D f 3 phải khớp với độ dài 12 trên lần lặp thứ hai, nên a nhất thiết phải là 12 . Nhưng vì nó tăng thêm 24 mỗi thuật ngữ, nên việc lồng sâu hơn tiếp theo phải sử dụng giá trị trước đó hai lần, ngụ ý b = 2 . Điều cuối cùng cần làm là khởi tạo D f 2 . Vì D f 2 ảnh hưởng trực tiếp đến D f , cuối cùng là thứ chúng ta muốn khớp, nên giá trị của nó có thể được khởi tạo bằng cách chèn trực tiếp nguyên tử thích hợp vào regex, trong trường hợp này (^|xx). Regex cuối cùng sau đó trở thành:

^((^|xx)(^|\3\4{2})(^|\4x{12})(^x|\1))*$

Đơn đặt hàng cao hơn

Một đa thức bậc 5 có thể được khớp với biểu thức chính sau:
^((^|\2\3{c})(^|\3\4{b})(^|\4x{a})(^x|\1))*$

f (n) = n 5 là một phép trừ khá dễ dàng, vì các giá trị ban đầu cho cả hai hàm chênh lệch chuyển tiếp thứ hai và thứ tư đều bằng 0:

^((^|\2\3)(^|\3\4{4})(^|\4x{30})(^x|\1))*$

Trong sáu đa thức bậc:
^((^|\2\3{d})(^|\3\4{c})(^|\4\5{b})(^|\5x{a})(^x|\1))*$

Đối với đa thức bậc 7:
^((^|\2\3{e})(^|\3\4{d})(^|\4\5{c})(^|\5\6{b})(^|\6x{a})(^x|\1))*$

v.v.

Lưu ý rằng không phải tất cả các đa thức đều có thể được khớp chính xác theo cách này, nếu bất kỳ hệ số cần thiết nào là không nguyên. Ví dụ, n 6 yêu cầu a = 60 , b = 8c = 3/2 . Điều này có thể được giải quyết xung quanh, trong trường hợp này:

^((^|xx)(^|\3\6\7{2})(^|\4\5)(^|\5\6{2})(^|\6\7{6})(^|\7x{60})(^x|\1))*$

Ở đây tôi đã thay đổi b thành 6c thành 2 , có cùng sản phẩm với các giá trị đã nêu ở trên. Điều quan trọng là sản phẩm không thay đổi, vì a · b · c · Quang điều khiển hàm chênh lệch không đổi, cho đa thức bậc sáu là D f 6 . Có hai nguyên tử khởi tạo: một để khởi tạo D f thành 2 , như với n 4 và cái còn lại để khởi tạo hàm khác biệt thứ năm thành 360 , đồng thời thêm hai từ còn thiếu từ b .


Những động cơ bạn đã thử nghiệm này trên?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Cuối cùng tôi cũng hiểu chuyện gì đang xảy ra. Thật vậy, điều duy nhất cần thiết là hỗ trợ cho tham chiếu về phía trước. +1
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh ahh, bạn nói đúng. Tham chiếu chuyển tiếp không nhất thiết phải là một tính năng phổ quát.
primo

1
Xuất sắc! Tôi thích cách ngắn gọn, đơn giản và dễ hiểu này. Với cách làm tổ nông của nó, thật dễ dàng để tính toán bằng tay nó sẽ hành xử như thế nào. Ngoài ra, nó cũng nhanh như các giải pháp của Biến độngnhahtdh . Và tôi thích lời giải thích chi tiết của bạn, bao gồm cả việc chứng minh rằng điều này thậm chí có thể được mở rộng sang đa thức. Tôi sẽ cho điểm thưởng nếu tôi có thể.
Deadcode

@Lynn cảm ơn! Không ngờ rằng ...
primo

13

Đây là một giải pháp không sử dụng các điều kiện ngược, khai báo ngược hoặc lồng nhau, lookbehind, các nhóm cân bằng hoặc đệ quy regex. Nó chỉ sử dụng lookahead và backreferences tiêu chuẩn, được hỗ trợ rất rộng rãi. Tôi đã được truyền cảm hứng để hoạt động dưới những hạn chế này do Regex Golf , sử dụng công cụ regex ECMAScript.

Cách thức hoạt động của regex 50 byte này về mặt khái niệm khá đơn giản và hoàn toàn khác biệt so với tất cả các giải pháp được gửi khác cho câu đố này. Thật đáng ngạc nhiên khi phát hiện ra rằng loại logic toán học này có thể biểu hiện được trong một biểu thức chính quy.

      \2                     \4  \5
^((?=(xx+?)\2+$)((?=\2+$)(?=(x+)(\4+)$)\5){4})*x?$

(Các nhóm chụp được dán nhãn trên regex)

Regex có thể được khái quát hóa cho bất kỳ quyền lực nào chỉ bằng cách thay thế 4trong {4}với sức mạnh mong muốn.

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

Nó hoạt động bằng cách liên tục chia đi sức mạnh thứ tư nhỏ nhất của một số nguyên tố mà giá trị hiện tại chia hết cho. Vì vậy, thương số ở mỗi bước luôn là một quyền lực thứ tư, nếu giá trị ban đầu là một quyền lực thứ tư. Thương số cuối cùng là 1 chỉ ra rằng giá trị ban đầu thực sự là sức mạnh thứ tư; Điều này hoàn thành trận đấu. Zero cũng được kết hợp.

Đầu tiên, nó sử dụng một nhóm bắt lười biếng \2để nắm bắt hệ số nhỏ nhất của số lớn hơn 1. Như vậy, yếu tố này được đảm bảo là số nguyên tố. Ví dụ: với 1296 (6 ^ 4), ban đầu nó sẽ chụp \2= 2.

Sau đó, vào lúc bắt đầu của một vòng lặp được lặp đi lặp lại 4 lần, nó kiểm tra để xem nếu số lượng hiện tại là chia hết \2, với (?=\2+$). Lần đầu tiên qua vòng lặp này, thử nghiệm này là vô ích, nhưng mục đích của nó sẽ trở nên rõ ràng sau đó.

Tiếp theo bên trong vòng lặp bên trong này, nó sử dụng nhóm bắt tham lam \4để nắm bắt yếu tố lớn nhất của số nhỏ hơn chính nó : (?=(x+)(\4+)$). Trong thực tế, điều này chia số cho hệ số nguyên tố nhỏ nhất của nó , \2; ví dụ: 1296 ban đầu sẽ được ghi là \4= 1296/2 = 648. Lưu ý rằng việc chia số hiện tại theo \2ẩn. Mặc dù có thể phân chia rõ ràng số hiện tại cho một số có trong nhóm chụp (mà tôi chỉ phát hiện ra bốn ngày sau khi đăng câu trả lời này), nhưng việc này sẽ làm cho một biểu thức chính xác chậm hơn và khó hiểu hơn, và nó không phải là cần thiết, vì hệ số nhỏ nhất của một số lớn hơn 1 sẽ luôn khớp với hệ số lớn nhất nhỏ hơn chính nó (sao cho sản phẩm của chúng bằng chính số đó).

Vì loại regex này chỉ có thể "ăn mòn" khỏi chuỗi (làm cho nó nhỏ hơn) bằng cách để lại kết quả ở cuối chuỗi, chúng ta cần "di chuyển" kết quả của phép chia sang cuối chuỗi. Điều này được thực hiện bằng cách chụp kết quả của phép trừ (số trừ hiện tại \4), vào nhóm chụp \5và sau đó, bên ngoài giao diện, khớp với một phần của đầu số hiện tại tương ứng \5. Điều này để lại chuỗi chưa xử lý còn lại ở cuối phù hợp \4về chiều dài.

Bây giờ nó lặp lại từ đầu của vòng lặp bên trong, nơi nó trở nên rõ ràng tại sao có một thử nghiệm về tính phân chia theo yếu tố chính. Chúng tôi vừa chia cho hệ số nguyên tố nhỏ nhất của số; nếu số vẫn chia hết cho nhân tố đó, điều đó có nghĩa là số ban đầu có thể chia hết cho lũy thừa thứ tư của nhân tố đó. Lần đầu tiên thử nghiệm này được thực hiện là vô ích, nhưng 3 lần tiếp theo, nó xác định xem kết quả của việc chia hoàn toàn \2có còn chia hết hay không \2. Nếu nó vẫn chia hết cho \2vào đầu mỗi lần lặp của vòng lặp, thì điều này chứng tỏ rằng mỗi lần lặp chia số cho \2.

Trong ví dụ của chúng tôi, với đầu vào là 1296, điều này sẽ lặp lại như sau:

\2= 2
\4= 1296/2 = 648
\4= 648/2 = 324
\4= 324/2 = 162
\4= 162/2 = 81

Bây giờ regex có thể lặp lại bước đầu tiên; đây là những gì trận chung kết *làm Trong ví dụ này, 81 sẽ trở thành số mới; vòng lặp tiếp theo sẽ diễn ra như sau:

\2= 3
\4= 81/3 = 27
\4= 27/3 = 9
\4= 9/3 = 3
\4= 3/3 = 1

Bây giờ nó sẽ lặp lại bước đầu tiên một lần nữa, với 1 là số mới.

Số 1 không thể chia cho bất kỳ số nguyên tố nào, điều này sẽ làm cho nó không khớp với nhau (?=(xx+?)\2+$), do đó, nó thoát khỏi vòng lặp cấp cao nhất (số có *ở cuối). Bây giờ nó đạt đến x?$. Điều này chỉ có thể phù hợp với không hoặc một. Số hiện tại tại thời điểm này sẽ là 0 hoặc 1 nếu và chỉ khi số ban đầu là một quyền lực thứ tư hoàn hảo; nếu nó là 0 tại thời điểm này, điều đó có nghĩa là vòng lặp cấp cao nhất không bao giờ khớp với bất cứ điều gì và nếu là 1, điều đó có nghĩa là vòng lặp cấp cao nhất đã chia một sức mạnh thứ tư hoàn hảo xuống cho đến khi nó không thể chia hết cho bất kỳ thứ gì nữa (hoặc nó là 1 ở vị trí đầu tiên, có nghĩa là vòng lặp cấp cao nhất không bao giờ khớp với bất cứ điều gì).

Bạn cũng có thể giải quyết điều này bằng 49 byte bằng cách thực hiện phân chia rõ ràng lặp lại (cũng được tổng quát hóa cho tất cả các quyền hạn - thay thế công suất mong muốn trừ đi một {3}), nhưng phương pháp này rất xa, chậm hơn và giải thích về thuật toán mà nó sử dụng nằm ngoài phạm vi của Câu trả lời này:

^((x+)((\2(x+))(?=(\4*)\2*$)\4*(?=\5$\6)){3})?x?$

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


Từ thử nghiệm của tôi (tối đa 1024), có vẻ như đó là chính xác. Tuy nhiên, regex quá chậm - mất rất nhiều thời gian chỉ để khớp với độ dài 16 ^ 4, vì vậy rất khó để xác minh số lượng lớn. Nhưng vì hiệu suất là không bắt buộc, tôi sẽ nâng cao khi tôi hiểu regex của bạn.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Regex và tính biến động của bạn là tuyệt vời. Tốc độ và sự ngắn gọn của chúng làm tôi kinh ngạc, cả hai đều khớp 100000000 trong 7,5 giây trên i7-2600k của tôi, nhanh hơn nhiều so với tôi mong đợi là một regex. Giải pháp của tôi ở đây là ở một mức độ hoàn toàn khác, vì phải mất 12 giây để khớp với 50625. Nhưng mục tiêu với tôi không phải là tốc độ, mà là hoàn thành công việc với độ dài mã tối thiểu bằng cách sử dụng một bộ thao tác hạn chế hơn nhiều.
Deadcode

Câu trả lời của chúng tôi rất nhanh, vì họ hầu như không thực hiện bất kỳ quay lui nào. Bạn làm rất nhiều quay trở lại trong ((((x+)\5+)\4+)\3+)\2+$. Theo cách riêng của bạn, nó cũng tuyệt vời theo cách riêng của nó, vì tôi thậm chí không thể nghĩ ra làm thế nào để khớp với một số vuông mà không có phản hồi được tuyên bố trước.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Nhân tiện, câu hỏi này không phải là môn đánh gôn, mà là một câu đố. Tôi không đánh giá giải pháp theo chiều dài mã.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Oh. Điều đó giải thích tại sao bạn sử dụng (?:). Vậy tôi có nên chỉnh sửa câu trả lời của mình để biến phiên bản tối ưu hóa thành phiên bản chính không?
Deadcode

8

Dung dịch

^(?:(?=(^|(?<=^x)x|xx\1))(?=(^|\1\2))(^x|\3\2{12}xx))*$

Regex này tương thích với các hương vị Java, Perl, PCRE và .NET. Regex này sử dụng khá nhiều tính năng: nhìn về phía trước, nhìn phía sau và tham chiếu ngược được khai báo phía trước. Các loại tham chiếu ngược được tuyên bố ngược giới hạn khả năng tương thích của biểu thức chính quy này với một số động cơ.

Giải trình

Giải pháp này sử dụng các dẫn xuất sau.

Bằng cách mở rộng hoàn toàn tổng kết, chúng ta có thể chứng minh sự bình đẳng sau:

\ sum \ giới hạn_ {i = 1} ^ n (i + 1) ^ 4 - \ sum \ terms_ {i = 1} ^ ni ^ 4 = (n + 1) ^ 4 - 1
\ sum \ giới hạn_ {i = 1} ^ ni ^ 4 - \ sum \ giới hạn_ {i = 1} ^ n (i-1) ^ 4 = n ^ 4

Hãy để chúng tôi kết hợp tổng kết ở phía bên trái:

\ sum \ giới hạn_ {i = 1} ^ n (4 (i + 1) ^ 3 - 6 (i + 1) ^ 2 + 4 (i + 1) - 1) = (n + 1) ^ 4 - 1
\ sum \ giới hạn_ {i = 1} ^ n (4i ^ 3 - 6i ^ 2 + 4i - 1) = n ^ 4

Trừ 2 phương trình (phương trình đỉnh trừ đi phương trình đáy) và sau đó kết hợp các phép tính tổng ở phía bên trái, sau đó đơn giản hóa nó:

\ sum \ giới hạn_ {i = 1} ^ n (12i ^ 2 + 2) = (n + 1) ^ 4 - n ^ 4 - 1

Chúng tôi có được sự khác biệt giữa các quyền hạn thứ tư liên tiếp dưới dạng tổng sức mạnh:

(n + 1) ^ 4 - n ^ 4 = \ sum \ giới hạn_ {i = 1} ^ n (12i ^ 2 + 2) + 1

Điều này có nghĩa là sự khác biệt giữa các sức mạnh thứ tư liên tiếp sẽ tăng thêm (12n 2 + 2).

Để dễ suy nghĩ hơn, hãy tham khảo cây khác biệt trong câu trả lời của Biến động :

  • Phía bên phải của phương trình cuối cùng là hàng thứ 2 trong cây khác biệt.
  • Gia số (12n 2 + 2) là hàng thứ 3 trong cây chênh lệch.

Đủ toán học. Quay lại giải pháp trên:

  • Nhóm bắt giữ thứ nhất duy trì một chuỗi số lẻ để tính i 2 như đã thấy trong phương trình.

    Nói một cách chính xác, độ dài của nhóm bắt giữ thứ 1 sẽ là 0 (không sử dụng), 1, 3, 5, 7, ... khi vòng lặp lặp.

    (?<=^x)xđặt giá trị ban đầu cho chuỗi số lẻ. Nó ^chỉ ở đó để cho phép nhìn về phía trước được thỏa mãn trong lần lặp đầu tiên.

    xx\1 thêm 2 và tiến tới số lẻ tiếp theo.

  • Nhóm chụp thứ 2 duy trì dãy số vuông cho i 2 .

    Nói một cách chính xác, độ dài của nhóm bắt thứ 2 sẽ là 0, 1, 4, 9, ... khi vòng lặp lặp lại.

    ^trong (^|\1\2)bộ giá trị ban đầu cho dãy số vuông. Và \1\2thêm số lẻ vào số vuông hiện tại để chuyển nó sang số vuông tiếp theo.

  • Nhóm chụp thứ 3 (bên ngoài bất kỳ văn bản nhìn về phía trước và thực sự tiêu thụ văn bản) khớp với toàn bộ phía bên phải của phương trình mà chúng tôi đã dẫn ở trên.

    ^xtrong (^x|\3\2{12}xx)các giá trị ban đầu, là + 1phía bên phải của phương trình.

    \3\2{12}xxthêm sự gia tăng chênh lệch (12n 2 + 2) bằng cách sử dụng n 2 từ việc bắt nhóm 2 và khớp với sự khác biệt cùng một lúc.

Sự sắp xếp này là có thể do số lượng văn bản phù hợp trong mỗi lần lặp lớn hơn hoặc bằng số lượng văn bản cần thiết để thực hiện giao diện phía trước để xây dựng n 2 .

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.