iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
1
自我挑戰組

30天找回寫程式手感計劃!!!系列 第 4

Day4 - 第幾個 100 天還是很有感覺之久違的寫程式由簡單數學題目切入吧!( 2/3 )

  • 分享至 

  • xImage
  •  

一樣是前言

今天差點要唱 我的心有一扇窗(天窗)
https://ithelp.ithome.com.tw/upload/images/20200910/20129873M1RJPwSVNY.png
還好在最後的最後還是趕上了orz
其實昨天 po 出後,得到很多大大們的建議,
小的我覺得很開心,
本來想要照大大們的建議改的,
但剛才發現來不及=口=
只好擇日再戰orz
所以今天挑了別的題目進行挑戰!

正片開始

今日素材:世界完全對稱日

正好我又記得今年的 2 月 2 日有一則新聞:

https://tw.news.yahoo.com/900-%E5%B9%B4%E9%9B%A3%E5%BE%97-%E9%81%87%E7%9A%84%E4%B8%96%E7%95%8C%E5%9B%9E%E6%96%87%E6%97%A5-20200202%E6%AD%A3%E5%8F%8D%E5%BF%B5%E9%83%BD-%E6%A8%A3-103500091.html
900 年難得一遇的世界完全對稱日 20200202正反念都一樣
2020 年 2 月 2 日,這一天不只是美國一年一度的土撥鼠節和美式足球世界超級盃的日子,還是 900 年來難得一遇的「世界完全對稱日」(Palindrome Day),日期寫成 20202020,數字如同照鏡子一般,不論從前面念、後面念,都是一樣的。

沒錯,今天就要用程式試著算出世界完全對稱日有哪些!
然後今天的文章不會像昨天有很多前置作業,
直接切入正題!
(好但這題我承認數學的成份不大orz)

動工前,先思考一下要怎麼寫

因為是正反倒著唸都一樣,
所以想說就用年份倒著印月日出來,
如果倒著印出來的月日是正常日期格式,
就表示這樣的年月日就是世界完全對稱日!

  1. 先試著將年份倒著印回去
let year = 2020;
let yearStr = year.toString(); // 要將年份倒著印回去,要記得轉成字串才能處理
let date = "";

console.log(`year: ${year}`);
for ( let i=yearStr.length-1; i>=0; i-- ){
    console.log(`reverse year: ${yearStr[i]}`);
}

https://ithelp.ithome.com.tw/upload/images/20200910/20129873JcfbtrDide.png

  1. 可以成功倒著印出來的話,就將其存成日期
let year = 2020;
let yearStr = year.toString();

let monthStr = "";
let dateStr = "";

console.log(`year: ${year}`);
for ( let i=yearStr.length-1; i>=0; i-- ){
    // console.log(`reverse year: ${yearStr[i]}`);
    if ( i > 1 ){
        monthStr += yearStr[i]; // 前 2 碼存成月份
    } else{
        dateStr += yearStr[i]; // 後 2 碼存成日期
    }
}

https://ithelp.ithome.com.tw/upload/images/20200910/20129873X01VTqoZqa.png

  1. 然後不要對自己太過自信,用別的年份試試看以上邏輯有沒有問題
let year = 2021; // 改成 2021 試試看
let yearStr = year.toString();

let monthStr = "";
let dateStr = "";

console.log(`year: ${year}`);
for ( let i=yearStr.length-1; i>=0; i-- ){
    if ( i > 1 ){
        monthStr += yearStr[i];
    } else{
        dateStr += yearStr[i];
    }
}

console.log(`monthStr: ${monthStr}`);
console.log(`dateStr: ${dateStr}`);

https://ithelp.ithome.com.tw/upload/images/20200910/20129873e9LS1eqDJ2.png

  1. 都沒問題之後,加入正常月日邏輯,即可判斷是不是世界完全對稱日囉~
let year = 2021;
let yearStr = year.toString();

let monthStr = "";
let dateStr = "";

console.log(`year: ${year}`);
for ( let i=yearStr.length-1; i>=0; i-- ){
    if ( i > 1 ){
        monthStr += yearStr[i];
    } else{
        dateStr += yearStr[i];
    }
}
let month = parseInt(monthStr);
let date = parseInt(dateStr);

// 如果月份小於 12 且 日期小於 31 表示為正常日期
if ( month <= 12 && date <= 31 ){
    console.log(`${yearStr}${monthStr}${dateStr} 是世界對稱日!`);
}

https://ithelp.ithome.com.tw/upload/images/20200910/20129873XEDDTJk8fp.png

  1. 然後一樣改成別的數字看看(反向測試)
let year = 2031; // 故意改成 2031 
let yearStr = year.toString();

let monthStr = "";
let dateStr = "";

console.log(`year: ${year}`);
for ( let i=yearStr.length-1; i>=0; i-- ){
    // console.log(`reverse year: ${yearStr[i]}`);
    if ( i > 1 ){
        monthStr += yearStr[i];
    } else{
        dateStr += yearStr[i];
    }
}

console.log(`monthStr: ${monthStr}`);
console.log(`dateStr: ${dateStr}`);

let month = parseInt(monthStr);
let date = parseInt(dateStr);

if ( month <= 12 && date <= 31 ){
    console.log(`${yearStr}${monthStr}${dateStr} 是世界對稱日!`);
}

https://ithelp.ithome.com.tw/upload/images/20200910/201298730UCDo915ct.png
沒有印出世界完全對稱日的判斷,表示上面寫的邏輯是對的~

  1. 最後,當然不能只判斷 1 個年份呀,加上起始~終點年份變成迴圈,
    就讓我們看看 2001 - 2999 年的世界完全對稱日有幾個吧!
let yearStart = 2001;
let yearEnd = 2999;

let resultArray = []; // 世界對稱日結果陣列

for ( let year=yearStart; year<yearEnd; year++ ){
    let yearStr = year.toString();

    let monthStr = "";
    let dateStr = "";

    for ( let i=yearStr.length-1; i>=0; i-- ){
        if ( i > 1 ){
            monthStr += yearStr[i];
        } else{
            dateStr += yearStr[i];
        }
    }

    let month = parseInt(monthStr);
    let date = parseInt(dateStr);

    if ( month <= 12 && date <= 31 ){
        resultArray.push(`${yearStr}${monthStr}${dateStr}`);
    }
}

console.log(`從 ${yearStart} 年到 ${yearEnd} 年的世界對稱日共有 ${resultArray.length} 個。`);
for ( let x=0; x<resultArray.length; x++ ){
    console.log(`第 ${x+1} 個:${resultArray[x]}`);
}

https://ithelp.ithome.com.tw/upload/images/20200910/20129873c5hiJzMD8e.png

從 2001 年到 2999 年的世界對稱日共有 38 個!
本日打完收工XD

[反省]

我知道還有很多可以改的地方啦,
例如大月小月判斷之類的orz
( 2 字頭年份不會遇到這個問題,
但 1 字頭年份會遇到......)
還有,小的寫程式的能力真的還要很多地方需要加強我知道QQ
謝謝各位路過的大大總是不厭其煩的給了小的很多建議QAQ
小的會繼續往復健寫程式手感路上邁進的!
這篇文章發出去我應該就要趕快寫隔天的文章了.......
最後再跟有看這系列文章的大大們致個歉,只好期待 30 天後我會不會變強了XD"


上一篇
Day3 - 第幾個 100 天還是很有感覺之久違的寫程式由簡單數學題目切入吧!( 1/3 )
下一篇
Day5 - 第幾個 100 天還是很有感覺之久違的寫程式由簡單數學題目切入吧!( 3/3 )
系列文
30天找回寫程式手感計劃!!!36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言