iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

菜鳥工程師的奇幻漂流:跟著kata活化手指和意識系列 第 26

Take a Ten Minute Walk

今日kata

原始題目如下:(6kyu)
You live in the city of Cartesia where all roads are laid out in a perfect grid. You arrived ten minutes too early to an appointment, so you decided to take the opportunity to go for a short walk. The city provides its citizens with a Walk Generating App on their phones -- everytime you press the button it sends you an array of one-letter strings representing directions to walk (eg. ['n', 's', 'w', 'e']). You always walk only a single block for each letter (direction) and you know it takes you one minute to traverse one city block, so create a function that will return true if the walk the app gives you will take you exactly ten minutes (you don't want to be early or late!) and will, of course, return you to your starting point. Return false otherwise.

翻譯:
短文無誤... 你住在一個街道為完美格狀排列的城市中,現在有10分鐘空檔,也剛好有個漫步app(?)可以產生一連串n s w e推薦路線,每一個方位你只會走一個街區(block)以及走一個街區需要花費1分鐘。
必須判斷app所提供的路線能不能讓你在10分鐘來回(不多不少,要剛剛好走10分鐘),回傳true or false。

範例:

['n','s','n','s','n','s','n','s','n','s','n','s']  ==> fail
['n','w','n','w','n','w','n','w','n','w']          ==> fail
['n','s','e','w','n','s','e','w','n','s']          ==> pass
['n','n','n','s','s','s','e','w','n','s']          ==> pass
 

構想&解法

function isValidWalk(walk) {
  let position={'x':0, 'y':0}
  
  for (let step of walk){
    switch(step){
        case 'n':
        position.y++
        break;
       case 's':
        position.y--
        break;
        case 'w':
        position.x--
        break;
        case 'e':
        position.x++
        break;
    }
  }
  return position.x===0 && position.y===0 && walk.length===10? true: false
    
}

「10分鐘」內要回到原點,座標軸概念,用xy軸劃分東西南北,往北:y++;往南:y--;往東:x++;往西:x--
需要驗證最後是否回到起點(0,0)以及花費的時間


其他解法觀摩

function isValidWalk(walk) {
  function count(val) {
    return walk.filter(function(a){return a==val;}).length;
  }
  return walk.length==10 && count('n')==count('s') && count('w')==count('e');
}

宣告一function count,傳入方位可回傳walk陣列中該方位出現的次數。
回到原點即代表walk中,相對方位出現的次數一樣,所以總共判斷三個條件是否都符合:

  • walk.length==10,是否能剛好在10分鐘回來
  • count('n')==count('s'),南北向抵銷
  • count('w')==count('e'),東西向抵銷

感想

什麼code才是好?

code能正常work是基本....不算好

有句話這麼說 『唯一有效評估程式品質的標準單位是 每分鐘罵髒話的次數
https://ithelp.ithome.com.tw/upload/images/20201011/201281220Z1ibCmkEr.jpg
圖摘自:https://www.osnews.com/story

『程式的可讀性、可維護性、可變動性都很重要』

寫程式時我很容易一鼓作氣(?)就把所有的要做的運算、判斷寫在同一個function中,其實寫程式和以前數學解題不一樣。在程式中可以再把一些小功能抽出來寫成一個function,就像上面的範例:

 function count(val) {
    return walk.filter(function(a){return a==val;}).length;
  }

把count方位的功能獨立出來,也從function的命名中,知道coding的思維,『啊 它要計算各方位的總數量,而不是劃分xy軸,逐一加減』

期待之後有篇幅再分享更多『程式的可讀性、可維護性、可變動性都很重要』的範例...
再度許下一個期待/images/emoticon/emoticon02.gif

以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。


上一篇
Sum of pairs
下一篇
Equal Sides Of An Array
系列文
菜鳥工程師的奇幻漂流:跟著kata活化手指和意識30

尚未有邦友留言

立即登入留言