# codewars解題心得 寫在前面: 3 月的時候好像是看到 Huli 老師ptt上的分享,就想要來寫 codewars ,但是不知道是自己手殘還是眼殘,在註冊要輸入的程式問題我竟然寫不出來,後來問人原來只要加上 <span class="code1">return</span> 就好。突然覺得之前在 FreeCodeCamp 寫 JavaScript 讓現在的自己充滿黑人問號,這其實是不同的世界吧? 拆開來變數、迴圈我都明白,放在一起要解題目就覺得有障礙。而且 FreeCodeCamp 有講解,有範例,照著做很快就寫出來了。 但是 Codewars 不一樣,你全都得自己想。 雖然在解題的時候感覺到腦袋在燃燒,還有懷疑自己的智商,但是最後解出來很有成就感,有一種:哇!原來解題是這麼有趣的一件事啊! 小結論: |學習程式網站|程度| |---|---| |FreeCodeCamp |適合全新手上手,解題後有顯示進度條,全部完成後可以得到一張證書。 |Codewars |適合有一點程式概念的人,比較像玩遊戲打怪破關,破關後還可以看到別人是怎麼解題滿不錯的。| ## 以下開始正式解題: **使用龜速刷提法,因為還有軟體乙級要練習,所以預計1~2天寫一題** ✅ 代表有通過關卡。 🔺 代表有嘗試寫但寫的不對,最後有看 Solution 解出來。 ❌ 代表沒有解出來或是還沒解的題目。 ## ✅ [Isograms 等距圖](https://www.codewars.com/kata/54ba84be607a92aa900000f1/javascript) 解題時間:5 月 6 號 星期三 在一開始英文就卡關了,看到介面研究很久,雖然讀一些文章的英文程度還是有的,但是都是不常見到的的單字,這裡眼冒星星,就依靠 Google 翻譯還有舉例程式碼的結果,大概了解題目的意思。 如果有相同的英文字母就回傳 false ,反之沒有回傳 true ``` isIsogram("Dermatoglyphics") == true isIsogram("aba") == false isIsogram("moOse") == false // -- ignore letter case ``` 這是我第一次寫的程式碼: ```javascript= function isIsogram(str){ var str = str.toString(); for(var i = 0; i < str.length; i++){ for(var j = 0; j < i; j++){ if(str[i] === str[j]){ return false; } } } return true; } ``` <div class="codewars__error"> <i class="fas fa-info-circle"></i> same chars may not be same case - Expected: 'false', instead got: 'true' </div> 忘記判斷英文的大小寫了,補上 toUpperCase 就過了。 ```javascript= var str = str.toUpperCase(); str.toString(); ``` ## 🔺 [Binary Addition 二進制加法](https://www.codewars.com/kata/551f37452ff852b7bd000139/javascript) 解題時間: 5 月 6 號 星期三 這題要求的是二進制,經詢問友人說明 <span class="code1">toString(2)</span> 就可以變成2進制, 以下同理 > <span class="code1">toString()</span> 預設是10進制 <span class="code1">toString(8)</span> 轉成8進制 <span class="code1">toString(16)</span> 轉成16進制 這大概就是這題的大魔王,要是不知道怎麼轉換進制就會卡半天(就是我) 解題卡關,解鎖查看 Solution 闖關不成功 ```javascript= function addBinary(a,b) { return (a+b).toString(2); } ``` ## 🔺 [String repeat 字串重複](https://www.codewars.com/kata/57a0e5c372292dd76d000d7e/javascript) 解題時間: 5 月 8 號 星期五 (大約用一個多小時解題,超龜速) 這題的題目看得懂,第一個值數字是多少,第二個值就要顯示多少次。 如果第一個數字是6, I 就顯示6次 一開始以為是相乘,後來覺得應該是用迴圈 但是結果一直有錯,不知道是什麼問題 ``` repeatStr(6, "I") // "IIIIII" repeatStr(5, "Hello") // "HelloHelloHelloHelloHello" ``` 第一次寫出來的結果是這樣: ```javascript= function repeatStr (n, s) { for(var i = 0; i<n; i++){ return s[i]; } } ``` <div class="codewars__error"> Expected: '\'ha ha \'', instead got: '\'h\'' </div> 好吧我也知道寫出來怪怪的,不知道怎樣取得 n 的值 第二次寫: 結果是'NaN',好像錯的更離譜哈哈 ```javascript= function repeatStr (n, s) { var n = n.Number; var s = s.String; return n*s; } ``` 最後想破頭還是不知道,就解鎖看了,原來是有函數可以用...好吧破關不成功但學了一個函數 <span class="code1">repeat(n)</span> 第二個 Solition 跟我第一次寫得好像! ```javascript= function repeatStr (n, s) { return s.repeat(n); } ``` ```javascript= function repeatStr (n, s) { var str=""; //這裡我個人覺得用 '' 會比較好 for(var i=0; i < n; i++) str+=s; //str = str + s return str; } ``` 這裡不懂為什麼 **str+=s** 回傳的值就會正確,詢問友人是因為` '' `會把回傳的內容變成字串,就不會相乘。 `var str="";` 代表設定是一個空的字串,所以不管打什麼進去都變成文字類型,懂了! 這個寫法我也覺得滿不錯的: ```javascript= function repeatStr (n, s) { var myString = ''; //宣告為字串 while(n > 0) { //當n>0的時候 myString += s;  //執行 myString = myString + s n--; //每做一次 n 就減 1 ,直到 n 沒有大於 0 } return myString; } ``` ## ❌ Build a pile of Cubes 建立一堆立方體 ## ✅ [Opposite number](https://www.codewars.com/kata/opposite-number/javascript) 解題時間: 5 月 11 號 星期一 (大約 5 分鐘內) 我是這樣寫: ```javascript= function opposite(number) { return (number * -1); //your code here } ``` 過關後查看 Solution 更簡單的寫法是直接回傳負數值。 <span class="code1">return (-number); </span> ## ✅ [Even or Odd 判斷基數或偶數](https://www.codewars.com/kata/even-or-odd/javascript) 解題時間: 5 月 11 號 星期一 (大約 5 分鐘內) ```javascript= ```javascript= function even_or_odd(number) { if(number % 2 ===1){ return "Odd"; }else{ return "Even"; } } ``` <div class="codewars__error"> even_or_odd(-3) - Expected: 'Odd', instead got: 'Even' </div> 有一個錯誤,負數沒有判斷到,所以 if 判斷式補了 <span class="code1">`|| -number % 2 ===1`</span> 就過了。 完整過關程式碼如下: ```javascript= function even_or_odd(number) { if(number % 2 ===1|| -number % 2 ===1){ return "Odd"; }else{ return "Even"; } } ``` 一樣查看 Solution 看到有更簡潔的寫法,但是我還是會習慣寫 if & else ,因為比較好閱讀有語意。 <span class="code1"> ? : </span> 的寫法也許未來會用在只有一行程式的時候。 ```javascript= function even_or_odd(number) { return number % 2 ? "Odd" : "Even" } ``` ## ✅ [Number-Star ladder](https://www.codewars.com/kata/5631213916d70a0979000066/train/javascript) 解題時間: 5 月 11 號 星期一 (大約卡關 3 個小時吧...) ![](https://i.imgur.com/QVV74z2.png) 第一次寫這樣: ```javascript= function pattern(n){ var output=""; var star = '*'; //being coder for(var i = 0; i < n; i++){ return 1 + "\n" + star.repeat(n) + "\n" + n; } return output; } ``` <div class="codewars__error"> Expected: '1\n1*2\n1**3', instead got: '1\n***\n3' </div> 第二次用堆疊的寫上去。哈哈 ```javascript= function pattern(n){ var output=""; var star = '*'; //being coder for(var i = 0; i < n; i++){ return 1 + "\n1" + star.repeat(n-2) + (n-1) + "\n1" + star.repeat(n-1) + n; } return output; } ``` 雖然前面對了但是後面的條件不符合,我知道是用迴圈寫,但是具體位置不知道怎麼寫。 <div class="codewars__correct"> Test Passed: Value == '1\n1*2\n1**3' </div> <div class="codewars__error"> Expected: '1\n1*2\n1**3\n1***4\n1****5\n1*****6\n1******7', instead got: '1\n1*****6\n1******7' </div> 嘗試了很久,切割的位置還是不太對 ```javascript= function pattern(n){ var output=""; var star = "\n1*"; for(var i = 0; i < n; i++){ output += star.repeat(i) + (i+1); } return output; } ``` <div class="codewars__error"> Expected: '1\n1*2\n1**3', instead got: '1\n1*2\n1*\n1*3' </div> ```javascript= function pattern(n){ var output=""; var str = "\n1"; var star = "*"; for(var i = 1; i < n; i++){ output += i + str.repeat(i) + star.repeat(i); } return output + n; } ``` <div class="codewars__error"> Expected: '1\n1*2\n1**3', instead got: '1\n1*2\n1\n1**3' </div> 最後是莫名其妙寫出來了... "\n1" 根本不用寫 repeat 耶。 看到自己重複很多次 "\n1" 應該要想到的,只能說自己當下**已經陷入思考迴圈**裡了哈哈。解出來才真的**跳出思考迴圈**客觀的看自己的答案。 ```javascript= function pattern(n){ var output=""; var str = "\n1"; var star = "*"; if(n === 1){ return 1; } for(var i = 1; i < n; i++){ output += i + str + star.repeat(i); } return output + n; } ``` ![](https://i.imgur.com/yIJmnq2.png) *看到這個畫面好激動啊!!! 截圖記錄一下^^* ###### tags: `程式筆記` `筆記` <span class="code1"></span> <style> a { text-decoration: none; color: #333333; } h4 { color: #2383B8; } h2 { padding-top: 30px; /* color: #1AA340; */ } h3 { color: white; background-color: #2383B8; padding:8px; } .codewars__error { padding: 5px 10px; margin-bottom: 10px; color: #c05c48; background-color: #333434; } .codewars__correct { padding: 5px 10px; margin-bottom: 10px; color: #67b04b; background-color: #333434; } .code1 { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; font-family:'Fira Code'; } .code { padding: 2px 4px; font-size: 90%; font-family:'Fira Code'; } </style>