公司最近組織了一個技能鑑定,試題如下:
有一個採用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程式碼。
天蓬老师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",就傻眼了~