文章

魔方研究

圖片
  射鵰英雄傳 瑛姑 在黑沼 隱居十餘年 計算魔方3x3 (洛書)。 3x3 有 (9!)=362,880個組合,其中有4(旋轉)x4(鏡射)=16 個解答。 當中要符合'米'字計算結果相同,中心必須為5。 成 8! 組合。 然後有四對數必須在'米'字相對:1-9, 2-8, 3-7, etc. (續 ⋯⋯ ) 講返瑛姑,362880 ÷ 365日 ÷ 10小時 ÷ 4個骨 ==> 不遇見黃蓉的話,最壞情況可望在24年10個月算出答案。 今時今日,一台舊電腦,walk through.. 2 秒 $ time node square.js [ 2, 7, 6, 9, 5, 1, 4, 3, 8 ] real 0m1.742s user 0m2.097s sys 0m0.173s (edited 2021) 興起一個想法:3x3x3 cube 有沒有solution? 遍歷是不太可能的了,以代入的方式減少計算量至可能範圍,可惜結果為不存在解答。 (edited 2024) 維基有人造出3x3x3 立方,但我不喜歡這個解答,必須穿過立方中心、或者8條邊上的和才等於42, 但六個面上的對角線和則各有不同。 https://en.wikipedia.org/wiki/Magic_cube 事實上,正如之前提到,我已確認不存在能符合任直線三點和的解。

用 遞迴 (Recursion) 由零實作 RegEx 解析器(遲來的README)

圖片
Recursion  在現實生活中很少見, 展示的例子一般有 斐波那契數列 ( Fibonacci sequence) 、堆棧(stack)的先入後出(first in last out)、遍歷上色問題(cell painting) 等。 2009年我用「 間接遞迴 ( Indirect Recursion)」(當時我稱之為「 多重遞迴  Double Recursion」) ,輔以 function pointers 實作了一個 正則表達式 (Regular Expression) 的 解析器 (parser)。Google 的結果告訴我,用這 方法 實作是首創。稍後有幾間公司連絡我,把我的算法整合到他們的內部程式庫,應用例子有 web-based coding sandbox 和 網頁的 script interpreter engine。 Recursion 的概念,簡單來說就是「自己叫自己」。結構包括兩部份:終結條件(terminating condition) 和 遞迴的表達式 (expression)。 簡單例子如下: 上面僅用兩行程式碼,便能計算 (1 * 2 * 3 * ... * n-1 * n) 的結果: > mul(1) 1 > mul(2) 2 > mul(3) 6 > mul(4) 24 > mul(5) 120 遞迴的好處 是 程式碼很簡練(compact),編譯後的二元碼很小,例如我的 regex engine 只有 5 KB,Lite version 更少於 2KB。普通一部家用電腦的記憶體,可平衡執行成千上萬個實體。 遞迴的缺點是難以預測需要多少記憶體、難偵錯、稍一不慎便會墮入無限迴旋(infinite loop)。現實世界的其中一個解決辦法,是 Circuit Breaker。 「間接遞迴」(或「多重遞迴」) 的 概念為:           A(x) --> B(y) --> ... --> A(z)  用在正則表達式 ,使用時機在於括弧,例如:           pattern = "abc(def(gh){2,4})+i...