Skip to content

Instantly share code, notes, and snippets.

@olegsobchuk
Created November 24, 2022 16:59
Show Gist options
  • Save olegsobchuk/41720e286adae1f29700e87a1c138412 to your computer and use it in GitHub Desktop.
Save olegsobchuk/41720e286adae1f29700e87a1c138412 to your computer and use it in GitHub Desktop.
test task
data = {
'mon_1_open': '09:00',
'mon_1_close': '13:00',
'tue_1_open': '09:00',
'tue_1_close': '13:00',
'wed_1_open': '16:00',
'wed_1_close': '20:00',
'thu_1_open': '09:00',
'thu_1_close': '13:00',
'fri_1_open': '09:00',
'fri_1_close': '13:00',
'sat_1_open': '09:00',
'sat_1_close': '14:00',
'mon_2_open': '16:00',
'mon_2_close': '20:00',
'tue_2_open': '16:00',
'tue_2_close': '20:00'
}
def parse(data={})
splitted = data.each_with_object({}) { |(k, v),res| res[k.to_s.split('_')] = v }
# => {["mon", "1", "open"]=>"09:00", ["mon", "1", "close"]=>"13:00", ...}
grouped = splitted.group_by { |k, v| [k[0], k[1]] }
# => {["mon", "1"]=>[[["mon", "1", "open"], "09:00"], [["mon", "1", "close"], "13:00"]], ...}
with_full_time = grouped.each_with_object({}) do |(k, v), res|
time = Array.new(2)
v.each do |data_line|
state_line, t = data_line
time[0] = t if state_line[2] == 'open'
time[1] = t if state_line[2] == 'close'
end
res[k] = time.join(' - ')
end
# => {["mon", "1"]=>"09:00 - 13:00", ["tue", "1"]=>"09:00 - 13:00", ...}
reversed = with_full_time.each_with_object({}) { |(k, v), res| res[v] = [*res[v], k[0]] }
# => {"09:00 - 13:00"=>["mon", "tue", "thu", "fri"], "16:00 - 20:00"=>["wed", "mon", "tue"], "09:00 - 14:00"=>["sat"]}
reversed.map { |k, v| "#{v.join(', ')} => #{k}" }
end
puts parse(data)
# Sorry no sorting by days, no periods
# mon, tue, thu, fri => 09:00 - 13:00
# wed, mon, tue => 16:00 - 20:00
# sat => 09:00 - 14:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment