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