CodeWars 形象挺有禪意

[CodeWars] 解題: Simple Fun #116: Prime String — 6 kyu

Steven C.
From Zen to Code
Published in
4 min readMay 19, 2019

--

找出規律的藝術

CodeWars 是我在走跳的刷題網站,相關介紹請參考
透過 codewars 修練 Swift 解題技巧』 by 彼得潘的 iOS App Neverland

Codewars 上的題目根據不同程度的定義和要求,分為最簡單的 8 kyu 到最難的 1 kyu,送交自己的答案之後就可以看到其他 Code Warriors 的解法和各種奇思妙想。

題目分為最簡單的 8 kyu 到最難的 1 kyu

今天來談談這讓我徹夜難眠的一題:難度 6 kyu 的
Simple Fun #116: Prime String

為了練習初學的 JavaScript 語法,解這題大約花了我 4 個小時,可以說是嚴重卡關,食不下嚥,寢不成寐。

熬到好不容易解完,才開心了幾秒,看見大家票選的 Best practice,
那優雅的解法一字一字映入眼簾,彼時我的內心震動,良久不能自已⋯⋯

『這就是我和世界的差距?』

劇透警告!
本帖含有解答說明,如果你看過題目後希望自己先嘗試挑戰,請謹慎服用。

Spoiler alert!
Do not read down if you want to solve this kata by yourself.

Prime 代表質數的意思,除了 1 以外不能被任何數整除,以此延伸來看題目的 “Prime String” 就很容易理解題意。

我們的任務是要定義一個方法 primeString() 檢查輸入的字串是否由連續的重複字串組合而成(意即能被某字串”整除“):

例如 “steven” 就是個『質數字串』,而 “xyxy” 則否(“xyxy” = “xy” + “xy”)。

待測試的輸入是英文小寫字母,輸出要求回傳布林值,如果是質數字串則回傳 true

簡單測試長得像這樣:

JavaScript

primeString_simple_test.js

我的方法

我的邏輯是將輸入字串中的某個字元作為分割陣列的符號,將其拆成具有某種規律的陣列,例:

'qiuefgqiuefgqiuefg'.split('q') // [ '', 'iuefg', 'iuefg', 'iuefg' ]

如此將第一個空元素去掉即可得到整齊的陣列,接著統計陣列中每個元素的數量,如果每個元素出現的次數都完全相同,就代表此輸入字串可以被整除。

primeString.js

以上是我的作法,將近 10 行,接著來看看大家選出的 Best practices:

Best practice & The most Clever

JavaScript

primeString_best_practice.js

Ruby

primeString_best_practice.rb

舉個例子解釋:
“steven” 字串長度為 6,其中各個字母的 index 則是 0 ~ 5,

字串中的 Index

先將字串變成兩倍長,並從 index 1 號位置開始找尋比對原始的字串:

從 index 1 一直搜尋到 index 6

可以看到如果以『質數字串』下去比對,一定會在正好等於原始字串長度的位置(index 6)比對出來。

如下所示,輸入 “xyxy” 則會在 index = 2 的位置找到:

比對重複的模式

Regular expression

如果熟悉使用正規表達式,用群組的方式比對也是很快:

JavaScript

primeString_best_practice_exp.js

In Ruby

primeString_best_practice_exp.rb

Recursive

Tai An Su 老師提出的遞迴解法,這邊我盡可能地將自己的理解寫在備註中。

JavaScript

primeString_iteration_by_tainasu.js

就這樣,和世界的差距又縮小了,覺得非常開心!

Keep Coding 🙌

--

--

Steven C.
From Zen to Code

“Life’s like a movie, write your own ending.” — Jim Henson