# Codewars 練習題 Codewar 是一個程式解題平台,上面充滿著各種開發者出的題目,會使用這個平台的理由為: 1. 可以自己寫測試驗證基本測資 2. 過關後可以看到其他人的解答 3. 方便導師追蹤解題成效 ## 注意事項 解題最重要的一點就是:絕對不要輕易看答案。為什麼解題能夠成長?是因為你有思考,思考過後想出來的答案才是你的,如果你放棄了然後去看別人的答案,那就始終是別人的,不會是你自己的。 想了一陣子還是想不出來的話,不用急,去洗個澡或是散個步搞不好就想通了(真心不騙) 若是認真想過還是想不出來,這時候可以先尋求一些提示,如果還是沒頭緒,這時候才能去查解答。但看完解答之後務必理解,並且重新再測驗一遍。 做完之後請自行把標題的 ❌ 換成 ✅。 ## 題目列表 以下按照題目難度分類 ## 零顆星(超簡單) ### ✅ Opposite number 題目連結:https://www.codewars.com/kata/opposite-number/javascript 題目說明:正數變負數,反之亦然 #### Solutions: ``` javascript function opposite(n) { return (-n); } ``` ES6 ``` javascript const opposite = n => -n; ``` ### ✅ Even or Odd 題目連結:https://www.codewars.com/kata/even-or-odd/javascript 題目說明:判斷是奇數或是偶數 #### Solutions: ``` javascript function even_or_odd(n) { if (n % 2 == 0) { return "Even"; } else { return "Odd"; } } ``` ES6 ``` javascript const even_or_odd = n => (n % 2 == 0) ? "Even" : "Odd"; ``` ## 一顆星(熟悉語法) ### ✅ Number-Star ladder 題目連結:https://www.codewars.com/kata/number-star-ladder/javascript 題目說明:這題就是依照規律輸出文字,沒什麼好講的 類似題目:[LIOJ-1021 好多星星](https://oj.lidemy.com/problem/1021) #### Solutions: ``` javascript function pattern(n){ let output = 1; let star = "*"; for (let i = 1; i < n; i++) { output += "\n" + 1 + star + (i + 1); star += "*"; } return output; } ``` ES6 ``` javascript const pattern = n => n === 1 ? 1 : `${pattern(n - 1)}\n1${Array(n).join('*')}${n}`; ``` ### ✅ Who likes it 題目連結:https://www.codewars.com/kata/who-likes-it 題目說明:模擬 Facebook 按讚時或出現的文字 #### Solution: ``` javascript function likes(names) { let len = names.length; let str = 'like this'; if (len === 0) { return 'no one likes this' } else if (len === 1) { return `${names[0]} likes this` } else if (len === 2) { return `${names[0]} and ${names[1]} ${str}` } else if (len === 3) { return `${names[0]}, ${names[1]} and ${names[2]} ${str}` } else { return `${names[0]}, ${names[1]} and ${len - 2} others ${str}` } } ``` (直覺是用最容易理解的 if, else 判斷即可) ### ✅ String repeat 題目連結:https://www.codewars.com/kata/string-repeat/javascript 題目說明:回傳重複 n 遍的字串 #### Solutions: ``` javascript function repeatStr(n, s) { let output = ''; for (let i = 0; i < n; i++) { output += s } return output; } ``` JavaScript built-in objects [String.prototype.repeat()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat) ``` javascript function repeatStr(n, s) { return s.repeat(n) } ``` ES6 ``` javascript const repeatStr = (n, s) => s.repeat(n); ``` ### ✅ Build Tower 題目連結:https://www.codewars.com/kata/build-tower 題目說明:也是依照規律輸出文字即可 類似題目:[LIOJ-1022 印出金字塔](https://oj.lidemy.com/problem/1022) (要注意這題的 output 是用 Array 呈現) #### Solutions: ``` javascript function towerBuilder(nFloors) { let tower = []; for (var i = 0; i < nFloors; i++) { tower.push(" ".repeat(nFloors - i - 1) + "*".repeat(i * 2 + 1) + " ".repeat(nFloors - i - 1)); } return tower; } ``` 將重複的程式碼抽出,let i 從 1 開始 ``` javascript function towerBuilder(nFloors) { let tower = []; for (let i = 1; i <= nFloors; i++) { const spaces = " ".repeat(nFloors - i); const stars = "*".repeat(i * 2 - 1); tower.push(spaces + stars + spaces); } return tower; } ``` ### ✅ Reversed Strings 題目連結:https://www.codewars.com/kata/reversed-strings/javascript 題目說明:把輸入的文字反轉過後回傳,如果想挑戰自己的話,可以試試看用陣列的各種內建函式組合完成 #### Solutions: ``` javascript function solution(str){ return str.split("").reverse().join(""); } ``` ES6 - [Spread syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax) ``` javascript const solution = str => [...str].reverse().join(""); ``` ### ✅ Reversed Words 題目連結:https://www.codewars.com/kata/reversed-words 題目說明: 這一題是進階版的字串反轉,原本的只要把每個「字元」反轉,這個則是要把每個「單字」反轉。 #### Solutions: ``` javascript function solution(str){ return str.split(" ").reverse().join(" "); } ``` ES6 ``` javascript const reverseWords = str => str.split(" ").reverse().join(" "); ``` ### ❌ Alternate case 題目連結:https://www.codewars.com/kata/alternate-case 題目說明:把大寫字母轉成小寫,小寫字母轉成大寫 ### ❌ You only need one - Beginner 題目連結:https://www.codewars.com/kata/you-only-need-one-beginner/javascript 題目說明:回傳要找的元素是否在陣列裡面 ### ❌ Find the capitals 題目連結:https://www.codewars.com/kata/find-the-capitals-1/javascript 題目說明:回傳大寫字母所在的 index ### ❌ Sum arrays 題目連結:https://www.codewars.com/kata/sum-arrays/javascript 題目說明:把陣列加總回傳結果 ### ❌ Find the smallest integer in the array 題目連結:https://www.codewars.com/kata/find-the-smallest-integer-in-the-array 題目說明:找出陣列中最小的數字 ## 兩顆星(需要花點時間思考) ### ❌ Shortest Word 題目連結:https://www.codewars.com/kata/shortest-word/javascript 題目說明:回傳最短的單字的長度 ### ❌ Bit Counting 題目連結:https://www.codewars.com/kata/bit-counting/javascript 題目說明:計算 bit 的總數 ### ❌ Find The Parity Outlier 題目連結:https://www.codewars.com/kata/find-the-parity-outlier/javascript 題目說明:全部的數字裡,只有一個的奇偶跟其他的不一樣,你要找出這個數字 ### ❌ Take a Ten Minute Walk 題目連結:https://www.codewars.com/kata/take-a-ten-minute-walk/javascript 題目說明:有一個人他可以往東南西北這四個方向走,請幫他計算它能否剛好在十步的時候回到原點 ### ❌ Tribonacci Sequence 題目連結:https://www.codewars.com/kata/tribonacci-sequence/javascript 題目說明:費式數列的進階版 ### ❌ A Man and his Umbrellas 題目連結:https://www.codewars.com/kata/a-man-and-his-umbrellas/javascript 題目說明: 這題需要花多一點時間去思考。 input 會給你每天的氣象預報,基本上就是下雨跟沒下雨。如果早上下雨,那就會從家裡帶一把傘去公司,如果家裡沒傘的話需要買一把。如果晚上下雨,必須要從公司帶一把傘回家。如果公司沒傘,必須去買一支傘。 你要輸出的結果就是:總共需要買幾支傘才行。 舉例來說:`["rainy", "clear", "rainy", "cloudy"]`,就是第一天早上下雨,所以要買第一把傘到公司,回家的時候沒下雨,所以把傘放在公司。而第二天早上又下雨,家裡沒傘,需要買第二把傘,因此答案是 2。 `["rainy", "rainy", "rainy", "rainy", "thunderstorms", "rainy"]`的話,每一天的早上跟晚上都在下雨,所以只要買一把傘就可以從家裡到公司,再從公司帶回家裡。 ### ❌ Check if two words are isomorphic to each other 題目連結:https://www.codewars.com/kata/check-if-two-words-are-isomorphic-to-each-other 題目說明: 這題比較複雜一點,如果兩個字串 A 跟 B 存在「一對一關係」,那我們就可以說這兩個字串是同構(isomorphic)的。 舉例來說,ABB 跟 CDD,A 對應到 C,B 對應到 D,存在一對一的關係,所以是同構的。 ## Fork from [mentor-program-4th](https://github.com/Lidemy/mentor-program-4th/blob/master/codewar.md) ###### tags: `JavaScript`