程式導師實驗計畫 Week 3 題目與解答


Posted by YongChenSu on 2020-12-08

hw1 好多星星

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 N = Number(lines[0])
  printStar(N)

}

function printStar(n) {
  let star = ''
  for (let j = 0; j < n; j++) {
    star += '*'
    console.log(star)
  }
}


hw2 水仙花數

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 temp = lines[0].split(' ')
    let n = Number(temp[0])
    let m = Number(temp[1])
    for (let i = n; i <= m; i++) {
        if (isNarcissistic(i)) {
            console.log(i)
        }
    }

    function digitsCount(n) {
        if (n === 0) return 1
        let result = 0
        while (n != 0) {
            n = Math.floor(n / 10)
            result ++
        }
        return result
    }

    function isNarcissistic(n) {
        // 幾位數
        let m = n
        let digits = digitsCount(m)
        let sum = 0
        while (m != 0) {
            let num = m % 10
            sum += num ** digits
            m = Math.floor(m / 10)
        }
        if (sum === n) {
            return true
        } else {
          return false
        }
    }
}

hw3 判斷質數

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) {
    for (let i=1; i<=Number(lines[0]); i++) {
        if (isPrime(Number(lines[i]))) {
            console.log('Prime')
        } else {
            console.log('Composite')
        }
    }
}

function isPrime(n) {
    if (n === 1) return false
    for (let i=2; i<n; i++) {
        if (n % i === 0) {
            return false
        }
    }
    return true
}

hw4 判斷迴文

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 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 solve(lines) {
    let str = lines[0]
    console.log(
        str.split('').reverse().join('') === str ? 'true' : 'false'
    )
}


hw5 聯誼順序比大小

一開始有問題的版本

function solve(lines) {
    let arrLength = Number(lines[0])
    for (let i=1; i<= arrLength; i++) {
        let a = Number(lines[i].split(' ')[0])
        let b = Number(lines[i].split(' ')[1])
        let k = Number(lines[i].split(' ')[2])
        largerOrSmaller(a, b, k)
    }
}

function largerOrSmaller(A, B, K) {
    if (K === 1) {
        if (BigInt(A) > BigInt(B)) {
            console.log('A')
        } else if (BigInt(A) === BigInt(B)) {
            console.log('DRAW')
        } else {
            console.log('B')
        }
    } else {
        if (BigInt(A) > BigInt(B)) {
            console.log('B')
        } else if (BigInt(A) === BigInt(B)) {
            console.log('DRAW')
        } else {
            console.log('A')
        }
    }
}

修改後的版本

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 arrLength = Number(lines[0])
    for (let i=1; i<= arrLength; i++) {
        let [a, b, k] = lines[i].split(' ')
        if (k == 1) {
            if (BigInt(a) > BigInt(b)) {
                console.log('A')
            } else if (BigInt(a) === BigInt(b)) {
                console.log('DRAW')
            } else {
                console.log('B')
            }
        } else {
            if (BigInt(a) > BigInt(b)) {
                console.log('B')
            } else if (BigInt(a) === BigInt(b)) {
                console.log('DRAW')
            } else {
                console.log('A')
            }
        }       
    }
}

不使用 BigInt 的版本

function solve(lines) {
    let arrLength = Number(lines[0])
    for (let i=1; i<=arrLength; i++) {
        let [a, b, k] = lines[i].split(' ')
        console.log(largerOrSmaller(a, b, k))
    }
}

function largerOrSmaller(a, b, k) {
    const lengthA = a.length
    const lengthB = b.length

    if (a === b) {
        return 'DRAW' // 一樣大
    } else {
        if (k == 1) {  // 比大
            if (lengthA === lengthB) {
                for (let i=0; i<lengthA; i++) {
                    if (a[i] == b[i]) {
                        continue
                    } else {
                        return a[i] > b[i] ? 'A' : 'B'
                    }
                }
            } else {
                return lengthA > lengthB ? 'A' : 'B'
            }
        } else { // 比小
            if (lengthA === lengthB) {
                for (let j=0; j<lengthA; j++) {
                    if (a[j] == b[j]) {
                        continue
                    } else {
                        return a[j] > b[j] ? 'B' : 'A'
                    }
                }
            } else {
                return lengthA > lengthB ? 'B' : 'A'
            }   
        }    
    }   
}

課程解答的版本

function solve(lines) {
    let arrLength = Number(lines[0])
    for (let i=1; i<=arrLength; i++) {
        let [a, b, k] = lines[i].split(' ')
        console.log(largerOrSmaller(a, b, k))
}

function largerOrSmaller(a, b, k) {
    if (a === b) {
        return 'DRAW'
    }

    if (k == -1) {
        let temp = b
        b = a
        a = temp
    }

    const lengthA = a.length
    const lengthB = b.length

    if (lengthA !== lengthB) {
        return lengthA > lengthB ? 'A' : 'B'
    }
    return a > b ? 'A' : 'B'
}

hw6 前面五題解題心得

  1. #### 好多星星
  • 注意 for 迴圈 console.log 的時機

把 printStar(n) 函式裡的 console.log() 寫在 for 迴圈之外,在 solve() 函式則要再多寫一個 for 迴圈,使其能一層一層遞增星星數。

function solve(lines) {
    let N = Number(lines[0])
    for (let i=1;i <= N; i++) {
        printStar(i)
    }   
}

function printStar(n) {
  let star = ''
  for (let j = 0; j < n; j++) {
        star += '*'
    }
    console.log(star)
}

直接將 console.log() 寫在 printStar() 裡的 for 迴圈裡面,這樣的寫法比較簡潔易懂。

function solve(lines) {
    let N = Number(lines[0])
    printStar(N)

}

function printStar(n) {
  let star = ''
  for (let j = 0; j < n; j++) {
        star += '*'
        console.log(star)
  }
}
  1. 水仙花數
    之前在上《先別急著寫 leetcode》時已經解過一次了,這次還是沒辦法順利解出來,不過再回去看筆記重新寫過幾次,把在迴圈中「重新賦值的時機」、「取餘數」、「位元運算」的概念再加深。

  2. 判斷質數
    1 既不是質數也不是合數,故傳入 isPrime() 函式的數字為 1,return false。

  3. 判斷迴文
    這題也是之前有解過,先寫一個 reverse() 函式,把字串倒轉過來,再回去判斷是否相等於原來的字串即可。

  4. 聯誼順序比大小
    這一題花好多時間,先使用 BigInt() 解題,一開始沒有意識到 使用 Number(), BigInt() 函式後的型別不一,導致測資一直無法通過。然後到 spectrum 上發問才重新寫過後,解決問題。

    接著挑戰不要用 BigInt() 來完成,這個過程了解到,可以利用 for 迴圈來判斷字串裡的數字大小,也知道了字串字典序大小的概念,也複習如何利用三元運算子。

    ps. 題目描述的聯誼順序超有趣,在會講話的人後面自介使人「相形見絀」,而在不會講話的人後面發言則可以「藏拙」,實在將青澀的年少時期,在新團體中大家第一次自介的情景描繪地栩栩如生。


#程式導師實驗計畫第四期 #前端 #print star







Related Posts

[Day00] 大綱

[Day00] 大綱

Week3 - 挑戰題:貪婪的小偷 Part2

Week3 - 挑戰題:貪婪的小偷 Part2

CS50 TCP/IP DNS HTTP

CS50 TCP/IP DNS HTTP


Comments