威康生命遊戲 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

PHP ENUM 偽實現

Enumerations 又可簡稱為 Enum ,在眾多語言中都可以讓程式碼更高效簡潔,例如我們可以在 python 中這麼宣告,並且用 requests 模組打一個 request,即可透過 Enum 來模組化 Response import enum import request class HTTPResponsecode(enum.Enum) OK = 200 BAD_REQUEST = 400 NOT_FOUND = 404 r = requests.get('https://omegaatt.com/') print(r.status_code == HTTPResponsecode.OK) # True 但是在 PHP 中原生是沒有內建 Enum 的,必須安裝 perl 的 SplEnum 類套件庫,方能直接使用 Enum 的功能。或是可以透過以下的方式達到接近的效果。 極簡易版 Enum 首先,建立一個 Enum 類,一樣舉例為 HTTP 的 response code abstract class HTTPResponsecodeEnum { const OK = 200; const BAD_REQUEST = 400; const NOT_FOUND = 404; } 這樣就完成最基本的 Enum 拉,只要透過簡單的 if 判斷便能輕鬆享受打包的方便...

2020-01-15 · 2 min · 298 words