Last Friday of each month: Difference between revisions

(Added Kotlin)
Line 1,243:
 
==JavaScript==
===ES5===
 
===Imperative=Iteration====
 
{{works with|Nodejs}}
<lang javascript>var last_friday_of_month, print_last_fridays_of_month;
var last_friday_of_month, print_last_fridays_of_month;
 
last_friday_of_month = function(year, month) {
Line 1,275 ⟶ 1,273:
year = parseInt(process.argv[2]);
return print_last_fridays_of_month(year);
})();</lang>
{{outOut}}
 
<pre>>node lastfriday.js 2015
</lang>
{{out}}
<lang>
>node lastfriday.js 2015
Fri Jan 30 2015
Fri Feb 27 2015
Line 1,292 ⟶ 1,287:
Fri Oct 30 2015
Fri Nov 27 2015
Fri Dec 25 2015</pre>
</lang>
 
 
====Functional (ES 5)composition====
 
<lang JavaScript>(function () {
'use strict';
Line 1,323 ⟶ 1,316:
});
}
 
 
 
 
// isoDateString :: Date -> String
Line 1,361 ⟶ 1,351:
 
// TEST
 
return transpose(
range(2012, 2016)
Line 1,372 ⟶ 1,361:
})
.join('\n');
 
})();</lang>
 
Line 1,388 ⟶ 1,376:
2012-11-30 2013-11-29 2014-11-28 2015-11-27 2016-11-25
2012-12-28 2013-12-27 2014-12-26 2015-12-25 2016-12-30</pre>
 
===ES6===
 
<lang JavaScript>(() => {
'use strict'
 
// lastWeekDaysOfYear :: Int -> Int -> [Date]
const lastWeekDaysOfYear = (iWeekDay, y) => {
return [
31,
0 === y % 4 && 0 !== y % 100 || 0 === y % 400 ? 29 : 28,
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
]
.map((d, m) => {
const dte = new Date(Date.UTC(y, m, d));
return new Date(Date.UTC(
y, m, d - (
(dte.getDay() + (7 - iWeekDay)) % 7
)
));
});
};
 
const days = {
sunday: 0,
monday: 1,
tuesday: 2,
wednesday: 3,
thursday: 4,
friday: 5,
saturday: 6
};
 
 
// GENERIC FUNCTIONS
 
// curry :: ((a, b) -> c) -> a -> b -> c
const curry = f => a => b => f(a, b);
 
// isoDateString :: Date -> String
const isoDateString = dte =>
dte.toISOString()
.substr(0, 10);
 
// range :: Int -> Int -> [Int]
const range = (m, n) =>
Array.from({
length: Math.floor(n - m) + 1
}, (_, i) => m + i);
 
// transpose :: [[a]] -> [[a]]
const transpose = lst =>
lst[0].map((_, iCol) =>
lst.map(row => row[iCol]));
 
// TEST
return transpose(
range(2015, 2019)
.map(curry(lastWeekDaysOfYear)(days.friday))
)
.map(row => row
.map(isoDateString)
.join('\t'))
.join('\n');
})();</lang>
{{Out}}
<pre>2015-01-30 2016-01-29 2017-01-27 2018-01-26 2019-01-25
2015-02-27 2016-02-26 2017-02-24 2018-02-23 2019-02-22
2015-03-27 2016-03-25 2017-03-31 2018-03-30 2019-03-29
2015-04-24 2016-04-29 2017-04-28 2018-04-27 2019-04-26
2015-05-29 2016-05-27 2017-05-26 2018-05-25 2019-05-31
2015-06-26 2016-06-24 2017-06-30 2018-06-29 2019-06-28
2015-07-31 2016-07-29 2017-07-28 2018-07-27 2019-07-26
2015-08-28 2016-08-26 2017-08-25 2018-08-31 2019-08-30
2015-09-25 2016-09-30 2017-09-29 2018-09-28 2019-09-27
2015-10-30 2016-10-28 2017-10-27 2018-10-26 2019-10-25
2015-11-27 2016-11-25 2017-11-24 2018-11-30 2019-11-29
2015-12-25 2016-12-30 2017-12-29 2018-12-28 2019-12-27</pre>
 
=={{header|jq}}==
9,658

edits