關於Advent of code
“Advent of code” 是一年一度的以聖誕節為主題的計算機程式挑戰。自2015年以來一直在運行。程式難題涵蓋各種技能集和技能級別,可以使用任何編程語言來解決。參與者還可以在全球和私人排行榜上根據速度進行競爭。該活動由軟件工程師Eric Wastl創立並維護。
來源:維基百科
Day 1 - part.1 今年第一次來參與Advent of code,順便把我的解題過程也記錄下來٩(^ᴗ^)۶
這是第一天 Part 1的題目:
第一部分比較簡單,只要透過gsub就可以解決!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def process_input (input_array ) results = [] input_array.each do |input_string | digits = input_string.gsub(/\D/ , '' ) result = "#{digits[0 ]} #{digits[-1 ]} " results.push(result) end sum_result = results.map(&:to_i ).sum puts sum_resultend
Day1 Part.2 第二部分我整個大卡關(ᗒᗣᗕ)՞
有想出說做出一個hash,將”one” => “1”依序輸入進去, 接著使用each+gsub將將裡面的數字替換掉, 但遇到eightwothree,輸出的結果卻是eigh23….
最後上網找了CJ Avilla 分享的解法, 來源: Match and Scan - Day 01 - Advent of Code 2023
原來使用match方法就可以了ʕ •̀ o •́ ʔ
關於match,Ruby API 是這樣解釋:String#match
Returns a MatchData object (or nil
) based on self
and the given pattern
. Note: also updates Special global variables at Regexp
. Computes regexp
by converting pattern
(if not already a Regexp).
match會回傳符合內容的物件,看起來像這個樣子:
另外可以使用常規表達法轉換,所以解法可以這樣寫:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 input = <<~INPUT two1nine eightwothree abcone2threexyz xtwone3four 4nineeightseven2 zoneight234 7pqrstsixteen INPUT replacement = { "one" => "1" , "two" => "2" , "three" => "3" , "four" => "4" , "five" => "5" , "six" => "6" , "seven" => "7" , "eight" => "8" , "nine" => "9" , "1" => "1" , "2" => "2" , "3" => "3" , "4" => "4" , "5" => "5" , "6" => "6" , "7" => "7" , "8" => "8" , "9" => "9" , "0" => "0" } result = input.each_line.map do |line | digits = line.match(/(#{replacement.keys.join('|' )} )/ , 0 ) first = replacement[digits[0 ]] digits = line.reverse.match(/(#{replacement.keys.map(&:reverse ).join('|' )} )/ , 0 ) last = replacement[digits[0 ].reverse] (first+last).to_iend .sum p result
輸入結果最後拿到星星了(´∀`)(有點心虛)
不過在挑戰的過程中,感覺自己又進步了一些ヾ(*´∇`)ノ
最後真的很感謝CJ Avilla 大神能夠提供解法!
如果您有興趣了解更多,請參考:
參考資料:
Match and Scan - Day 01 - Advent of Code 2023
Comments