iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 14

Codewars Ruby Challenge - Day 14/30

  • 分享至 

  • xImage
  •  

學習

  1. with_index 方法:當 .each / .map 時需要位置編號,也就是 index 時,不需要自己額外生 counter,可以直接用 with_index 方法

題目:

# 觀察輸出結果,實作相對應的程式:

def accum(s)
  # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "觀察輸出結果,實作相對應的程式" do
    expect(accum("ZpglnRxqenU")).to eq 'Z-Pp-Ggg-Llll-Nnnnn-Rrrrrr-Xxxxxxx-Qqqqqqqq-Eeeeeeeee-Nnnnnnnnnn-Uuuuuuuuuuu'
    expect(accum("NyffsGeyylB")).to eq 'N-Yy-Fff-Ffff-Sssss-Gggggg-Eeeeeee-Yyyyyyyy-Yyyyyyyyy-Llllllllll-Bbbbbbbbbbb'
    expect(accum("MjtkuBovqrU")).to eq 'M-Jj-Ttt-Kkkk-Uuuuu-Bbbbbb-Ooooooo-Vvvvvvvv-Qqqqqqqqq-Rrrrrrrrrr-Uuuuuuuuuuu'
    expect(accum("EvidjUnokmM")).to eq 'E-Vv-Iii-Dddd-Jjjjj-Uuuuuu-Nnnnnnn-Oooooooo-Kkkkkkkkk-Mmmmmmmmmm-Mmmmmmmmmmm'
    expect(accum("HbideVbxncC")).to eq 'H-Bb-Iii-Dddd-Eeeee-Vvvvvv-Bbbbbbb-Xxxxxxxx-Nnnnnnnnn-Cccccccccc-Ccccccccccc'
  end
end

我的答案

def accum(s)
  result = ""
  counter = -1
  result = s.upcase.chars.map do |ss|
              counter += 1
              ss + ss.downcase * counter
            end
  result.join("-")
end

思路:

  1. 看完後有找到規律,跟大小寫沒有關係,但希望後面比較好處理,所以想先全部改成大寫,接著隨著字元的位置,第二個開始會是給的字母大寫一次配小寫一次,第三個則是大寫一次配小寫兩次,只有小寫會隨著位置累加 1,另外,每組的中間還需要用「-」符號隔開
  2. 為了達到「大寫且後面可以每個字元進行操作」,所以採用 s.upcase.chars.map 的方式,再透過 counter 來達成「小寫會隨著位置累加 1」
  3. 原本想在 map 裡面就處理每組中間用「-」分隔,但發現這樣最後一組會多一次「-」,想到可以最後再用 join("-") 處理

龍哥建議的答案

def accum(s)
  s.chars.map.with_index { |c, index| (c * (index + 1)).capitalize }.join("-")
end

(乾…又是一行,都忘記有 with_index 的方法)


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

尚未有邦友留言

立即登入留言