Episode 55 — Swift 程式題目練功學習資源: 在 Codewars 練習 if 練習題

最近都一直在生產小專案,很久沒有好好練習程式的基本功,幸好 Peter 有在作業裡加入練習程式基本功的作業,才提醒自己時不時要練習一下才是。

Shien
彼得潘的 Swift iOS / Flutter App 開發教室
11 min readMar 9, 2022

--

Peter 很熱心的幫大家整理出可以練習程式的地方

我選擇 Codewars 來練習,原本想選 we heart swift ,但好像已經沒人在經營這個網頁了,所以選擇 Codewars。

登入方式也蠻方便的,我是直接用我的 Github 帳號登入

首頁上方黃框會隨機出現題型,每個題目會有數字加 kyu 來判別題目難度,數字越大越簡單。但要一次顯示更多練習題型可以到左邊紅色框框的 Practice 尋找題目。

點進去可以看到紅色框的 Kata 練習題,每個 Kata 都有提供不一樣的語言,只要看到燕子圖案都是可以用 swift 語法練習的。

講到 Kata 就不得不說明一下,Kata 是日本空手道的一種練習方式,叫做“型”。是一種跟假想敵練習招式的一種方式,也就是個人練習。

可以看到 黃色框框有 8 個難度,其實在空手道裡是 “級” (Kyu) 的意思。顏色也是有根據的,白色就是白帶初學者,紫色當然就是比較資深。

以下就來找一些 if else 的題型來練習一下

Conditional Statements 練習

一樣在剛剛 Kata 的頁面往下拉,可以看到左手邊藍色框框的 Tags。裡面顯示的就是設定題目的人有用 Tags 去標記相關語法或形式的練習。這次要來練習 if-else 所以找到 Conditional Statements 的選項,可能標籤會是0個因為目前沒有人設立這樣的題目。

利用標籤選到 Conditional Statements 相關練習題並選擇任意一題,會看到以上視窗。

黃色:題目解說

綠色:你的程式輸出結果

粉色:有出現代表你曾經解決過,沒出現代表沒解決過這題。

藍色:輸入程式碼的地方

紅色:測試範例,意思是你要測試你的程式碼時系統會拿這塊裡面的程式碼去執行看是否成功。

白色:測試。如果成功解決會跳出 Submit 可以遞出你的解決方法讓其他人看,當然也可以看到別人的解法。

題型

第一題: Special Number

題目:要建立一個可以判斷數字裡包含 0~5 的特別數字,比如說 513 帶進去會回傳 “Special!!”,帶進 709 會回傳 “NOT!!”

第二題 : Disarium Number

題目:建立一個可以判斷是否為 Disarium Number 的 function。如果傳入 89 ,那 8¹ 加上 9² 會等於 89,就回傳 “Disarium !!”。若傳入564,那5¹+6²+4³ 不等於 564,就回傳 “Not !!”。(參數不會有負數)

第三題:Jumping Number

題目:當傳入 9 ,回傳 “Jumping。傳入 “1234”,回傳 “Jumping”。傳入 135,回傳 “Not!!”。簡而言之,如果數字跟數字之間都相差 1 或 只有一個數字,回傳 “Jumping”。反之回傳 “Not!!”

第四題:Balanced Number

題目:傳入一串數字,如果中間數以前左邊的數字跟中間數之後右邊的數字總和相同,回傳 “Balanced”。反之回傳 “Not Balanced”。959 回傳 “Balanced” ,因為 9 = 9。27102983 回傳 “Not Balanced”,因為 2+7+1 不點於 9+8+3。

第五題:Strong Number

題目:輸入一串數字,如果每個數字階乘的總和等於剛剛數入的數字串,回傳 “STRONG!!!!”,反之回傳 “Not Strong !!”。145 等於 1 + (4x3x2x1) + (5x4x3x2x1) = 145,所以回傳 “STRONG!!!!”。

我的答案

第一題: Special Number

func specialNumber(_ number: Int) -> String {
// Do Some Magic
for num in String(number) {
if num > "5" {
return "NOT!!"
}
}
return "Special!!"
}

第二題 : Disarium Number

func disariumNumber(_ number: Int) -> String {
//Do Some Magic
var total = 0
var index = 1

for num in String(number) {
var newNum = 1
for _ in 1...index {
newNum *= Int(String(num))!
}
total += newNum
index += 1
}

if total == number {
return "Disarium !!"
} else {
return "Not !!"
}

}

第三題:Jumping Number

func jumpingNumber(_ number: Int) -> String {
//Do Some Magic
var nums = [Int]()
var index = 0

for num in String(number) {
nums.append(Int(String(num))!)
}
if nums.count > 1 {
while index != nums.count-1 {
if nums[index]-nums[index+1] != 1 {
if nums[index]-nums[index+1] != -1 {
return "Not!!"
}
}
index += 1
}

}

return "Jumping!!"
}

第四題:Balanced Number

func balancedNumber(_ number: Int) -> String {
//Do Some Magic
var nums = [Int]()
var balance = 0

for num in String(number) {
nums.append(Int(String(num))!)
}

if nums.count > 2 {
if nums.count%2==0{
for i in 0...nums.count/2-2 {
balance += nums[i]
balance -= nums[nums.count-1-i]
}
} else {
for i in 0...nums.count/2-1 {
balance += nums[i]
balance -= nums[nums.count-1-i]
}
}
if balance == 0{
return "Balanced"
} else {
return "Not Balanced"
}

} else {
return "Balanced"
}
}

第五題:Strong Number

func strongNumber(_ number: Int) -> String {
//Do Some Magic
var nums = [Int]()
var total = 0
for num in String(number) {
nums.append(Int(String(num))!)
}

for num in 0...nums.count-1 {
var newNum = 0

if nums[num] > 0 {
newNum = 1
}
while nums[num] > 1 {
newNum *= nums[num]
nums[num] -= 1
}
total += newNum
}

if total == number {
return "STRONG!!!!"
} else {
return "Not Strong !!"
}
}

彼得的題目

當商品價錢小於等於10塊時,小費10% 當商品大於10塊,小於等於20塊時,小費15% 當商品大於20塊時,小費20%。計算商品加上小費後的價格

var price = Float.random(in: 1...30)
func addTip() -> Float{
if price <= 10 {
price += price*0.1
} else if price <= 20 {
price += price*0.15
} else {
price += price*0.2
}
return price
}
print(price)
print(addTip())

用 if-else 改編故事

最後來應 Peter 的要求來用 if-else 寫故事。我來改編一下蜘蛛人無家日的故事好了

var universe = Int.random(in: 0...1)
func changeUniverse() {
universe = Int.random(in: 0...1)
}
func multiverse() -> String {
var story = "彼得帕克打敗了神秘法師後,"
changeUniverse()
if universe == 0 {
story += "被神秘法師的錄下了真實樣貌還有對他不利的情況。\n"
changeUniverse()
if universe == 0 {
story += "全世界都知道蜘蛛人是彼得帕克。 \n"
changeUniverse()
if universe == 0 {
story += "受不了被人騷擾的小彼得向奇異博士求助。\n"
changeUniverse()
if universe == 0 {
story += "博士說服了老王開始幫助彼得。\n"
changeUniverse()
if universe == 0 {
story += "彼得不想親近的人忘記他而開始碎念。\n"
changeUniverse()
if universe == 0 {
story += "博士的魔法失去控制而導致時空裂縫。\n"
} else {
story += "雖然彼得中途碎念,但博士師法穩定度極高完成了彼得的願望。\n"
}
} else {
story += "博士下了遺忘咒後全世界的人都忘記他的事情了。\n"
}
} else {
story += "但博士聽從了老王的警告並沒有幫助彼得。\n"
}
} else {
story += "但彼得證明了自己的清白並獲得人民的愛戴。\n"
}
} else {
story += "但彼得發現錄像並把它摧毀掉。\n"
}

} else {
story += "終於結束了一段漫長的旅程。\n"
}

return story
}

print("\(multiverse())\n")

有看過漫威應該都知道他們很喜歡搞多元宇宙,這個情況感覺還滿適合用 if-else 陳述的。以下是 print 之後不同宇宙會發生的故事。

宇宙一

宇宙二

宇宙三

宇宙四

宇宙五

宇宙六

宇宙七

上面應該只是全部可能的其中一些而已,感覺還有好多個。這也難怪博士會在無限之戰看到 14,000,604 種可能。

--

--