# 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`