關注微信:DuoDaaMath 每天獲得更多數學趣文
作者,Steven Levithan
翻譯,radium,哆嗒數學網翻譯組成員,數學專業(yè)學生
用正則表達式并不擅長解決數學問題。對一個正則表達式系統,字符從0到9,和其他的一樣,并沒有什么特殊的地方。
在這里我需要提到兩個例外Perl和PCRE,這兩個例外允許動態(tài)代碼在匹配過程中的任何一點上運行,這為我們提供了大量額外的契機。Perl是通過代碼嵌入正則表達式,PCRE用標注系統去表達外部函數。但正則表達式偏好這些例外,甚至利用他們去拓展自己的能力,讓方程式告訴你更多,呈現的更完整。一般的,有關數學的問題像匹配數值范圍(matching numeric ranges)(在匹配一些需畫大量時間的長文本的任務上很有用)在運行中是一個痛,如果他們有可能的話。
但是在最基本的正則表達式的系統中,這種力量和表現可以引導出一些漂亮的技巧。就像匹配非素長度字符串一樣!這時基礎的正則表達式就有些出名了。就連一個黑客也會驚訝你是用的是正則表達式來解決的一個簡單的線性方程組。我在擺弄 RegexBuddy's 的調試器時無意中蹦出了這個想法。嚴格的POSIX ERE的實現和其他深邃的味道,不允許反向引用,因此執(zhí)行本生是簡單的,工作也相當普遍。這里有一個樣板:
^(.*)\1{A?1}(.*)\2{B?1}$
現在讓我們來解關于x和y的方程,像17X 12y=51 ,A和B是常量占位符對應這個例子中的17和12.所以正則表達式成為 ^(.*)\1{16}(.*)\2{11}$
我們從A,B值中減去1因為我們重復反向引用,而子模式之前已經匹配過一次。如果你運行正則表達式去對付51字符串,當長度為$1
時(反向引用1)將會是3(這就告訴我們x=3),當長度為$2
時(反向引用2)將會是0(意味著y=0)事實上17*3 12*0=51.如果方程沒有解,那么正則表達式將無法匹配字符串。如果方程有多種可能的解,那么返回的是x的最大值,因為這個值最早被處理。
快來嘗試吧!你可以用正則表達式來解各種各樣的你喜歡的形式類似的方程。例如11x 2y 5z=115可以用 ^(.*)\1{10}(.*)\2{1}(.*)\3{4}$
和115字符的源串來解決(結果是11*10 2*0 5*1=115)。運行 ^(.*)\1{12}$
去對付247字符的字符串,那么你將會因為反向引用一次得到一個19字符的值,像13*19=247.請記住,隨著整數和字符串的長度的增加,變量的數目增加,通過正則表達式軟件的回溯的數量也會增加。對于一些圖像的門欄這種方法是很慢的甚至無用的。但我不在乎,他依然很酷!
關注微信:DuoDaaMath 每天獲得更多數學趣文