Five weekends: Difference between revisions

From Rosetta Code
Content added Content deleted
(Modified task description to make it easier to compare entries for correctness.)
Line 51: Line 51:
1-2100
1-2100
10-2100</pre>
10-2100</pre>

=={{header|Python}}==
<lang python>from datetime import timedelta, date

DAY = timedelta(days=1)
WEEKEND = {6, 5, 4} # Sunday is day 6
FMT = '%Y %m(%B)'

def fiveweekendspermonth(start=date(1900, 1, 1), stop=date(2101, 1, 1)):
'Compute months with five weekends between dates'
when = start
lastmonth = weekenddays = 0
fiveweekends = []
while when < stop:
year, mon, _mday, _h, _m, _s, wday, _yday, _isdst = when.timetuple()
if mon != lastmonth:
if weekenddays >= 15:
fiveweekends.append(when - DAY)
weekenddays = 0
lastmonth = mon
if wday in WEEKEND:
weekenddays += 1
when += DAY
return fiveweekends

dates = fiveweekendspermonth()
indent = ' '
print('There are %s months of which the first and last five are:' % len(dates))
print(indent +('\n'+indent).join(d.strftime(FMT) for d in dates[:5]))
print(indent +'...')
print(indent +('\n'+indent).join(d.strftime(FMT) for d in dates[-5:]))</lang>

'''Sample Output'''
<pre>There are 201 months of which the first and last five are:
1901 03(March)
1902 08(August)
1903 05(May)
1904 01(January)
1904 07(July)
...
2097 03(March)
2098 08(August)
2099 05(May)
2100 01(January)
2100 10(October)</pre>

Revision as of 07:32, 23 October 2010

Task
Five weekends
You are encouraged to solve this task according to the task description, using any language you may know.

The month of October in 2010 has five Fridays, five Saturdays, and five Sundays.

The task

  1. Write a program to show all months that have this same characteristic of five full weekends from the year 1900 through 2100 (Gregorian calendar).
  2. Show the number of months with this property.
  3. Show at least the first and last five dates, in order.

Java

<lang java>import java.util.Calendar; import java.util.GregorianCalendar;

public class FiveFSS {

     //dreizig tage habt september...
     private static int[] month31 = {Calendar.JANUARY, Calendar.MARCH, Calendar.MAY,
           Calendar.JULY, Calendar.AUGUST, Calendar.OCTOBER, Calendar.DECEMBER};
     public static void main(String[] args){
           for(int year = 1900; year <= 2100; year++){
                 for(int month:month31){
                       Calendar date = new GregorianCalendar(year, month, 1);
                       if(date.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){
                             //months are 0-indexed in Calendar
                             System.out.println((date.get(Calendar.MONTH) + 1) + "-" + year);
                       }
                 }
           }
     }

}</lang> Output (middle results cut out):

3-1901
8-1902
5-1903
1-1904
7-1904
12-1905
3-1907
5-1908
1-1909
10-1909
7-1910
...
12-2090
8-2092
5-2093
1-2094
10-2094
7-2095
3-2097
8-2098
5-2099
1-2100
10-2100

Python

<lang python>from datetime import timedelta, date

DAY = timedelta(days=1) WEEKEND = {6, 5, 4} # Sunday is day 6 FMT = '%Y %m(%B)'

def fiveweekendspermonth(start=date(1900, 1, 1), stop=date(2101, 1, 1)):

   'Compute months with five weekends between dates'
   
   when = start
   lastmonth = weekenddays = 0
   fiveweekends = []
   while when < stop:
       year, mon, _mday, _h, _m, _s, wday, _yday, _isdst = when.timetuple()
       if mon != lastmonth:
           if weekenddays >= 15:
               fiveweekends.append(when - DAY)
           weekenddays = 0
           lastmonth = mon
       if wday in WEEKEND:
           weekenddays += 1
       when += DAY
   return fiveweekends

dates = fiveweekendspermonth() indent = ' ' print('There are %s months of which the first and last five are:' % len(dates)) print(indent +('\n'+indent).join(d.strftime(FMT) for d in dates[:5])) print(indent +'...') print(indent +('\n'+indent).join(d.strftime(FMT) for d in dates[-5:]))</lang>

Sample Output

There are 201 months of which the first and last five are:
  1901 03(March)
  1902 08(August)
  1903 05(May)
  1904 01(January)
  1904 07(July)
  ...
  2097 03(March)
  2098 08(August)
  2099 05(May)
  2100 01(January)
  2100 10(October)