iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 15

Codewars Ruby Challenge - Day 15/30

學習

  1. 取字串範圍的方式:當如果有一個字串是 a = "hello, world",當我們想拿到裡面的 ello,在 ruby 裡面我們可以使用 a[1, 4] 這樣的寫法,這個寫法的意思是「我要拿 a 這個字串中第 1 個位置(含)開始往後的 4 個值」
  2. 想用 mod 2 時可以用 .odd?/.even?:這題找中間值時,會用到「是不是能被 2 整除」這個邏輯,很容易就會想用 % 來做 mod,但其實意思等同於「判斷是否為奇數或偶數」,這樣就能用 .odd?/.even? 做會更簡短
  3. if / else 的快速寫法:使用三元運算子「expression ? true_expresion : false_expression」,以這次題目為範例如下:
# 快速寫法
len.odd? ? string[ len / 2 ] : string[ len / 2–1, 2]
# 用 if/else 原型寫
if len.odd?
   string[ len / 2 ]
else
   string[ len / 2–1, 2]
end

題目:

# 找出中間的字

def get_middle(string)
  # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "找出中間的字" do
    expect(get_middle("test")).to eq 'es'
    expect(get_middle("testing")).to eq 't'
    expect(get_middle("middle")).to eq 'dd'
    expect(get_middle("A")).to eq 'A'
    expect(get_middle("of")).to eq 'of'
  end
end

我的答案

def get_middle(string)
  length = string.length
  if length % 2 == 0
    string[length / 2 - 1] + string[length / 2]
  else
    string[length / 2]
  end
end

思路:

  1. 直接先把需要的答案改成數字,4 個字時取第 2, 3 個,7 個字取第 4 個字,6 -> 3, 4,以此類推
  2. 找出規律:
    • n % 2 == 0 -> n / 2 , n / 2 + 1
    • n % 2 != 0 -> n / 2 + 1
  3. 照著上面整理的規律轉換成 code

龍哥建議的答案

def get_middle(string)
  len = string.length
  if len <= 2
    string
  else
    len.odd? ? string[ len / 2 ] : string[ len / 2 - 1, 2]
  end
end

(又是一次腦洞大開呢~)


上一篇
Codewars Ruby Challenge - Day 14/30
下一篇
Codewars Ruby Challenge - Day 16/30
系列文
Codewars Ruby Challenge in 30 Days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言