HomeHome More SamplesMore Samples

///////////////////////////////////////////////////////////////////////////////
// Eighteen
///////////////////////////////////////////////////////////////////////////////
// Enigma 1496 Albert Haddad, New Scientist magazine, May 31, 2008
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// An eight digit "multiplicand" comprising of dots and letters is multiplied
// by 2 resulting in the product EIGHTEEN. Different letters stand for 
// different digits, the same letter stands for the same digit, and a dot can 
// be any digit. 
//
//     . . N I N E . .
//                 * 2
//    ----------------
//  =  E I G H T E E N
//    ----------------
//
// What is the eight-digit product EIGHTEEN?
//
///////////////////////////////////////////////////////////////////////////////
//
// Solve the problem by running the query:
//
//      all Eighteen_Lazy(xlazy)
//
// or 
//      all Eighteen_Fast(xfast)
//
///////////////////////////////////////////////////////////////////////////////
//
// Results:
//
// xlazy = 91637998
// ___ Solution: 1 __________________________________
// 
// Number of solutions: 1   Number of backtracks: 24328306
// Elapsed time: 00:04:14  
//
//
// xfast = 91637998
// ___ Solution: 1 __________________________________
//
// Number of solutions: 1   Number of backtracks: 190
// Elapsed time: 00:00:00
//                             
///////////////////////////////////////////////////////////////////////////////
//
// Notes: Two ways of solving the problem are presented. 
//        One simple but slow, the other a bit more complex but a lot faster. 
//
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
// Just constrain the variables exactly the way the problem specifies.
// No thinking involved. Let the computer do the work. 
local Digit = L[0..9]

pred Eighteen_Lazy(x::L[1..]) iff
    digits ::[0..]->>Digit & digits = [e,i,g,h,t,n] & e <> 0 &
    d1::Digit & d2::Digit & d3::Digit & d4::Digit & d1 <> 0 &
    x = e*10000000 + i*1000000 + g*100000 + h*10000 + t*1000 + e*100 + e*10 + n &   
    (d1*10000000 + d2*1000000 + n*100000 + i*10000 + n*1000 + e*100 + d3*10 + d4)*2 = x 


///////////////////////////////////////////////////////////////////////////////
// Tell the computer how to multiple digit by digit, from the least significant
// digit to the most significant digit, adding carry. 
// (Just like they taught us in elementary school)

local DigitI = I[0..9] 

pred Eighteen_Fast(x::[1..]) iff
    digits ::[0..]->>DigitI & digits = [e,i,g,h,t,n] & e <> 0 &
    d1::DigitI & d2::DigitI & d3::DigitI & d4::DigitI & 
 
    x0 =(d4*2     ) & n = x0 mod 10 & c1 = x0/10 &
    x1 =(d3*2 + c1) & e = x1 mod 10 & c2 = x1/10 &
    x2 =( e*2 + c2) & e = x2 mod 10 & c3 = x2/10 &
    x3 =( n*2 + c3) & t = x3 mod 10 & c4 = x3/10 & 
    x4 =( i*2 + c4) & h = x4 mod 10 & c5 = x4/10 &
    x5 =( n*2 + c5) & g = x5 mod 10 & c6 = x5/10 &
    x6 =(d2*2 + c6) & i = x6 mod 10 & c7 = x6/10 &
    x7 =(d1*2 + c7) & e = x7 mod 10 &  0 = x7/10 &

    x = e*10000000 + i*1000000 + g*100000 + h*10000 + t*1000 + e*100 + e*10 + n    








This page was created by F1toHTML