Codewars kata: If you can read this…
上Codewars練功拉~
第一個題目當然先來個簡單的試試
If you can read this…
恩這題目名字真好,果然我學swift最大的敵人是英文!!??
根據我那英文老師都表示:
看你可憐讓你過好了的英文水準白話翻譯之後
題目大概是說
來這張表拿去
看到哪個英文字就把它換成後面的單詞
所以範例給的input: If you can read
解碼完就變成:India Foxtrot Yankee Oscar Uniform Charlie Alfa November Romeo Echo Alfa Delta
先來想想有什麼需要
- 需要讀取輸入的字串的所有字母
- 把字母換成對應的字串(空格、標點處理)
- 輸出
首先是拿到數入的字串words,接下來第三行用來讀出words中每一個字母
然後用switch去比較,會有三種不同的情況
- 是英文字母(line5 ~ 56): 轉換成對應字串加入準備回傳的字串並在最後加上一個空格
- 是標點符號(line59 ~ 60): 準備回傳的字串加上自己以及一個空格
- 空格(line57 ~ 58): 上面兩種情況處理過了所以啥都不做,這裡只是臨時想不到應該幹嘛就隨便寫點東西充版面!!??
最後的字串會多個空格所以把最後一個字拿掉然後輸出
不過,身為一名好學(X)懶惰(O)的好學生
當然要看看有沒有其他更好(更懶)的寫法
首先來想想上面的寫法有哪些可以改進的
- 一定要大小寫都放進去判斷?
- 每次都要手動加空格?
- 總之字打太多手很酸?
希望可以寫一次大寫字母就好,所以先把對照表定義成Dictionary
然後再function裡面拿到字串之後先用.replacingOccurrences把空格全都去掉
再用.uppercased把所有字母換成大寫
這樣接下來就可以用定義好的Dictionary來比對了
最後的32行我們分開成三個階段來看比較好懂
word.characters.map{String($0)}
第一階段我們一樣用characters把剛才處理好的字串變成一個一個的字母
然後使用map這個函數
map可以把傳進來的東西回傳到一個新的Array裡面
所以假設剛才處理好的字串長這樣:
DIDNOTSEETHATCOMING
在上面的map處理完之後就變成:
[“D”, “I”, “D”, “N”, “O”, “T”, “S”, “E”, “E”, “T”, “H”, “A”, “T”, “C”, “O”, “M”, “I”, “N”, “G”]
再使用一次map
.map{dictionary[$0] ?? $0}
這次就是把傳進來的Array中的元素一個一個用dictionary裡的字串取代掉
而標點符號這種沒有定義的就不去改變他直接放回去
執行完的Array應該會變成:
[“Delta”, “India”, “Delta”, “November”, “Oscar”, “Tango”, “Sierra”, “Echo”, “Echo”, “Tango”, “Hotel”, “Alfa”, “Tango”, “Charlie”, “Oscar”, “Mike”, “India”, “November”, “Golf”]
最後一步,用空格把Array裏的所有字串接起來
.joined(separator: “ “)
就可以拿到要輸出的答案了