iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

解三十天的 CodeWars系列 第 3

Human Readable Time

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

5 kyu

題目

傳入秒數,轉換為人類可辨識的時間單位;最大的單位為小時。

思路

傳統計時:秒 -> 分鐘 -> 小時;60秒 -> 1min,60min -> 1hr。
反過來推論,從小時開始倒推回剩餘秒數。

也就是一小時以秒數來計,60 * 60 = 1hr,先從小時開始扣,以此類推。

pseudo code

let lave = seconds % 3600
let hours = (seconds - lave) / 3600
let sec = lave % 60;
let mins = (lave - sec) / 60
let result = [hours, mins, sec];

result.map(item =>
   if item.length < 2
   return "0" + item
)

return result.join(":")

實作

function humanReadable(seconds) {
   let lave = seconds % 3600;
   let hours = (seconds - lave) / 3600;
   let sec = lave % 60;
   let mins = (lave - sec) / 60;
   let result = [hours, mins, sec].map(item => {
      if (item < 10) return "0" + item;
      return item;
   });
   return result.join(":");
}

一個小時的秒數為 3600。
將原始秒數取出餘數,也就是一部分被整除、一部分被剩餘;

扣除掉被剩餘的再除以 3600,即被整除的最終小時數。
剩餘秒數跟 60 取餘,得最終秒數;扣除最終秒數後,被整除的部分即為最終分鐘數。

將取得的小時、分鐘、秒數放於 Array 中,用 map 去迭代元素;設定判斷條件,回傳對應內容;再用 join 轉為字串結果。

他人的解法

function humanReadable(seconds) {
   var pad = function (x) {
      return (x < 10) ? "0" + x : x;
   }
   return pad(parseInt(seconds / (60 * 60))) + ":" +
      pad(parseInt(seconds / 60 % 60)) + ":" +
      pad(seconds % 60)
}

在函數內部宣告另一函數 pad,整個 humanReadable 會 return pad 函數的執行結果。
pad 函數會帶入一個參數 x,如果 x 小於10,回傳 x 與字串 0 的拼接,否則就直接回傳 x。

舉例 humanReadable 帶入 45296,第一行的 pad 其中的 x 為:45296 / (60*60),作法是將所有秒數除以一小時的秒數 3600,取整後為 12。

第二行 parseInt(45296 / 60 % 60),第一個除以六十取得以分鐘為單位,再以每小時 60 分,取得分鐘的餘數,取整後為 34。

第三行 seconds % 60,排除能被 60 所整除的,剩餘的即為秒數了。
最後各自作為 x 帶入到 pad 之中,獲取對應結果。

心得

才剛開始第二天就感受到沒有存稿的恐怖了OTL

他人的解法通常是拿該題目的最佳解,來思考過一遍別人的寫法。
目前觀察下來,寫越短或解法越少見,幾乎是最佳解的共通點。


上一篇
Simple Pig Latin
下一篇
RGB To Hex Conversion
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言