iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 11

Codewars Ruby Challenge - Day 11/30

  • 分享至 

  • xImage
  •  

學習

  1. 將字串拆成字元的方法:除了 string.split("")的方式,還可以用 string.chars(),兩者目的一樣,但後者用 chars 字面上更直接說明「我要把字串拆成字元」
  2. 英文字母也可以直接篩選範圍:今天才知道原來找 m 之後的字母可以直接用「> 'm'」像數字一樣的方式
    找符合的字元可以用 regular expression:這題就跟要判斷 email 格式是否正確一樣,可以用 regular expression,搭配 scan 方法,非常方便(Ruby regular expression 工具
  3. Ruby 裡將字串轉換成 ASCII 的方法:"a".ord -> 97,方法就是用 ord(是 ordinal 的縮寫,中文翻 序數),文件提到它的用途是「將單一字元轉換成 ASCII 碼後,回傳數字」

題目:

# 工廠的某台印表機只能印出 a 到 m 的字,請完成實作內容,把不應該出現的字算出來:

def printer_error(s)
    # 實作內容
end

答案需要過以下測試:

RSpec.describe do
  it "不該出現的字" do
    expect(printer_error("aaabbbbhaijjjm")).to eq '0/14'
    expect(printer_error("aaaxbbbbyyhwawiwjjjwwm")).to eq '8/22'
expect(printer_error("aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbmmmmmmmmmmmmmmmmmmmxyz")).to eq '3/56'
  end
end

我的答案

def printer_error(s)
    string_length = s.length
    incorrect = s.split("").map(&:ord).select { |n| n > 109 }.count
    "#{incorrect}/#{string_length}"
end

思路:

  1. 目標需要先計算出「整個字串長度」與「不在a~m範圍的數量」最後再組合印出
  2. 前者靠 length 輕鬆得到,後者因為英文不像數字可以直接用 select 篩選範圍,想到可以先轉成 ASCII 碼後再計算
  3. ruby 裡 ASCII 轉碼的語法還真的不知道,google 後找到 .ord 的方法一切就沒問題啦

龍哥建議的答案

def printer_error(s)
    "#{s.scan(/[^a-m]/).count}/#{s.length}"
end

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

尚未有邦友留言

立即登入留言