Advertisement
bluemini

Camden's Friday Puzzler (take 2) - 2011/10/14

Oct 14th, 2011
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <cffunction name="testHarness">
  2.     <cfargument name="myfunc" required="true">
  3.     <cfset var dates = []>
  4.     <cfset var x = "">
  5.     <cfset var result = {}>
  6.    
  7.     <!--- first make the dates --->
  8.     <cfloop index="x" from="1" to="100">
  9.         <cfset arrayAppend(dates, dateAdd("d", randRange(-1000,1000), now()))>
  10.     </cfloop>  
  11.    
  12.     <cfloop index="x" from="1" to="#arrayLen(dates)#">
  13.         <cfif dayOfWeek(dates[x]) neq myfunc(dates[x])>
  14.             <cfset result.status = "fail">
  15.             <cfset result.message = "Your function said the DOW for #dateformat(dates[x])# was #myfunc(dates[x])# and it should be #dayofweek(dates[x])#">
  16.             <cfreturn result>
  17.         </cfif>
  18.     </cfloop>
  19.    
  20.     <cfset result.status = "pass">
  21.     <cfreturn result>
  22. </cffunction>
  23.  
  24. <cffunction name="whatDayIsThis" output="false">
  25.     <cfargument name="d" type="date" required="true">
  26.    
  27.     <cfset var baseYear  = 2000>
  28.     <cfset var baseMonth = 1>
  29.     <cfset var baseDay   = 1>
  30.     <cfset var baseDayOfWeek = 7>
  31.    
  32.     <cfset var dYear = Year(d)>
  33.     <cfset var dMonth = Month(d)>
  34.     <cfset var dDay = Day(d)>
  35.    
  36.     <cfset var nonLeapMonths = [31,28,31,30,31,30,31,31,30,31,30,31]>
  37.     <cfset var dayOffset = 0>
  38.     <cfset var daysOut = 0>
  39.     <cfset var jumpedLeapDay = false>
  40.     <cfset var gregOffset = 0>
  41.    
  42.     <cfoutput><h3>#dateFormat(d, "YYYY-MM-DD")#</h3></cfoutput>
  43.    
  44.     <!--- each year we add a day, each leapyear we add two = 5 every 4 years. A year falls on the same day every 24 (4*7) years [1,6,4,2,7,5,3,1...] --->
  45.     <cfset yearSpan = dYear - baseYear>
  46.    
  47.     <!--- if we're ahead of base --->
  48.     <cfif yearSpan GTE 0>
  49.         AHEAD<br>
  50.         <cfoutput>YearSpan: #yearSpan#<br></cfoutput>
  51.    
  52.         <!--- div 4 to get 4 year segments --->
  53.         <cfset leap4 = ((yearSpan - 1) \ 4)>
  54.         <cfif yearSpan GT 0><cfset leap4++></cfif>
  55.         <cfoutput>Leap4: #leap4#<br></cfoutput>
  56.    
  57.         <!--- since years evenly divisible by 100 are not leap, check the span and correct the offset --->
  58.         <cfset leap100 = (yearSpan \ 100)>
  59.         <cfoutput>Leap100: #leap100#<br></cfoutput>
  60.    
  61.         <!--- since years evenly divisible by 400 are not leap, check the span and correct the offset --->
  62.         <cfset leap400 = (yearSpan \ 400)>
  63.         <cfoutput>Leap400: #leap400#<br></cfoutput>
  64.    
  65.         <cfset daysOut = yearSpan>
  66.         <cfoutput>DaysOut (with yearspan): #daysOut#<br></cfoutput>
  67.    
  68.         <cfset daysOut += leap4>
  69.         <cfoutput>DaysOut (leap4): #daysOut#<br></cfoutput>
  70.  
  71.         <cfset daysOut -= leap100>
  72.         <cfoutput>DaysOut (leap100): #daysOut#<br></cfoutput>
  73.  
  74.         <cfset daysOut += leap400>
  75.         <cfoutput>DaysOut (leap400): #daysOut#<br></cfoutput>
  76.  
  77.         <!--- calculate the days from the start of the year --->
  78.         <cfloop from="1" to="#dMonth-1#" index="mon"><cfset dayOffset += nonLeapMonths[mon]></cfloop>
  79.         <cfset dayOffset = dayOffset + dDay - baseDay>
  80.         <cfoutput>DayOffset: #dayOffset#<br></cfoutput>
  81.        
  82.         <cfset daysOut += dayOffset>
  83.         <cfoutput>DaysOut (with day offset): #daysOut#<br></cfoutput>
  84.        
  85.         <!--- if the d year is leap and we're past march-01 and we're ahead, add leap offset --->
  86.         <cfif ((dYear % 400 EQ 0) OR (dYear % 100 NEQ 0 AND dYear % 4 EQ 0)) AND dMonth GTE 3>
  87.             <cfset daysOut++>
  88.             <cfoutput>DaysOut (leap adjusted): #daysOut#<br></cfoutput>
  89.         </cfif>
  90.        
  91.         <cfset daysOut = baseDayOfWeek + daysOut>
  92.     <cfelse>
  93.         BEHIND<br>
  94.  
  95.         <cfset yearSpan++>
  96.         <!--- the Julian calendar gave way to the Gregorian calendar over the period
  97.            Thursday, 4 October 1582 and this was followed by the first day of the Gregorian calendar, Friday, 15 October 1582
  98.            http://en.wikipedia.org/wiki/Gregorian_calendar
  99.        --->
  100.         <cfif dYear LT 1582
  101.            OR (dYear EQ 1582 AND dMonth LT 10)
  102.            OR (dYear EQ 1582 AND dMonth EQ 10 AND dDay LTE 4)>
  103.             <cfset gregOffset = 9>
  104.             <!--- the max year span is 1582, before which leap years didn't exist --->
  105.             <cfset leapYearSpan = baseYear - 1582>
  106.         <cfelse>
  107.             <cfset leapYearSpan = yearSpan>
  108.         </cfif>
  109.    
  110.         <cfoutput>YearSpan: #yearSpan#<br></cfoutput>
  111.        
  112.         <!--- div 4 to get 4 year segments --->
  113.         <cfset leap4 = (yearSpan \ 4)>
  114.         <cfoutput>Leap4: #leap4# [#yearSpan#]<br></cfoutput>
  115.    
  116.         <!--- since years evenly divisible by 400 are not leap, check the span and correct the offset --->
  117.         <cfset leap100 = (leapYearSpan \ 100)>
  118.         <cfoutput>Leap100: #leap100#<br></cfoutput>
  119.    
  120.         <!--- since years evenly divisible by 400 are not leap, check the span and correct the offset --->
  121.         <cfset leap400 = (leapYearSpan \ 400)>
  122.         <cfoutput>Leap400: #leap400#<br></cfoutput>
  123.    
  124.         <cfset daysOut = yearSpan>
  125.         <cfoutput>DaysOut (with yearspan): #daysOut#<br></cfoutput>
  126.    
  127.         <!--- add on the leap years --->
  128.         <cfset daysOut += leap4>
  129.         <cfoutput>DaysOut (leap4): #daysOut#<br></cfoutput>
  130.  
  131.         <!--- take off div 100 years --->
  132.         <cfset daysOut -= leap100>
  133.         <cfoutput>DaysOut (leap100): #daysOut#<br></cfoutput>
  134.        
  135.         <!--- take off div 400 years --->
  136.         <cfset daysOut += leap400>
  137.         <cfoutput>DaysOut (leap400): #daysOut#<br></cfoutput>
  138.        
  139.         <!--- calculate the days to the end of the year --->
  140.         <cfloop from="#dMonth#" to="12" index="mon"><cfset dayOffset += nonLeapMonths[mon]></cfloop>
  141.         <cfset dayOffset = dayOffset - dDay + baseDay>
  142.         <cfoutput>DayOffset: #dayOffset#<br></cfoutput>
  143.        
  144.         <cfset daysOut = daysOut - dayOffset>
  145.         <cfoutput>DaysOut (with day offset): #daysOut#<br></cfoutput>
  146.        
  147.         <!--- if the d year is leap and we're past march-01 and we're ahead, add leap offset --->
  148.         <cfif ((dYear % 400 EQ 0) OR (dYear % 100 NEQ 0 AND dYear % 4 EQ 0)) AND dMonth LT 3>
  149.             <cfset daysOut-->
  150.             <cfoutput>DaysOut (leap adjusted): #daysOut#<br></cfoutput>
  151.         </cfif>
  152.        
  153.         <cfset daysOut += gregOffset>
  154.        
  155.         <cfset daysOut = baseDayOfWeek + daysOut>
  156.     </cfif>
  157.    
  158.     <!--- mod the offset to within a week --->
  159.     <cfset daysOut = daysOut % 7>
  160.     <cfoutput>DaysOut (mod 7): #daysOut#<br></cfoutput>
  161.    
  162.     <!--- if the offset is negative, add 7 to get positive --->
  163.     <cfif daysOut LTE 0><cfset daysOut = 7 + daysOut></cfif>
  164.     <cfoutput>DaysOut: #daysOut# [#dayOfWeek(d)#]<br></cfoutput>
  165.    
  166.     <cfif daysOut NEQ dayOfWeek(d)>
  167.         <h1>ERRRRRRROOOOOOOORRRRRRR</h1><cfabort>
  168.     </cfif>
  169.    
  170.     <cfreturn daysOut>
  171. </cffunction>
  172.  
  173. <!--- test data --->
  174. <cfset whatDayIsThis(CreateDate(2000, 1, 1))>
  175. <cfset whatDayIsThis(CreateDate(2000, 2, 1))>
  176. <cfset whatDayIsThis(CreateDate(2000, 3, 1))>
  177. <cfset whatDayIsThis(CreateDate(1999, 12, 1))>
  178. <cfset whatDayIsThis(CreateDate(1999, 1, 1))>
  179. <cfset whatDayIsThis(CreateDate(1999, 2, 26))>
  180. <cfset whatDayIsThis(CreateDate(1997, 2, 26))>
  181. <cfset whatDayIsThis(CreateDate(1996, 2, 26))>
  182. <cfset whatDayIsThis(CreateDate(1996, 6, 26))>
  183. <cfset whatDayIsThis(CreateDate(1980, 1, 1))>
  184. <cfset whatDayIsThis(CreateDate(1988, 6, 26))>
  185. <cfset whatDayIsThis(CreateDate(1648, 6, 26))>
  186. <cfset whatDayIsThis(CreateDate(1582, 10, 15))>
  187. <cfset whatDayIsThis(CreateDate(1582, 10, 4))>
  188. <cfset whatDayIsThis(CreateDate(1581, 10, 4))>
  189. <cfset whatDayIsThis(CreateDate(1580, 1, 1))>
  190. <cfset whatDayIsThis(CreateDate(1579, 12, 31))>
  191. <cfset whatDayIsThis(CreateDate(1439, 3, 9))>
  192. <cfset whatDayIsThis(CreateDate(1066, 6, 2))>
  193.  
  194. <cfset res = testHarness(whatDayIsThis)>
  195. <cfdump var="#res#" label="The Result">
  196.  
  197.  
  198.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement