Five weekends: Difference between revisions
m (→{{header|J}}) |
(→{{header|J}}: format inside verb) |
||
Line 13: | Line 13: | ||
months=. 1 3 5 7 8 10 12 |
months=. 1 3 5 7 8 10 12 |
||
dates=. 31 |
dates=. 31 |
||
(#~ 0 = weekday) >,{years;months;dates |
fivewkds=. (#~ 0 = weekday) >,{years;months;dates NB. 5 full weekends iff 31st is Sunday(0) |
||
>'MMM YYYY' fmtDate toDayNo fivewkds |
|||
)</lang> |
)</lang> |
||
'''Usage:''' |
'''Usage:''' |
||
<lang j> # find5wkdMonths '' NB. number of months found |
<lang j> # find5wkdMonths '' NB. number of months found |
||
201 |
201 |
||
(5&{. , '...' , _5&{.) find5wkdMonths '' NB. First and last 5 months found |
|||
Mar 1901 |
Mar 1901 |
||
Aug 1902 |
Aug 1902 |
||
Line 24: | Line 25: | ||
Jan 1904 |
Jan 1904 |
||
Jul 1904 |
Jul 1904 |
||
... |
|||
Mar 2097 |
Mar 2097 |
||
Aug 2098 |
Aug 2098 |
Revision as of 13:21, 23 October 2010
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
- Write a program to show all months that have this same characteristic of five full weekends from the year 1900 through 2100 (Gregorian calendar).
- Show the number of months with this property.
- Show at least the first and last five dates, in order.
J
<lang j>require 'types/datetime' find5wkdMonths=: verb define
years=. 1900 + i. >: 1900 -~ 2100 months=. 1 3 5 7 8 10 12 dates=. 31 fivewkds=. (#~ 0 = weekday) >,{years;months;dates NB. 5 full weekends iff 31st is Sunday(0) >'MMM YYYY' fmtDate toDayNo fivewkds
)</lang> Usage: <lang j> # find5wkdMonths NB. number of months found 201
(5&{. , '...' , _5&{.) find5wkdMonths NB. First and last 5 months found
Mar 1901 Aug 1902 May 1903 Jan 1904 Jul 1904 ... Mar 2097 Aug 2098 May 2099 Jan 2100 Oct 2100</lang>
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)