---
title: Codewars刷題 1~10
tags: codewars,
description:
---
Codewars刷題 1~10
===
#### 1.此程式碼無法正確執行,請試著找出原因。

Ans:==缺少return==,無法將```a * b```的值回傳。
```javascript=
function multiply(a, b){
return a * b
}
console.log(multiply(2, 3)); //6
```
<br>
---
#### 2.創造一個函式,把數字代入參數,將會回傳此數字為偶數(even)或奇數(odd)。
```javascript=
function even_or_odd(number) {
if (number % 2 === 0){
return `輸入的數字${number}為偶數(even)`;
} else {
return `輸入的數字${number}為奇數(odd)`;
}
}
console.log(even_or_odd(123)); //輸入的數字123為奇數(odd)
```
- ==三元運算子==的解法
```javascript=
function even_or_odd(number) {
return number % 2 === 0 ? `此數字${number}為偶數(even)` : `此數字${number}為奇數(odd)`;
};
console.log(even_or_odd(123)); //輸入的數字123為奇數(odd)
```
延伸閱讀
- [餘數運算子 (%)](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Remainder)
<br>
---
#### 3.迴圈方式,執行第一次將星星加入str左邊,執行第二次將星星加入str右邊,以此類推。
- 用```if else```、```for```迴圈的解法
```javascript=
function padIt(str, n) {
for (let i = 0; i < n; i++) {
str = i % 2 === 0 ? `*${str}` : `${str}*`;
// 執行迴圈,i從0、1、2遞增
// 每次都從餘數判斷是否為odd或even(三元運算子)
// odd執行`*${str}`
// even執行`${str}*`
}
return str;
};
console.log(padIt('welcome', 0));
console.log(padIt('welcome', 3));
console.log(padIt('welcome', 10));
```
- 用```while```的解法
```javascript=
function padIt(str, n) {
while (n > 0) {
str = n % 2 === 0 ? `${str}*` : `*${str}`;
n--;
}
return str;
};
console.log(padIt('welcome', 0));
console.log(padIt('welcome', 1));
console.log(padIt('welcome', 3));
console.log(padIt('welcome', 10));
```
延伸閱讀
- [while語法](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/while)
<br>
---
#### 4.連續奇數的三角形,計算該三角形第 n 行中數字的總和,從第一行開始

三角形的每層加總和,剛好是第n層^3^。
```javascript=
function rowSumOddNumbers(n) {
return Math.pow(n, 3);
}
console.log(rowSumOddNumbers(5)); //125(三角形第五層奇數的總和)
```
延伸閱讀
- [Math.pow()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Math/pow)
<br>
---
#### 5.移除字串第一個字符及最後一個字符
```javascript=
function removeChar(str){
// slice(begin,end)
// 從第2個字元~倒數2個字元保留,其他去除
return str.slice(1, -1);
// str.slice(2); 字串的第三個字元開始保留,其他去除
// str.slice(-2); 字串的倒數第二個字元開始保留,其他去除
};
console.log(removeChar('abcde'));
```
延伸閱讀
- [Array.prototype.slice()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
<br>
#### 6.代入數字,把大於0的數字加上負號,等於0或小於0則不變。

- num > 0,執行-parseFloat(num, 10)
- num < 0,執行parseFloat(num, 10)
- 如果代入'123'或'1.23' ,parseFloat(num, 10)轉成**十進制 number型別**
```javascript=
function makeNegative(num) {
return num > 0 ? -parseFloat(num, 10) : parseFloat(num, 10);
};
console.log(makeNegative(3)); // 3
console.log(makeNegative('-42')); // -42
console.log(typeof makeNegative('-42')); // number
console.log(makeNegative(0)); // 0
console.log(makeNegative(0.12)); // 0.12
console.log(makeNegative(0.00001)); // -0.00001
```
- 用``Math.abs()``的解法
```javascript=
function makeNegative(num) {
return num > 0 ? -Math.abs(num) : Math.abs(num);
};
console.log(makeNegative(3)); // 3
console.log(makeNegative('-42')); // -42
console.log(typeof makeNegative('-42')); // number
console.log(makeNegative(0)); // 0
console.log(makeNegative(0.12)); // 0.12
console.log(makeNegative(0.00001)); // -0.00001
```
延伸閱讀
- [Math.abs()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Math/abs)
<br>
---
#### 7.數羊
把陣列裡正確(true)的羊群計算出來。
``const sheep = [
true, true, true, false,
true, true, true, true,
true, false, true, false,
true, false, false, true,
true, true, true, true,
false, false, true, true,
];``
- 利用for迴圈把陣列的值一一比對去計算。
```javascript=
function countSheeps(arrayOfSheep) {
let sheepNum = 0;
for(let i = 0; i < sheep.length; i++) {
if(arrayOfSheep[i] === true) {
sheepNum ++;
} else {
sheepNum += 0;
}
}
return sheepNum;
};
console.log(countSheeps(sheep));
```
- 用``filter``的解法
```javascript=
function countSheeps(arrayOfSheeps) {
return arrayOfSheeps.filter(Boolean).length;
};
console.log(countSheeps(sheep));
```
<br>
#### 8.建立兩個函式表達式``min``、``max``。代入==數字組成的陣列==,分別回傳該陣列裡數字的最大值、最小值。

- 函式表達式,將函式賦予等號左邊的變數。
- 用forEach把陣列裡的資料一一取出比對``最小值``、``最大值``
```javascript=
var min = function(list){
let minimum = 0
list.forEach((item) => {
item < minimum ? minimum = item : ``;
})
return minimum;
};
var max = function(list){
let maximum = 0;
list.forEach(item => {
item > maximum ? maximum = item : ``;
});
return maximum;
};
min([4,6,2,1,9,63,-134,566]); // -134
max([4,6,2,1,9,63,-134,566]); // 566
```
#### 9.將函式代入十進制數字,轉成2進制後回傳。

:::warning
num.toString(2)轉換出來是二進制數字是string型別,
在二進制數字字串前面加上**+**,會轉型成number型別。
:::
```javascript=
function toBinary(num){
return +num.toString(2);
};
toBinary(8); // 1000
toBinary(24); // 11000
```
#### 10.紅綠燈燈號變換
- 建立一個函式來處理紅綠燈燈號變換,從綠色到黃色、到紅色、再到綠色的每次變化。
- 當函式代入綠燈,回傳黃燈
- 當函式代入黃燈,回傳紅燈
- 當函式代入紅燈,回傳綠燈
##### forEach解法,判斷邏輯(第5行開始)
- 條件一:forEach把``lights``陣列值一一取出時,與函式代入燈號比對
- 條件二:目前``lights``陣列index值小於(<)``lights``陣列index最大值(```lights.length -1```)
- ==兩個條件都達成==,燈號順序``lightOrder``就是傳入燈號的下一個(``lights[lightOrder + 1]``)
- ==條件二沒達成==,燈號順序``lightOrder``就是傳入紅燈的下一個綠燈(``lights[lightOrder += 0]``)
```javascript=
function updateLight(current) {
let lights = ['green', 'yellow', 'red'];
let lightOrder = 0;
lights.forEach((item, index) => {
item === current && index < lights.length -1 ? lightOrder = index + 1 : lightOrder += 0;
})
return lights[lightOrder];
}
console.log(updateLight('green'));
console.log(updateLight('yellow'));
console.log(updateLight('red'));
```
- 雙重的三元運算子解法
```javascript=
function updateLight(current) {
return current === 'yellow' ? 'red' : current === 'green' ? 'yellow' : 'green';
}
```
- switch()的解法
```javascript=
function updateLight(current) {
switch (current) {
case 'green':
return 'yellow';
break;
case 'yellow':
return 'red';
break;
case 'red':
return 'green';
break;
default:
throw 'Error: wrong input';
break;
}
}
```
<br>
#### 11.Remove String Spaces - 移除字串中的空格
- 用``split('')``和``forEach``的解法
```javascript=
function noSpace(x){
let newString = '';
x.split('').forEach(item => item === ' ' ? newString += '' : newString += item);
return newString;
};
console.log(noSpace('as sss s w w e ff'));
```
- 用``split('')``和``filter()``、``join('')``的解法
```javascript=
function noSpace(x){
return x.split('').filter(item => item !== ' ').join('');
};
console.log(noSpace('as sss s w w e ff'));
```
- 用``split('')``和``join('')``的解法
```javascript=
function noSpace(x){
return x.split(' '),join('');
};
console.log(noSpace('as sss s w w e ff'));
```
<br>
#### 12.String cleaning - 將字串代入函式,把字串中的數字去除,需要保留特殊字圖 ```~#$%^&!@*():;"'.,?``` 以及完整的空格

- **用``.split()``、``.filter()``、``.join()``的解法**
- 將字串拆成陣列後,用``.filter()``去篩選。
- 篩選條件為=> 將字串陣列一一取出,乘上``+``號。
- 原先文字字串乘上``+``號,變成NaN(篩選判斷條件false)。數字字串乘上+號,變成純數字(篩選判斷條件true)。
- ``!+value``為``+value``反向結果,因此``.filter()``只篩選陣列裡的NaN。
```javascript=
function stringClean(str){
return str.split('').filter(value => !+value ).join('');
};
console.log(stringClean('! !'));
console.log(stringClean('123456789'));
console.log(stringClean('This looks5 grea8t!'));
```
- **用正則表達式的解法**
- 最外層一定包含//
- \d:任何數字字元,等於``[0-9]``
- \D:任何非數字字元,等於``[^0-9]``
- \w:任何數字字元字母底線,等於``[A-Za-z0-9_]``
- \W:任何非數字字元字母底線,等於``[^A-Za-z0-9_]``
```javascript=
function stringClean(str){
//.replace(),用正則表達式選取,代入字串裡的字元,再用空字串取代
return str.replace(/\d/g, '');
};
console.log(stringClean('! !'));
console.log(stringClean('123456789'));
console.log(stringClean('This looks5 grea8t!'));
```
#### 延伸閱讀
- [String replace()](https://www.fooish.com/javascript/string/replace.html)
- [Javascript Regular Expressions , 表示法](https://www.puritys.me/docs-blog/article-30-Javascript-Regular-Expressions-,-表示法.html)
- [正規表達式 Regular Expression](https://ithelp.ithome.com.tw/articles/10205643)
<br>
#### 13.Stringy Strings - 寫一個 function 會帶入 size 的參數,表示是幾位數,並將位數替換成 1 及 0 ,從 1 開始。

- 參數size代入迴圈計算內,i取2的餘數,每次迴圈累加到變數``result``
```javascript=
function stringy(size) {
let result = '';
for (let i = 1; i <= size; i++) {
result += i % 2;
}
return result;
};
console.log(stringy(4));
```
#### 另解
- ``Array(size)``:建立size個長度的陣列。
- ``Array(4)``的``.length``等於4。陣列內容[``empty``, ``empty``, ``empty``, ``empty``]。
- ``.keys()``:會回傳一個包含陣列中的每一個索引之鍵(keys)的新 Array Iterator 物件。
- ``[...Array(size).keys()]``:把size個長度的陣列key值,解構賦值到新陣列上。
- ``.map()``再把值取出,跟2取餘數後回傳,``.join()``再重組成字串。
```javascript=
function stringy(size) {
return [...Array(size).keys()].map(item => item % 2 == 0 ? 1 : 0).join('')
}
```
#### 延伸閱讀
- [Array.prototype.keys()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/keys)
- [JavaScript 陣列(Array)的方法](https://ithelp.ithome.com.tw/articles/10219019)
<br>
#### 14.The Feast of Many Beasts - 建立function代入兩個字串,檢查兩個字串的第一個、和最後一個字元是否相同,相同回傳``true``,不同回傳``false``
- 分別比對兩個字串的第一個字元、第二個字元是否相同
```javascript=
function feast(beast, dish) {
return beast[0] === dish[0] && beast[beast.length -1 ] === dish[dish.length - 1];
};
console.log(feast('chickadee', 'chocolate cake'));
```