Courses/CS 460/Fall 2005/Homework/Sean Tseng/Nov 5

From CSWiki

Jump to: navigation, search

%LET THERE BE LIGHT
local
   proc {Light Solution}
      L E T H R B I G
      Vars = [L E T H R B I G]
   in
      Solution = [L E T]#[T H E R E]#[B E ]#[L I G H T]
      Vars ::: 0#9                                      
      {FD.distinct Vars}                                
      L \=: 0                                          
      T \=: 0
      B \=: 0
                            100*L + 10*E + T                 
      +  10000*T + 1000*H + 100*E + 10*R + E
      +                             10*B + E
      =: 10000*L + 1000*I + 100*G + 10*H + T
      {FD.distribute ff Vars}
   end
in
   {Browse {SearchAll Light}}
end

%Rotate Digit
local
   proc {Mult L1 X L2}
      A B C D E F R S T U V W in
      L1 = [A B C D E F]
      L2 = [R S T U V W]
      (A*100000 + B*10000 + C*1000 + D*100 + E*10 + F)
      * X =:
      (R*100000 + S*10000 + T*1000 + U*100 + V*10 + W)
   end
   proc {RotateDigit Ans}
      A B C D E F       
   in
      Ans = [A B C D E F]
      Ans ::: 0#9
      {Mult [A B C D E F] 1 [A B C D E F]}
      {Mult [A B C D E F] 3 [B C D E F A]}
      {Mult [A B C D E F] 2 [C D E F A B]}
      {Mult [A B C D E F] 6 [D E F A B C]}
      {Mult [A B C D E F] 4 [E F A B C D]}
      {Mult [A B C D E F] 5 [F A B C D E]}
      {FD.distinct Ans}
      {FD.distribute ff Ans}
   end
in
   {Browse {SearchAll RotateDigit}}
end

%Divisible Digits
local
   fun {IsDigit}
      choice 1[] 2 [] 3 [] 4 [] 5 [] 6 [] 7 [] 8 [] 9 end
   end
   proc {ModConstr L1 N}
      A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 in
      L1 = [A0 A1 A2 A3 A4 A5 A6 A7 A8 A9]
      (A0 * 1000000000 +
       A1 * 100000000 +
       A2 * 10000000 +
       A3 * 1000000 +
       A4 * 100000 +
       A5 * 10000 +
       A6 * 1000 +
       A7 * 100 +
       A8 * 10 + A9) mod N =: 0
   end
   proc {DivDigit Var}
      A B C D E F G H I J
   in
      Var = [A B C D E F G H I J]
      Var ::: 0#9
      {FD.distinct Var}
      A =: {IsDigit}
      B =: {IsDigit}
      C =: {IsDigit}
      D =: {IsDigit}
      E =: {IsDigit}
      F =: {IsDigit}
      G =: {IsDigit}
      H =: {IsDigit}
      I =: {IsDigit}
      J =: 0
      {ModConstr [A B C D E F G H I J] (9 * 8 * 7 * 6 * 5)}
      {FD.distribute ff Var}
   end
in
   {Browse {SearchAll DivDigit}}
end