第三週作業確認
- 原來這個樣子的程式碼可讀性還不錯,那我要繼續維持這樣的方式。
 要記得找時間看一下 《程式英文》 English for Programmers
第三週作業部分:
原本寫這樣
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)
    }
  }
}
- 經過助教提醒,建議可以先用 map 轉換型態
 
function solve(lines) {
  const data = lines[0].split(' ').map(Number)  // map()
  for (let i = data[0]; i <= data[1]; i++) {
    if (isNarcissistic(i)) {
      console.log(i)
    }
  }
}
- 另外如果可以的話,其實三元運算子可以取代 if...else...
 
求小於 n 的質數,為什麼求到 Math.sqrt(n) 就可以了?
質數除餘範圍,LIOJ 1020,可以只求到 Math.sqrt(n),參考資料:質數有多重要?數學家歐拉和高斯是如何研究質數的?
4'15" 開始,原理在 5'00" 這裡,「如果最大的數是 n 的話,其中比較小的那個因數,肯定小於 √n,把小於 √n 的質數的倍數刪去,剩下的就全部都是質數了。」
例如令 n = 16,開根號以後是 4,小於 4 的質數為 2, 3,把這兩個數的倍數刪去,剩下的就是質數:1, 2, 3,
4, 5,6, 7,8,9,10, 11,12, 13,14,15,16,只剩下 1, 2, 3, 5, 7, 11, 13,其中 1 不是質數也不是合數,因此答案是:2, 3, 5, 7, 11, 13
- Mac 開根號怎麼打:
打任意次根号:
option+shift+v,输入根的次数,按确定,就可以接着输入根号内数字。
二次根号:
option+v 
function isPrime(n) {
  const sqrtCache = Math.sqrt(n);// 這樣寫會更簡潔
  if (n === 1) {
    return false
  }
  for (let i = 2; i <= sqrtCache; i++) {
    if (n % i === 0) {
      return false
    }
  }
  return true
}
還有助教說:「javascript 的 function 不作為物件藍本的話,通常是小寫開頭哦!」
可以用解構語法進行賦值,這簡直帥炸了,解構賦值
if (p === -1) {
    const temp = a
    a = b
    b = temp
}
// 寫這樣更簡潔  
if (p === -1) {
    [a, b] = [b, a]
}
- 天啊,我居然得到助教的值得參考標籤,受寵若驚 ❤️
 - 一大早看到助教的留言,立馬笑噴,一整天心情都超好的~
 
MTR05 function 額外補充:part2
把函式當作參數傳的講解
map() 可以傳三個參數,MDN
let arr = [-1, -2, 1, 2, 3]
arr.map(function(currentValue, index, array)) {
  console.log(currentValue, index, array)
}
// 會印出
-1 0 [-1, -2, 1, 2, 3]
-2 1 [-1, -2, 1, 2, 3]
1 2 [-1, -2, 1, 2, 3]
2 3 [-1, -2, 1, 2, 3]
3 4 [-1, -2, 1, 2, 3]
傳的參數是按照順序的,跟寫什麼字沒有關係 (不寫 currentValue, index, array 也可以)
NET101
protocol: 為什麼我們需要協定(protocol)?因為透過規範彼此才能溝通。
HTTP Method:
- Get 取得資料
 - Head 跟 Get 很像,很少用,只拿 header 不要 body
 - Patch 修改部分資料,不會取代所有資料
 - Put 修改資料,會取代所有資料
 - Post 執行一些動作
 - Delete 刪除資料
 - Options 回傳這個 server 支援哪些方法
 
常見的 HTTP Status code
- 1 開頭:比較少見,客戶端需要處理 Hold on
 - 2 開頭:成功 Here you go
- 204: 成功處理請求,但沒有內容;例如刪除資源成功
 
 - 3 開頭:重新導向 Go away
- 301: 永久的移到新的位置
 - 302: 暫時的移到新的位置
 
 - 4 開頭:客戶端有錯 You fucked up
- 語法錯誤
 - 404: Not Found 你要的東西這裡沒有
 
 - 5 開頭:server 端錯誤 I fucked up
- 503: 伺服器有問題
 
 - 知道常見的 Code 及每個號碼開頭什麼意思
 
實作一個超簡易 HTTP Server
- 這裡的程式碼再多看幾遍
 - 下面的程式碼來自助教 Yakim 的 筆記,寫得好美好棒啊,謝謝助教~
 
let http = require('http'); // 引用 library: http 
let server = http.createServer(handleRequest);
function handleRequest(req, res) {
  console.log('request url: ', req.url);
  if (req.url === '/') {
    res.writeHead(200, { // 更改 response header
      'info': 'index'
    })
    res.write('index'); // 更改 response body
    res.end();
    return;
  }
  if (req.url === '/redirect') {
    res.writeHead(301, {
      // 'Location': '/category' // 轉址到 /category
      'Location': 'https://google.com' // 轉址到 google.com
    });
    res.end();
    return;
  }
  if (req.url === '/category') {
    res.writeHead(200, {
      'info': 'category'
    })
    res.write('category')
    res.end();
    return;
  }
  res.writeHead(404);
  res.end();
  return;
}
server.listen(5000); // 監聽 5000 這個 port
        

