...

/

Solution: Cryptic Math Equation (Backtracking)

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 && v
end
a.to_i
end
def 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 == d
puts "#{a} + #{b} + #{c} = #{d}" # got it
puts @letter_to_digits
end
end
def find_out(idx = 0)
if idx == @letters.length # got 8 letter filled
check_ans()
return
end
(0..9).each do |i|
# assign 0 - 9 to each letter
next if i == 0 and (@letters[idx] =='U' || @letters[idx] =='A' ) # no leading 0
next if @letters[idx] == 'A' && i != 1
next if @letters[idx] == 'U' && i != 9
next if @letters[idx] == 'G' && i != 0
unless @is_digit_used[i]
@is_digit_used[i] = true # the number is used
@letter_to_digits[@letters[idx]] = i.to_s
find_out(idx + 1)
@is_digit_used[i] = false # clear
end
end
end
start_time = Time.now
find_out # start
puts "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 ...