Chiayin's blog

【刷題】CodeWars-7kyu

字數統計: 1.9k閱讀時間: 8 min
2022/11/11

紀錄 CodeWars 的刷題過程、解答、衍伸想法。
不定期更新唷~。

7kyu

String ends with?

日期:20221008
題目:

1
2
3
4
5
提供兩個字串參數,第二的參數要等同於第一個參數的結尾。

Examples:
solution('abc', 'bc') // returns true
solution('abc', 'd') // returns false

答案:

1
let solution = (str, ending) => str.endsWith(ending);

補充 MDN 對String.prototype.endsWith() 的說明: 連結


String ends with?

日期:20221011
題目:

1
讓數字由大到小,做降序排列。

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 我的解法:
let descendingOrder = n => {
let convertN = n.toString();
let array = convertN.split('');
let compare = (a, b) => b - a;
let sortArray = array.sort(compare);
let joinArray = sortArray.join('');
let convertNum = Number(joinArray);

return convertNum;
}

// sort()解決陣列排序與印出:
n = [1,0,2,1];
let compare = (a, b) => b - a;
let descendingOrder = n => n.sort(compare);

// 解出後看大神的一行解法:
let descendingOrder = n => parseInt(n.toString().split('').sort().reverse().join(''));

使用sort((a, b) => b - a)做降序排列,但只支援陣列。
所以先將數字轉字串再轉陣列,再將陣列轉字串再轉數字。


Cats and shelves - 貓咪和架子

日期:20221011
題目說明(配網站的圖):

  • 架子為左右左右往上排序。
  • 貓咪可以一次跳 3 個架子的高度,例如: 1 → 2 或 1 → 4。
  • 但是貓咪不能直接爬頭頂上的架子,例如: 1 → 3 不行,一定要 1 → 2 → 3。
  • 請算出不同號碼的架子(開始與結束)之間,貓咪最少要跳幾次才能成功抵達?

答案:

1
2
3
4
let solution = (start, finish) => {
let shelveNum = finish - start ;
return Math.floor(shelveNum/3) + (shelveNum % 3);
}

本來是想算出數字差除以三後,有餘數就加一(再跳一次),沒有餘數則取除數。
但有個陷阱是貓咪不能直接跳頭頂上的架子,等於要多跳。
所以應該為寫出「取除數+取餘數」的算式。
考解題和計算能力QQ


Printer Errors 影印機錯誤

日期:20221022
題目:

1
2
3
4
5
6
7
8
9
10
字符串只要出現不是來自 a to m.,例如aaaxbbbbyyhwawiwjjjwwm字母就會出錯。
您必須編寫一個函數printer_error,回傳結果的分子是錯誤數,分母是字符串的長度。不要將此分數簡化為更簡單的表達式。
該字符串的長度大於或等於 1,並且僅包含從a到 的字母z。

例子:
s="aaabbbbhaijjjm"
printer_error(s) => "0/14"

s="aaaxbbbbyyhwawiwjjjwwm"
printer_error(s) => "8/22"

答案:

1
2
3
4
5
6
let printerError = s => {
let strLength = s.length;
let errorLength = s.split('').filter(x => /^[^a-m]*$/g.test(x)).length;

return `${errorLength}/${strLength}`;
}

卡有點久。
主要是可以用中文說出流程,卻不知道該使用哪個程式碼表現。

  1. 計算 s 的長度
  2. 用正規表達式找出不符合的字母 ← 卡在這裡
  3. 計算不符合字母的長度

最後找到test()方法來判斷正規表達式,並用filter()篩選出來,耶!

解出後看一下大神的答案:

  1. ${s.replace(/[a-m]/gi, "").length}/${s.length},使用replace()替換其他符號再計算長度,不用彎彎繞繞那麼多,真的聰明!
  2. ${(s.match(/[^a-m]/g) || []).length}/${s.length},原來可以使用match()來找出符合正規表達式的條件!也加上||判斷來計算長度,也是我沒想到的。

寫出自己的程式碼後,再看別人的解答也很有趣呢。
但不一定會照單全收,只是未來也可以用在其他情境上,讚讚。


Testing 1-2-3 - 測試 1-2-3

日期:20221026
題目:

1
2
3
4
5
題目重點翻譯:
讓列表內的值添加有序數字,並注意冒號和空格。如下:

[] --> []
["a", "b", "c"] --> ["1: a", "2: b", "3: c"]

答案:

1
let number = array => array.map((value, index) => `${index + 1}: ${value}`);

解題方式

一開始使用:

1
let number = array => array.map(v => array.indexOf(v)+1 +": "+v);

出現以下錯誤:

1
2
[ '1: ', '1: ', '1: ', '1: ', '1: ' ]
--> [ '1: ', '2: ', '3: ', '4: ', '5: ' ]

上網找到這位大神的解法,才知道應該熟悉array.map()的語法,才能得到最佳解。

map()方法:

這題可以訓練 array.map() 的語法,參考資料:

1
array.map(function(currentValue,index,arr), thisValue)
  • 可對陣列內每一個元素加工後回傳,組合成一個新的陣列。
  • 參數為:
    1. function: 函式內的參數分別為: currentValue, index, array
    2. thisValue: 執行 callback 時,用於 this 的值,被執行的對象會回傳給函數。

補充: thisValue參考資料:

  • 第二行程式碼可判斷所有 currentValue 是否都大於 1,但因為index 0 為 1,沒有大於 1,所以回傳 false。
  • 第六行程式碼可判斷所有 currentValue 是否都大於 1,[1, 2, 3] 皆大於 0,回傳 true。

因此利用參數的參數進行加工,便可得到我們要的回傳值,理解過後挺方便的。


Filter the number

日期:20221028
題目:

1
2
3
4
回傳字串裡的阿拉伯數字。

filterString("123") // 123
filterString("a1b2c3") // 123

答案:

1
let filterString = value => parseInt(value.split('').filter(n => !isNaN(n)).join(''));

V A P O R C O D E

日期: 20221103
題目:

1
2
3
4
5
6
寫一個函式將代入的字串轉換為 V A P O R W A V E 句子
V A P O R W A V E 為所有字母大寫,字母和字母中間需有兩個空格(含特殊符號)

EX:
"Lets go to the movies" --> "L E T S G O T O T H E M O V I E S"
"Why isn't my code working?" --> "W H Y I S N ' T M Y C O D E W O R K I N G ?"

答案:

1
let vaporcode = string => string.replace(/ /g, '').toUpperCase().split('').join('  ');

土法煉鋼的解法。


Love vs friendship - 愛情 vs 友情

日期: 20221103
題目:

1
2
3
4
5
6
讓每個英文字母都賦予一個數字,寫一個 funtion 來計算字母的加總。

EX:
l + o + v + e = 54
f + r + i + e + n + d + s + h + i + p = 108
wordsToMarks("family") // 66
1
let wordsToMarks = string => [...string].reduce((total, currentValue) =>total += currentValue.charCodeAt(0)-96, 0);

透過這題,第一次知道 ASCII, charCodeAt(),也嘗試 […arr], reduce 的寫法。


Likes Vs Dislikes

日期: 20221108
題目:

1
2
3
4
5
6
7
8
9
10
這題在模擬 Youtube 的喜歡不喜歡按鈕,會提供一個操作的陣列,寫一個 function 來回傳最終結果到底是按下喜歡還是不喜歡

思路在於如果先按 Like 在按 Dislike,會回傳後者 Dislike
而相同狀態按兩次則取消點擊,回傳 Nothing
所以在發現公式前可以透過遍歷去模擬點擊順序來回傳最終狀態值

likeOrDislike([Dislike]) => Dislike
likeOrDislike([Like,Like]) => Nothing
likeOrDislike([Dislike,Like]) => Like
likeOrDislike([Like,Dislike,Dislike]) => Nothing

解題:

1
let likeOrDislike = buttons => buttons.reduce((acc, cur) => acc == cur ? 'Nothing' : cur, 'Nothing');

透過同學的協助解這題。

1
2
3
4
5
6
7
reduce((a,b))

a 參數 return 上一個迴圈的判斷結果
所以 like(a) 等於 like(b) 為 nothing
dislike(a) 等於 dislike(b) 為 nothing
like(a) 不等於 dislike(b) 為 dislike(b)
dislike(a) 不等於 like(b) 為 like(b)

Exes and Ohs-井字棋(OOXX)

日期:20221109
題目:

1
在不區分大小寫的前提下,判斷 string 中 'X' 和 'O' 的數量是否相等,返回布林值

答案:

1
2
3
4
5
6
7
8
let XO = str => {
const {x, o} = str.toLowerCase().split('').reduce((acc, cur) => {
acc[cur] ? acc[cur] ++ : acc[cur] = 1;
return acc;
}, {})

return x === o ? true : false;
}

這次學到 {x,o}=reduce() 的寫法,輕鬆獲得 x 和 o 得值。


發佈日期:2022-11-11

更新日期:2022-11-11

CATALOG
  1. 1. 7kyu
    1. 1.1. String ends with?
    2. 1.2. String ends with?
    3. 1.3. Cats and shelves - 貓咪和架子
    4. 1.4. Printer Errors 影印機錯誤
    5. 1.5. Testing 1-2-3 - 測試 1-2-3
      1. 1.5.1. 解題方式
      2. 1.5.2. map()方法:
    6. 1.6. Filter the number
    7. 1.7. V A P O R C O D E
    8. 1.8. Love vs friendship - 愛情 vs 友情
    9. 1.9. Likes Vs Dislikes
    10. 1.10. Exes and Ohs-井字棋(OOXX)