Solution: Cryptic Math Equation (Backtracking)
Look at an implementation that uses backtracking to solve the cryptic math equation.
We'll cover the following...
Solution
Press + to interact
@letters = ['U', 'K', 'S', 'A', 'R', 'G', 'I', 'N']@letter_to_digits = {} # hash to store the solution@is_digit_used = {0 => false, 1 => false, 2 => false, 3 => false, 4 => false, 5 => false, 6 => false, 7 => false, 8 => false, 9 => false }def decode_letters_to_number(a, d)d.each do |k, v|a = a.gsub(k,v) #if k && venda.to_ienddef check_ans()a = decode_letters_to_number('UK', @letter_to_digits)b = decode_letters_to_number('USA', @letter_to_digits)c = decode_letters_to_number('USSR', @letter_to_digits)d = decode_letters_to_number('AGING', @letter_to_digits)# puts "[DEBUG] Checking #{a} + #{b} + #{c} = #{d}"if a + b + c == dputs "#{a} + #{b} + #{c} = #{d}" # got itputs @letter_to_digitsendenddef find_out(idx = 0)if idx == @letters.length # got 8 letter filledcheck_ans()returnend(0..9).each do |i|# assign 0 - 9 to each letternext if i == 0 and (@letters[idx] =='U' || @letters[idx] =='A' ) # no leading 0next if @letters[idx] == 'A' && i != 1next if @letters[idx] == 'U' && i != 9next if @letters[idx] == 'G' && i != 0unless @is_digit_used[i]@is_digit_used[i] = true # the number is used@letter_to_digits[@letters[idx]] = i.to_sfind_out(idx + 1)@is_digit_used[i] = false # clearendendendstart_time = Time.nowfind_out # startputs "Time to solve: #{Time.now - start_time}"
Explanation
Lines 1–3: The instance variables are defined to store data while processing.
Lines 5–10: The
decode_letters_to_numbers
...