Codewars Find X II in golang

想不到一眨眼半個月過去了,自從面試趨勢之後整個人彷彿被電到失去信心,在離職與等待面試消息期間,也只好振作補足不足的地方繼續向前。 而 docker 學習心得何時會產出呢?在學習過程中發現除了一般操作(day1 內容)外,底層或多 container 溝通都是大量的網路觀念與知識,需要更多知識量才能整理成筆記,不急不急。 由於學習過程發現而這段時間在 coding 能力上主要還是靠 codewars 上的題目,畢竟解完後能看別人的 code 來檢視自己的 code 能不能更好。其中不免遇到一些覺得很有趣的題目,好比這題 Find X II,他並不是什麼過分難的題目,邏輯也不是很難通,畢竟只是一個 6 kyu 的題目,但為何快一年了只有 44 個人解完呢,這就牽扯到下面要說的。 題目概要 有下一段程式碼: func FindX(n int) int { if n == 0 { return 0 } x := 0 for i:=1; i<=n; i++ { x += FindX(i-1) + 3*i } return x } 但 x 範圍為 1 <= n <= 10**6(1e6) ,請試著重構。且當 n 愈來試大時,可能會超過 int64 表達,故需要將結果對 10**9 + 7 取模...

2020-03-03 · 1 min · 188 words

威康生命遊戲 in PHP

威康生命遊戲 in PHP 生命遊戲,無論在程式、哲學、生命探討上都十分有趣,在生命遊戲中甚至出現永動機。而在 Codewars 中也有生命遊戲的 題目,規則也十分簡單,以下為維基百科的內容: 1. 每個細胞有兩種狀態 - 存活或死亡,每個細胞與以自身為中心的周圍八格細胞產生互動(如圖,黑色為存活,白色為死亡) 2. 當前細胞為存活狀態時,當周圍的存活細胞低於2個時(不包含2個),該細胞變成死亡狀態。(模擬生命數量稀少) 3. 當前細胞為存活狀態時,當周圍有2個或3個存活細胞時,該細胞保持原樣。 4. 當前細胞為存活狀態時,當周圍有超過3個存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多) 5. 當前細胞為死亡狀態時,當周圍有3個存活細胞時,該細胞變成存活狀態。(模擬繁殖) 若想知道關於更多可以觀看上方由混亂博物館出品的影片,此篇就針對這 4kyu 的題目進行探討解法。首先題目中指出這個宇宙的 x,y 軸都是無限大的,所以生成高斯帕機槍且迭代過多次可能造成記憶體使用過量。 迭代 首先題目給定一個二維矩陣以及迭代次數(世代),而需取得過了該迭代次數後的情形。 function get_generation(array $cells, int $generations): array { if($cells == []) return [[]]; $w = count($cells); $h = count($cells[0]) for ($index = 0; $index < $generations; $index++) { $cells = getNextGen($cells, $w, $h); $sum = 0; foreach ($cells as $row) { $sum += array_sum($row); } if ($sum == 0) { return [[]]; } } return $cells; } 於是可以建立一個方法 getNextGen 來獲取下個世代的結果...

2020-01-23 · 3 min · 490 words

Evaluate mathematical expression in PHP

四則運算,不多,不就是加減乘除而已嗎,怎麼會在 Codewars 中被標記為 2 kyu 的題目呢? 總覺得這篇標題應該改為「Codewars 從入坑道棄坑,只需要一題就搞定」。首先我是在 2019 年底才接觸 Codewars,這種打怪練功的感覺讓我一下就上癮了,每天都在想今天能不能再拚一階,或是這題用另外一個語言會不會比較省時間。直到遇到了這題,足足卡了一整天。下面就來介紹一下四則運算在 PHP 中的解法吧。 先乘除後加減,看到括號先做 先舉一個簡單的例子 a+b 該怎麼做呢,有學過一點資料結構的應該很快就會回想起「中序轉後序」。 首先會需要將引入的字串轉為中序 // 123 + 456 * -789 // => // ['123', '+', '456, '*', '-', '789'] function isOp(string $s): bool { return strpos("+-*/", $s) !== false ? true : false; } function changeStringToInfix(string $expression): array { $infix = []; $count = strlen($expression); for ($i = 0; $i < $count; $i++) { if (isOp($expression[$i]) === false) { $j = $i; while ($i < $count && (isOp($expression[$i]) === false)) { $i = $i + 1; } $infix[] = substr($expression, $j, $i - $j); $i = $i - 1; } else { $infix[] = substr($expression, $i, 1); } } return $infix; } 這時候可能有眼尖的會發現,不對阿中序怎麼可以兩個運算子(’*’, ‘-’)連在一起,恭喜你踩進四則運算第一個坑:負號可能是負號也可能是減號。於是可以使用一個偷吃步的方式,將運算子後的負號一率改成另一個代表負號的特殊符號,比如「@」。而這步可以使用正規表達式輕鬆辦到。...

2020-01-16 · 3 min · 520 words