Напишите функцию, которая принимает дату и возвращает день недели следующего 29 февраля после этой даты.
Входные данные представляют собой строку в расширенном формате ISO: YYYY-MM-DD (например, 27 мая 2010 г. будет «2010-05-27»).
Выводом является строка, которая является названием дня недели (например, «Понедельник»). Капитализация не имеет значения, но дайте полное имя на английском языке.
Если указанная дата 29 февраля, верните день недели следующего 29 февраля.
Используйте расчеты для Proleptic Gregorian Calendar (таким образом, он использует расчеты григорианского високосного года для всей его длины). Не беспокойтесь о юлианском календаре или о том, когда произошел переход с юлианского на григорианский. Просто примите Григорианский для всего.
Функция должна работать как минимум в диапазоне «0001-01-01» - «2100-01-01».
Не стесняйтесь использовать любые стандартные библиотеки, которые предоставляет выбранный вами язык, но не используйте сторонние библиотеки, если вы не хотите включать этот код в свое решение.
Самый короткий код (наименьшее количество символов) выигрывает.
Примеры:
func("0001-01-01")
->"Sunday"
func("1899-12-03")
->"Monday"
func("1970-01-01")
->"Tuesday"
func("1999-07-06")
->"Tuesday"
func("2003-05-22")
->"Sunday"
func("2011-02-17")
->"Wednesday"
func("2100-01-01")
->"Friday"
(и нет, вам не нужно называть функцию func
)
подсказки:
- Помните, что годы, заканчивающиеся на 00, которые не делятся на 400, не являются високосными.
- 1 января 0001 - понедельник.
date
. Просто удалите GNUWin32 из PATH, и он должен работать. Или изменитеdate
наGet-Date
(такой резервный режим работает только тогда, когда команда не найдена - для проверки, просто используйтеgcm date
). В любом случае, я не считаю, что конкретная проблема с этим скриптом, поскольку GNUWin32 не является частью какой-либо стандартной установки Windows.get-date
и получил сообщение об ошибке.Method invocation failed because [System.Management.Automation.PSObject] doesn't contain a method named 'op_Addition'.
Нужна ли ему PS2 или .Net 4 или что-то еще?Get-Date
aSystem.DateTime
.$d=Get-Date "0400-01-01"; $d++
выдает сообщение об ошибке++
не быть определенным в DateTime. То же самое при замене++
на+=1
или+="1"
или+='1'
выдает сообщение об ошибке PSObject. И просто+"1"
работает.Ruby 1.9, 85 символов
Простое решение. Вызовите функцию с помощью
f[args]
.0001-01-01
тестовый случай.источник
def*
просто определяет вызываемую функцию*
. Таким образом, мне не нужен пробел междуdef
именем функции.T-SQL
166185 символовЯ уже возился с функциями даты T-SQL, поэтому решил, почему нет ...
Исходное решение было неверным ...
Вот что я на самом деле должен сделать, чтобы эта стратегия заработала:
источник
C #, 176
источник
string f(string d){...}
.ToString("dddd")
печатает дату в текущей локали, но не на английском.string f(string d){var n=DateTime.Parse(d).AddDays(1);return DateTime.IsLeapYear(n.Year)&&n.DayOfYear==60?n.DayOfWeek+"":f(n+"");}
Баш, 96 байт
Спасибо, Питер ... Отличная версия для гольфа, 96 байт:
Старая версия, 229 байт
ОБРАЗЕЦ I / O
источник
i=0;d=;until [ `date -d"$1 $i days" +%m-%d` = "02-29" ];do((i++));done
Perl, без библиотеки дат:
160 159155Реальная выгода от этих библиотек дат состоит в том, чтобы оттолкнуть длину названий дней кому-то еще.
С другой стороны, я думаю, что это пока единственное решение, которое работает независимо от локали.
источник
ДАТА и немного КРАСИВОГО клея (90)
Функция:
Тестирование:
источник
D: 175 символов
Более разборчиво:
Это очень легко написать на D, но определенно не выиграет ни одного соревнования по коду. Тем не менее, вне игры в код, я бы предпочел, чтобы ее было легко писать и понимать, но дольше, чем кратко, но сложно писать и понимать.
источник
Java 8 - 252 символа
Golfed:
Ungolfed:
источник
Реболь - 78
Ungolfed:
Пример использования (в консоли Rebol):
источник
PHP, 104 байта
сломать
date(L)
:1
для високосного года,0
остальноеdate(l)
: полное текстовое представление дня неделиисточник
GNU coreutils, 71 байт
Линейный поиск на следующие 8 лет (наихудший случай, дан 2096-02-29). Sed находит и выводит первую строку, которая соответствует 29 февраля.
Я был удивлен, обнаружив, что
t;d;:;q
это короче тестирования, чтобы увидеть, остались ли цифры (/[01]/d;q
), несмотря на то, что команд было в два раза больше.тесты
Я добавил дополнительную строку тестов для сложных угловых случаев:
источник