搜尋

首頁  >  問答  >  主體

code - Ruby 菜鳥代碼拍磚

公司最近組織了一個技能鑑定,試題如下:
有一個採用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程式碼。

大家讲道理大家讲道理2760 天前619

全部回覆(1)我來回復

  • 天蓬老师

    天蓬老师2017-04-24 09:12:48

    我來拋磚引玉一下...

    • 程式碼風格上

      • 雙空格縮排

      • 有參函數呼叫的括號 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",就傻眼了~

    回覆
    0
  • 取消回覆