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

先來想想有什麼需要

  1. 需要讀取輸入的字串的所有字母
  2. 把字母換成對應的字串(空格、標點處理)
  3. 輸出

首先是拿到數入的字串words,接下來第三行用來讀出words中每一個字母

然後用switch去比較,會有三種不同的情況

  1. 是英文字母(line5 ~ 56): 轉換成對應字串加入準備回傳的字串並在最後加上一個空格
  2. 是標點符號(line59 ~ 60): 準備回傳的字串加上自己以及一個空格
  3. 空格(line57 ~ 58): 上面兩種情況處理過了所以啥都不做,這裡只是臨時想不到應該幹嘛就隨便寫點東西充版面!!??

最後的字串會多個空格所以把最後一個字拿掉然後輸出

不過,身為一名好學(X)懶惰(O)的好學生

當然要看看有沒有其他更好(更懶)的寫法

首先來想想上面的寫法有哪些可以改進的

  1. 一定要大小寫都放進去判斷?
  2. 每次都要手動加空格?
  3. 總之字打太多手很酸?

希望可以寫一次大寫字母就好,所以先把對照表定義成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: “ “)

就可以拿到要輸出的答案了

--

--