По некоторым причинам мне нравится Schwartzian, преобразовывают
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, foo($_)] }
@unsorted;
Где нечто ($) представляет вычисление - интенсивное выражение, которое берет $ (каждый объект списка в свою очередь) и производит соответствующее значение, которое должно быть сравнено в его пользе.
Попробуйте следующее:
function numberOfDays(year, month) {
var d = new Date(year, month, 0);
return d.getDate();
}
Из-за високосных лет нужно пропускать и год.
function getDaysInMonth(m, y) {
return /8|3|5|10/.test(--m)?30:m==1?(!(y%4)&&y%100)||!(y%400)?29:28:31;
}
Thirty days hath September,
April, June, and November;
All the rest have thirty-one,
Excepting February alone,
Which hath twenty-eight days clear,
And twenty-nine in each leap year.
попробуйте следующее:
function DaysinMonth(aDate) {
return aDate.setMonth(aDate.getMonth()+1, 0).getDate();
}
В духе того, что не выполняет за вас домашнее задание , я представляю версию в POVRay (извините, не JS ) Я сделал это много лет назад.
В POVRay нет логических переменных . Метод, который я придумал, заключался в создании полинома от «m», который давал ответ> 0 для месяцев с 31 днем и <0 для месяцев с 30 днями.
#declare m0 = (m-0.5)*(m-1.5)*(m-2.5)*(m-3.5)*(m-4.5)*(m-5.5);
#declare m0 = m0*(m-6.5)*(m-8.5)*(m-9.5)*(m-10.5)*(m-11.5);
#if (m0 > 0)
#declare maxdays = 31;
#else
#declare maxdays = 30;
#end
Сложная часть - решить, когда год является скачком. год. Это полный тест на високосные годы. Большинство людей знают о правиле четырех лет, а с 2000 года некоторые знают о правилах 100 и 400 лет, не правила 4000 лет.
#declare LEAPYEAR = 2.0;
#if (mod(YEAR,4.0)=0)
#declare LEAPYEAR = 1.0;
#if (mod(YEAR,100.0)=0)
#declare LEAPYEAR = 2.0;
#end
#if (mod(YEAR,400.0)=0
#declare LEAPYEAR = 1.0;
#end
#end
#if (MONTH = 2.0)
#declare maxdays = maxdays - LEAPYEAR;
#end
#if (DAY > maxdays)
#declare MONTH = MONTH + 1;
#declare DAY = DAY - maxdays;
#end
#if (MONTH > 12)
#declare YEAR = YEAR + 1;
#declare MONTH = MONTH - 12;
#end