Первый: не надо. Это может быть мило, но даже если есть расширение, позволяющее это сделать, Code Golf - это опасная игра, которая почти всегда приводит к большому сожалению, чем она решает.
Хорошо, вернемся к «реальному» вопросу, определенному домашним заданием. Можете ли вы сделать дополнительные функции? Если это так, вместо того, чтобы фиксировать, является ли это високосным годом в переменной, создайте функцию isLeapYear (int year), которая возвращает правильное значение.
Да, это означает, что вы будете рассчитывать его более одного раза. Если это в конечном итоге приведет к проблемам с производительностью, я буду невероятно удивлен ... и это преждевременная оптимизация, во-первых, беспокоиться об этом.
Я был бы очень удивлен, если бы вам не разрешили писать функции как часть этого. Похоже, это было бы половиной упражнения, подобного этому.
......
Хорошо, вот краткий обзор того, что вам нужно сделать.
Во-первых, базовая проверка - этот месяц, день, год являются возможными значениями вообще - месяц 0-11 (при условии 0), день 0-30, год неотрицательный (при условии, что это ограничение).
Как только вы пройдете через это, я, вероятно, проверим наличие 1752 особых случаев.
Если это не актуально, «обычные» месяцы можно обрабатывать довольно просто.
Это оставляет нам случаи високосного года, которые можно разбить на два выражения - является ли что-то високосным годом (который будет дополнительно разбит на основе григорианского / юлианского) и является ли дата действительной в этот момент .
Итак, на самом высоком уровне ваше выражение выглядит примерно так:
areWithinRange (d, m, y) && Pass1752SpecialCases (d, M, Y) && Pass30DayMonths (d, M, Y) && Pass31DayMonths (D, M, Y) && проходит февральские проверки (D, M, Y)
Если мы предполагаем, что мы возвращаем false из наших подвыражений, только если мы активно обнаруживаем разрыв правила (31 день в июне для правила 30DayMonth возвращает false, но 30 дней в феврале не имеет значения, и поэтому проходит верно), тогда мы можем в значительной степени сказать, что логика на этом уровне верна.
На этом этапе я бы написал отдельные функции для отдельных частей (как чистые выражения, одно выражение return ...). После того, как вы их получили, вы можете заменить вызов метода в выражении верхнего уровня на расширенную версию. Просто убедитесь, что вы заключили в скобки (это слово?) Все достаточно.
Я бы также создал программу для тестирования, которая использует выражение и содержит несколько допустимых и недействительных входных данных и проверяет, что вы делаете правильные вещи. Вы можете написать это в функции для простоты вырезания и вставки для окончательной сдачи, выполнив что-то вроде:
bool isValidDate(int d, int m, int y)
{
return
// your expression here
}
Поскольку выражение будет в строке само по себе, его будет легко вырезать и вставлять.
Вы можете найти другие способы упростить вашу логику - за исключением 1752 особых случаев, дни между 1 и 28, например, всегда действительны.