Task

Write a program or a script that returns the date of the last Fridays of each month of a given year.

The year may be given through any simple input method in your language (command line, std in, etc).



Example of an expected output:

./last_fridays 2012
2012-01-27
2012-02-24
2012-03-30
2012-04-27
2012-05-25
2012-06-29
2012-07-27
2012-08-31
2012-09-28
2012-10-26
2012-11-30
2012-12-28



Related tasks
 Five weekends
 Day of the week
 Find the last Sunday of each month


 
import Foundation
 
func lastFridays(of year: Int) -> [Date] {
 
	let calendar = Calendar.current
	var dates = [Date]()
 
	for month in 2...13 {
 
		let lastDayOfMonth = DateComponents(calendar: calendar,
		                                    year: year,
		                                    month: month,
		                                    day: 0,
		                                    hour: 12)
 
		let date = calendar.date(from: lastDayOfMonth)!
 
		let isFriday = calendar.component(.weekday, from: date) == 6
 
		if isFriday {
 
			dates.append(calendar.date(from: lastDayOfMonth)!)
 
		} else {
 
			let lastWeekofMonth = calendar.ordinality(of: .weekOfMonth,
			                                          in: .month,
			                                          for: date)!
 
			let lastWithFriday = lastWeekofMonth - (calendar.component(.weekday, from: date) > 6 ? 0 : 1)
 
			let lastFridayOfMonth = DateComponents(calendar: calendar,
			                                       year: year,
			                                       month: month - 1,
			                                       hour: 12,
			                                       weekday: 6,
			                                       weekOfMonth: lastWithFriday)
 
			dates.append(calendar.date(from: lastFridayOfMonth)!)
		}
	}
	return dates
}
 
var dateFormatter = DateFormatter()
dateFormatter.dateStyle = .short
 
print(lastFridays(of: 2013).map(dateFormatter.string).joined(separator: "\n"))
 