D31_eslint 與 LIOJ 的愛恨情仇 + 開始第四週


Posted by Christy on 2021-05-19

  • 好啦,標題也太聳動了吧,但是昨天出現了幾個交作業的問題:主要是第三週作業 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'
}
  • 第三週直播影片檢討:
  1. 取變數能力:多看其他人的扣,《程式英文》 English for Programmers
  2. 解題的時候不知道如何下手,以聯誼判斷比大小那題來說:測試資料越全面就越不會錯,根據題目範圍來做
  3. 字典序:0 1 2 3...9 a b c...z,出現在越後面的,比前面的大
  4. 大學裡面演算法的課,最硬但收穫也最多
  5. 因為解題進度跟不上,卡超過一個小時就求救
  6. 質數找根號,暫時不懂
  7. request 裡面關於 try{...}catch(error){.....}:
    • 把你覺得會有錯誤的地方放在 try {這裡面包起來}
  8. 優先順序:下一週進度 > 訂正以前作業 > 複習週作業
  9. 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)
      // 在最後一行,第二個參數就是第一個函式,只寫函式名稱的話,就可以當參數傳進去。
      









Related Posts

[cmd] 怎麼使用 command line 來 kill 正在某個 port 上面的 process?

[cmd] 怎麼使用 command line 來 kill 正在某個 port 上面的 process?

[ 筆記 ] 資訊安全 - CSRF

[ 筆記 ] 資訊安全 - CSRF

2022 實習面試心得(聯發科/智邦科技/創未來/Nvidia/HP惠普實習星/DELL/Amazon ring/華邦電子)

2022 實習面試心得(聯發科/智邦科技/創未來/Nvidia/HP惠普實習星/DELL/Amazon ring/華邦電子)


Comments