code - Ruby 菜鳥代碼拍磚
大家讲道理
大家讲道理 2017-04-24 09:10:48
0
1
643

公司最近組織了一個技能鑑定,試題如下:
有一個採用CP936編碼(也稱為GBK)的文本文件,名字為a.txt,該文件中存在一些連續重複的內容,比如“ HelloHello”,“國慶60週年國慶60週年”,這是因為作者在編輯的時候不小心而導致的錯誤,現在要求你編寫一個程序來自動更正它,並且為了滿足國際化的要求,必須使用小端模式的UTF-16編碼來另存為新檔案(b.txt),具體的去重規則是:

程式對此檔案進行分析處理,將上述的連續重複兩次的內容刪除掉重複部分,只保留原始內容。其它不涉及重複的部分保持原樣不變。並且,只有被重複的字串超過3個字符(注意是字符,不是字節)的時候,才算重複,小於或等於3個字符的則不需要處理

require 'pathname'
def magic_change(file)
    begin
        #read file
        return unless File.exists? file
        original_string = IO.read(file,:encoding=>'GBK').encode!('UTF-8')
        #deduplicate characters
        original_string =original_string.gsub(/([\S]{4,})\1/){Regexp.last_match[1]}
        #write file
        File.open(Pathname.new(File.join(__dir__,'b.txt')).cleanpath,"w:UTF-16LE") do |file|
            file.write original_string
        end
    rescue =>error
        p error
    end
end

magic_change(ARGV[0])

本題解法中的正則應該是沒有問題的,社區大神們看下對代碼中的ruby規範,優化,異常處理,常見函數用法等方面有沒有更好的建議或者問題,最終目標是寫一份正統優秀的ruby程式碼。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(1)
Peter_Zhu

我來拋磚引玉一下...

  • 程式碼風格上

    • 雙空格縮排

    • 有參函數呼叫的括號 File.exists?(file)

    • 可選函數參數 encoding:'GBK'

    • 函數參數間以 , 隔開

  • 異常處理上

    • 原程式碼的異常處理沒有任何意義,不如直接 raise 錯誤

  • 函數用法上

    • String#gsub

    • File.expand_path

require 'pathname'
def magic_change(file)      
  # read file      
  return unless File.exists?(file)
  original_string = IO.read(file, encoding:'GBK').encode!('UTF-8')

  # deduplicate characters
  modified_string = original_string.gsub(/([\S]{4,})/, '')

  # write file
  File.open(File.expand_path(__dir__, 'b.txt'), "w:UTF-16LE") do |file|
    file.write modified_string
  end
end

magic_change(ARGV[0])

至於優化嘛,如果是連續三個重複 "HelloHelloHello",就傻眼了~

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板