I'm working through a course now, and was tasked with the following:
Write a function,
no_repeats(year_start, year_end)
, which takes a range of years and outputs those years which do not have any repeated digits.You should probably write a helper function,
no_repeat?(year)
which returns true/false if a single year doesn't have a repeat.
I did not know about each_char yet, so I wrote the following:
def no_repeats(year_start, year_end)
(year_start..year_end).to_a.keep_if {|year| no_repeat?(year)}
end
def no_repeat?(year)
year_array = year.to_s.split(//)
year_array == year_array.uniq
end
I'm wondering if:
- there is an easier way to make an array from a string with no spaces
- there is a way to convert each character in a number to an item in a single array without converting the number to a string first
- there is a better way to do this problem
This is the model solution for a beginner:
def no_repeats(year_start, year_end) no_repeats = [] (year_start..year_end).each do |yr| no_repeats << yr if no_repeat?(yr) end no_repeats end def no_repeat?(year) chars_seen = [] year.to_s.each_char do |char| return false if chars_seen.include?(char) chars_seen << char end return true end
I'm also wondering about the advantages and disadvantages of my code compared to the model solution. I kind of get that shorter code is better, and readability matters. I don't know how to test code for time yet.