Lichen5221 / Report-Daily

記錄每日上課內容與作業。
0 stars 0 forks source link

2021-05-03 #14

Open Lichen5221 opened 3 years ago

Lichen5221 commented 3 years ago

Project 5 介紹

這一週禁止使用內建 function,例如 Array.map, filter, indexOf, reduce 等等 只能用最基本的迴圈(for loop, while loop...)以及判斷式(if else, switch case) 相信我,這些東西就可以解了 (但如果有需要字串切割,可以使用 split) 這個單元裡面會來寫一些經典的水題,在實戰中我會分成兩個部分 第一個部分先按照之前教的寫出虛擬碼,第二個部分才寫程式碼

LIOJ 1026:判斷等比數列

自己試寫:

function pro(arr) {
  for(var i = 1; i < arr.length; i++) {
    let ratio = arr[1] / arr[0]
    if (arr[i] / arr[i - 1] != ratio){
      return 'No'
    }
  }
  return 'Yes'
}

console.log(pro([3, 9, 27]))

好了我又要來跟 LIOJ 的判斷機制戰鬥了。

老實說我一點都不曉得我錯在哪,為什麼 node 可以執行但是 LIOJ 就是不行?

老師解法:

let n = Number(lines[0])
let arr = lines[1].split(' ')
if (isValid(arr)) {
  console.log('Yes')
} else {
  console.log('No')
}

function isValid(arr) {
  let d = arr[1] / arr[0]
  for (var i = 1; i < arr.length; i++) {
    if (arr[i] / arr[i - 1] !== d) {
      return false
    }
  }
  return true
}

差異:我直接回傳字串,不可行嗎?看來 return 只能回傳數值。

LIOJ 1027:信用卡號驗證

自己試寫:

LIOJ 1028:生命靈數

自己試寫:

function life(arr) {
  var num = arr.split(' ')
  console.log(num)
  var bd = num[0] + num[1] + num[2]
  var bdm = Number(bd)
  console.log(bdm)
  var f = total(bdm)
  console.log(f)
  while (f >= 10) {
    f = total(f)
  }
  console.log(f)

  function total(n) {
    let sum = 0
    while (n != 0) {
      sum += n % 10
      n = Math.floor(n / 10)
    }
    return sum
  }
}

life('1991 11 07')

為了確保印出來的東西一樣還加爆 console.log ,而且避免上 LIOJ 再判斷錯誤,我從這題開始就直接仿造 LIOJ 的出題⋯⋯

老師解答:

function life(arr) {
  let temp = lines[0].split(' ')
  let num = Number(num[0] + num[1] + num[2])
  let p = addDigits(num)
  while (p >= 10) {
    p = addDigits(p)
  }
  console.log(f)

  function addDigits(n) {
    let sum = 0
    while (n != 0) {
      sum += n % 10
      n = Math.floor(n / 10)
    }
    return sum
  }
}
Lichen5221 commented 3 years ago

LIOJ 1029:加減乘除

自己試寫:

function solve(lines) {
  let num = lines.split(' ')
  console.log(num)
  if (num[1] === '+') {
    console.log(Number(num[0]) + Number(num[2]))
  } else if (num[1] === '-') {
    console.log(Number(num[0]) - Number(num[2]))
  } else if (num[1] === '*') {
    console.log(num[0] * num[2])
  } else {
    console.log(num[0] / num[2])
  }
}

solve('3 * 4')
solve('5 - 3')
solve('3 + 2')
solve('10 / 5')

為了確保四個都可以運行全部寫了,然後就發現我原本寫的 + 有出現錯誤 XD,還好有測試。

老師解答:

let temp = lines[0].split(' ')
let a = Number(temp[0])
let b = Number(temp[2])

if (temp[1] === '+') {
    console.log(a + b)
} else if (temp[1] === '-') {
    console.log(a - b)
} else if (temp[1] === '*') {
    console.log(a * b)
} else (temp[1] === '/') {
    console.log(a / b)
}

差異:老師的比較簡潔。

LIOJ 1030:判斷迴文

自己試寫:

function res(str) {
  let word = str.split('')
  let w = ''
  for(var i = str.length - 1; i >= 0; i--) {
    w += str[i]
  }
  console.log(w)
  if (str == w) {
    console.log('True')
  } else {
    console.log('False')
  }
}

res('cd121dc')
res('ac')
res('abbbba')

LIOJ 版本:

  let word = lines[0]
  let w = ''
  for(var i = word.length - 1; i >= 0; i--) {
    w += word[i]
  }

  if (word == w) {
    console.log('True')
  } else {
    console.log('False')
  }

老師解答:

let str = lines[0]
if (reverse(str) === str) {
  console.log('True')
} else {
  console.log('False')
}

function reverse(str) {
  let result = ''
  for (let i = str.length - 1; i >= 0; i--) {
    result += str[i]
  }
  return result
}

差異:老師多一個 function 。然後我莫名不知道為什麼要把字串分割。

LIOJ 1031:完全平方和

Lichen5221 commented 3 years ago

LIOJ 1032:平面距離計算

LIOJ 1033:最近點對

LIOJ 1034:凱薩加密

LIOJ 1036:圈圈叉叉

Lichen5221 commented 3 years ago

內建函式做做看

練習實作內建函式

理解內建函式,較能理解並使用。

實戰:Array.map

實戰:String.repeat

實戰:Array.lastIndexOf