- 好啦,標題也太聳動了吧,但是昨天出現了幾個交作業的問題:主要是第三週作業 2 跟 5 被 eslint 通過了,但是 LIOJ 錯誤:
Week 3 作業 2 & 5,eslint 通過了但是 LIOJ 錯誤
eslint 通過了 const str = '$n',但是 LIOJ 用 const str = n + '' 才會通過
看到上面的自己的訊息,我都覺得
是在公 three 小,LIOJ 才是主體啊,傻瓜! eslint 是一個檢查的工具,但是程式碼是我寫的,而 LIOJ 是檢查程式是否跑得動,在被 eslint diss 的過程中,我迷失了。解答:把那一行改成
const str = n.toString()
就過了。背後的原因:語法上 eslint 偏好 prefer-template,但是在這裡我要讓 n 變成字串,但 n + '' 用 prefer-template 的方式寫有點奇怪,所以就從別的地方下手吧。
// LIOJ 1025
const readline = require('readline')
const lines = []
const rl = readline.createInterface({
input: process.stdin
})
rl.on('line', (line) => lines.push(line))
rl.on('close', () => solve(lines))
function solve(lines) {
const data = lines[0].split(' ')
for (let i = Number(data[0]); i <= Number(data[1]); i++) {
if (isNarcissistic(i)) {
console.log(i)
}
}
}
function isNarcissistic(n) {
const str = '$n' //LIOJ 不開心...🙈
const digits = str.length
let ans = 0
for (let i = 0; i < str.length; i++) {
ans += Number(str[i]) ** digits
}
return ans === n
}
關鍵在於定義,在這裡 p 應該要是數字,所以一開始定義它為數字,下面用三個等號語意才會正確,要改的是這兩行:
const p = Number(temp[2])
if (p === -1) {
// 下面有詳細的程式碼
// LIOJ 1004
const readline = require('readline')
const lines = []
const rl = readline.createInterface({
input: process.stdin
})
rl.on('line', (line) => lines.push(line))
rl.on('close', () => solve(lines))
function solve(lines) {
const n = Number(lines[0])
for (let i = 1; i <= n; i++) {
const temp = lines[i].split(' ')
const a = temp[0]
const b = temp[1]
const p = temp[2]
console.log(compare(a, b, p))
}
}
function compare(a, b, p) {
if (a === b) return 'DRAW'
if (p == -1) { // eslint 通過三個等號,但 LIOJ 通過兩個等號
const temp = a
a = b
b = temp
}
const lengthA = a.length
const lengthB = b.length
if (lengthA !== lengthB) {
return lengthA > lengthB ? 'A' : 'B'
}
return a > b ? 'A' : 'B'
}
- 第三週直播影片檢討:
- 取變數能力:多看其他人的扣,《程式英文》 English for Programmers
- 解題的時候不知道如何下手,以聯誼判斷比大小那題來說:測試資料越全面就越不會錯,根據題目範圍來做
- 字典序:0 1 2 3...9 a b c...z,出現在越後面的,比前面的大
- 大學裡面演算法的課,最硬但收穫也最多
- 因為解題進度跟不上,卡超過一個小時就求救
- 質數找根號,暫時不懂
- request 裡面關於 try{...}catch(error){.....}:
- 把你覺得會有錯誤的地方放在 try {這裡面包起來}
- 優先順序:下一週進度 > 訂正以前作業 > 複習週作業
- LIOJ 的訊息錯誤說明比較多是針對 C 語言
第四週:網路基礎
function 額外補充:part1
- 這個影片解釋了很多不清楚的概念,可以一邊看一邊實作,這樣才比較容易吸收。
呼叫函式跟回傳函式的差別
function a() { // 我是內容 } a()// 這樣是呼叫 console.log(a())// 這樣就會執行函式裡面的回傳
function 額外補充:part2
把函式當作參數傳進去,可以這樣做:
function isNegative(n) { return n < 0 } function isValid(number, fn) { console.log(fn(number)) } isValid(100, isNegative) // 在最後一行,第二個參數就是第一個函式,只寫函式名稱的話,就可以當參數傳進去。