Courses/CS 460/Fall 2005/Homework/Jay Donnell/Nov 5

From CSWiki

Jump to: navigation, search

[edit] LET + THERE + BE = LIGHT

local
   proc {Light Vars}
      L E T H R B I G      
   in
      Vars = [L E T H R B I G]
      Vars ::: 0#9
      {FD.distinct Vars}
      L \=: 0
      T \=: 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}}
   {ExploreAll Light}
end


[edit] Rotating digits

local
   fun {Convert ListIn}
      {FoldL ListIn fun {$ Z E} {FD.plus {FD.times Z 10} E} end 0}
   end

   proc {Mult L1 X L2}
      {Convert L1} * X =: {Convert L2}
   end
   
   proc {Digits Solution}
      A B C D E F
   in
      Solution = [A B C D E F]
      Solution ::: 1#9
      {FD.distinct Solution}

      {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.distribute ff Solution}
   end
in
   {Browse {SearchAll Digits}}
   {ExploreAll Digits}
end 

[edit] Divisible digits

local
   fun {Convert L}
      {FoldL L fun {$ I J} {FD.plus {FD.times I 10} J} end 0}
   end
   
   proc {DivisibleDigits Solution}
      A B C D E F G H I J
   in
      Solution = [A B C D E F G H I J]
      %Solution = [A H I J]
      Solution ::: 0#9
      {FD.distinct Solution}

      %has to end in 0
      J =: 0

      % divisible by 8?
      {FD.modI {Convert [H I J]} 8} =: 0

      %divisible by 7?
      %the second method is much faster than the first.
      %{FD.modI {FoldR Solution fun {$ El J} {FD.plus {FD.times 5 El} I} end 0} 7} =: 0
      {FD.modI {FoldL Solution fun {$ El J} {FD.plus {FD.times 3 El} J} end 0} 7} =: 0

      {FD.distribute ff Solution}
   end

   Solution
in
   {Browse {SearchAll DivisibleDigits}}
   %{ExploreOne DivisibleDigits}
end