Courses/CS 460/Fall 2005/Homework/Xuong Tsan/Nov 19

From CSWiki

Jump to: navigation, search

Nov 19 homework solutions


Contents


[edit] Homework Page

Homework page is: | http://cs.calstatela.edu/~wiki/index.php/Courses/CS_460/Fall_2005/Homework/Xuong_Tsan

[edit] Jug Puzzles

local
   proc{MakeJug Id Size Amount ?Jug}
 %     Amount =< 0 = true
 %     Size >= Amount = true
      Jug = {MakeRecord jug [id size amount]}
      Jug.id = Id
      Jug.size = Size
      Jug.amount = Amount
   end  

   proc{FillJug Jug ?NJug}
      NJug = {MakeJug Jug.id Jug.size Jug.size}
      {Browse 'Fill'#Jug}
   end

   proc{EmptyJug Jug ?NJug}
      NJug = {MakeJug Jug.id Jug.size 0}
      {Browse 'Empty'#Jug}
   end

   proc{PourJug Jug1 Jug2 ?NJug2}
      if Jug2.amount == 0 then
	 NJug2 = {MakeJug Jug2.id Jug2.size Jug1.amount}
	% NJug1 = {EmptyJug Jug1}
      else
	 local Cap Remain Fill in
	    Cap = Jug2.size - Jug2.amount
	  %  Remain = Jug1.amount - Cap
	    Fill = Jug2.amount + Cap
	    NJug2 = {MakeJug Jug2.id Jug2.size Fill}
	   % {Browse Remain}
	   % {Browse Cap}
	    % {MakeJug Jug1.id Jug1.size Remain}
	 end
      end
  %    {EmptyJug Jug1}
      {Browse 'Pour for  '#Jug1#' to  '#Jug2}
     
   end

   proc {IsFilled Jug ?Ans}
      if Jug.size == Jug.amount then Ans = true
      else
	Ans = false
      end
   end
   
   
   proc{JugPluz Jug1 Jug2 Measure ?Ans}
      J1 J2 Lop Mn
   in
      J1 = {MakeJug 1 Jug1 0}
      J2 = {MakeJug 2 Jug2 0}
      Lop = (J1.size * J2.size) div Measure
      {For 0 Lop 1 proc{$ I}
		      if Measure == (I*J2.size mod J1.size) then
			 Mn = I*J2.size
			 {Browse Mn}
		      elseif Measure ==  (((J1.size * J2.size) - (I*J2.size)) mod J1.size) then
			 Mn = (((J1.size * J2.size) - (I*J2.size)) mod J1.size)
			 {Browse Mn}
		      else
			 {Browse 'Not Answer'}
			
		      end
		   end
        
      }

      
   end
   
      
   
in
   %{Browse 1}
   %{Browse {EmptyJug {FillJug {MakeJug 1 3 0}}}}
   %{Browse '***********'}
   %{Browse {PourJug {MakeJug 1 5 3} {MakeJug 2 5 2}}}
   {Browse {JugPluz 9 5 8}}
end



[edit] Reading, Designing,and Debugging

local
   proc {Partition Src Sink Amount ?Yes}
      if Src==0 then {Browse 'Jug1 cannot be 0'}
      elseif Sink==0 then {Browse 'Jug2 cannot be 0'}
      elseif Src < Sink then {Browse 'Jug2 have to less than Jug1'}
      elseif Src < Amount then {Browse 'Amount have to be less than Jug1 and greater then Jug2'}
      else {Loop Src Amount}

	 %first start with 
	 % 0*Sink (mod Src)
	 % 1*Sink (mod Src)
	 % 2*Sink (mod Src)
	 % 3*Sink (mod Src)
	 % This mean the remainder of Src will equal to Amount

	 %%Then
	 % (Src*Sink - 3*Sink) (mod Src)
	 % (Src*Sink - 2*Sink) (mod Src)
	 % (Src*Sink - 1*Sink) (mod Src)
   end

      %find the number of times the funciton have to stop
      fun {Loop Src Amount}
	 }

end