改第二週作業
改第二週作業,把本地端改好以後,強制推上遠端,出現錯誤訊息:
fatal: The current branch week2 has no upstream branch.
To push the current branch and set the remote as upstream, use
接著我用 git push --set-upstream origin week2
,出現第二個錯誤訊息:
! [rejected] week2 -> week2 (non-fast-forward)
error: failed to push some refs to 'https://github.com/Lidemy/mentor-program-5th-LPGUEI.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
後來參考了 Git 文件跟 Google,最後用了 git push -f -u origin week2
;因為開始第三週影片,裝了 eslint,改了三次才被認可
恩...好像有點複雜,但是真的是遇到問題才是了解 Git 的開始...我也不確定到底解決問題了沒 😱
跟 eslint 小公主初次見面,妳好妳好。
感謝助教的耐心,提點我作業六的缺失,把它改成下面的版本了:
function isValid(arr) {
for(var i=0; i<arr.length; i++) {
if (arr[i] <= 0) return 'invalid'
}
for(var i=2; i<arr.length; i++) {
if (arr[i] !== arr[i-1] + arr[i-2]) return 'invalid'
}
return 'valid'
}
isValid([3, 5, 8, 13, 22, 35])
題目:
寫一個叫做 isValid 的函式,傳進一個叫做 arr 的陣列為參數,
判斷該陣列是否為費波那契數列(Fibonacci sequence)
(即陣列前兩項的和是否等於第三項)
如果是,則回傳 'valid';否或者陣列的數小於等於零,則回傳 'invalid'
感謝助教的提醒,這裡特別要注意的是:「這段程式碼真正執行的時候是當呼叫 arr.length 時才去看當下 arr.length 的值。」
所以其實下面的每個 6,應該寫成「檢查 i 是否 < arr.length」;也有可能在其他情況下,arr.length 每次被拿掉一個元素,那長度就會變動了。
執行流程
- 把 [3, 5, 8, 13, 22, 35] 這個陣列傳進 isValid 這個函式裡面,總共有 6 個元素,陣列的長度為 6
- 執行第一行,i = 0,檢查 i 是否 < 6,是,繼續,開始第一圈迴圈
- 執行第二行,檢查陣列第一個元素是否 <= 0,但 3 > 0,否,第一圈結束,回到上一行
- 執行第一行,i ++,開始第二圈,i = 1,檢查 i 是否 < 6,是,繼續往下
- 執行第二行,檢查陣列第二個元素是否 <= 0,但 5 > 0,否,第二圈結束,回到上一行
- 執行第一行,i ++,開始第三圈,i = 2,檢查 i 是否 < 6,是,繼續往下
- 執行第二行,檢查陣列第三個元素是否 <= 0,但 8 > 0,否,第三圈結束,回到上一行
- 執行第一行,i ++,開始第四圈,i = 3,檢查 i 是否 < 6,是,繼續往下
- 執行第二行,檢查陣列第四個元素是否 <= 0,但 13 > 0,否,第四圈結束,回到上一行
- 執行第一行,i ++,開始第五圈,i = 4,檢查 i 是否 < 6,是,繼續往下
- 執行第二行,檢查陣列第五個元素是否 <= 0,但 22 > 0,否,第五圈結束,回到上一行
- 執行第一行,i ++,開始第六圈,i = 5,檢查 i 是否 < 6,是,繼續往下
- 執行第二行,檢查陣列第六個元素是否 <= 0,但 35 > 0,否,第六圈結束,回到上一行
- 執行第一行,i ++,開始第七圈,i = 6,檢查 i 是否 < 6,否,結束迴圈,繼續往下一行執行
- 執行第二個 for 迴圈,i = 2,檢查 i 是否 < 6,是,開始第一圈
- 執行下一行,檢查陣列第三個元素 8 是否不等於陣列的第二個元素 5 加上陣列的第一個元素 3,否,第一圈結束,回到上一行
- i ++,開始第二圈,i = 3,檢查 i 是否 < 6,是,繼續往下
- 執行下一行,檢查陣列第四個元素 13 是否不等於陣列的第三個元素 8 加上陣列的第二個元素 5,否,第二圈結束,回到上一行
- i ++,開始第三圈,i = 4,檢查 i 是否 < 6,是,繼續往下
- 執行下一行,檢查陣列第五個元素 22 是否不等於陣列的第四個元素 13 加上陣列的第三個元素 8,是,回傳 'invalid',結束迴圈,結束函式。
LIOJ 1027 信用卡號驗證
- 解題想法:因為連字號阻礙了運算規則,所以最好的方法應該是寫一個把連字號去掉的函式,接著再實作這一題會比較簡單。運算細節:卡號奇數位乘以二,如果大於十,該位數減去九,所有位數相加以及偶數位相加,這兩個相加的總和對十取餘數,整除則檢查碼為零;或者用 10 減去餘數就等於檢查碼。
- 大方向想法:首先取得 lines 陣列第一位 -> lines[0],總和就等於奇數位加上偶數位。令 ans 為總和對 10 取餘數,如果 ans 不等於零,檢查碼就是 10 - ans;如果檢查碼不等於卡號最後一位,輸出 'INVALID';如果卡號第一位等於 5,輸出 ‘MASTER_CARD’,不然就輸出 ‘VISA’。
- 寫出函式一:去掉連字號;函式二:偶數位相加;函式三:奇數位相加
var readline = require('readline');
var lines = []
var rl = readline.createInterface({
input: process.stdin
});
rl.on('line', function (line) {
lines.push(line)
});
rl.on('close', function() {
solve(lines)
})
function solve(lines) {
let input = removeDash(lines[0])
let sum = evenDigitsCount(input) + oddDigitsCount(input)
let ans = sum % 10
if (ans !== 0) {
ans = 10 - ans
}
if (ans !== Number(input[15])) {
console.log('INVALID')
} else {
if (input[0] === '5') {
console.log('MASTER_CARD')
} else {
console.log('VISA')
}
}
}
function removeDash(str) {
let result = ''
for(i = 0; i < str.length; i++) {
if(str[i] >= 0 && str[i] <= 9) {
result += str[i]
}
}
return result
}
function evenDigitsCount(input) {
let sum = 0
for (a = 1; a <= 13; a+=2) {
sum += Number(input[a])
}
return sum
}
function oddDigitsCount(input) {
let sum = 0
for (i = 0; i <= 15; i+=2) {
let p = Number(input[i]) * 2
if (p >= 10) {
p = p - 9
}
sum += p
}
return sum
}