Еще одна проблема манипулирования датами: P
задача
Напишите программу или функцию, которая вычисляет разницу между двумя датами, заданными пользователем.
Ввод, вывод
Как и в предыдущем случае , входными данными являются два YYYYMMDD
s, разделенные пробелом , запятой
,
или знаком минус -
.
Пример входных значений:
20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231
Вывод представляет собой целое число, которое представляет собой разницу между двумя датами в днях.
Например, ввод 20110101-20100101
дает 365
, и 33320229 17000101
дает 596124
.
Вы можете проверить результаты здесь на здесь . (См. Комментарии rintaun ниже.) Если две даты совпадают, программа должна вернуться 0
, если дата действительна (см. Оценка ).
ограничение
Конечно, вы не должны использовать какие-либо функции / классы / ..., связанные с отметкой времени или датой, и вам следует использовать григорианский календарь .
Гол
Если ваш код не соблюдает ограничение, тогда score = -∞
.
По умолчанию bonus
1.
- Если ваш код работает независимо от порядка ввода (например,
20100101,20110101
возвращает365
или-365
)bonus+=1
,. - Если ваш код может работать с 0 года ,
bonus+=0.5
. - Если ваш код распознает недопустимый месяц (от 1 до 12) / дату (от 1 до 31), например
20109901
или34720132
, и печатаетE
(& завершает программу или возвращает что-то подобное0
)bonus+=1
,. - Независимо от вышеприведенного правила, если ваш код распознает недопустимые даты, например
20100230
,20100229
или20111131
, и печатаетE
(& завершает программу или возвращает что-то подобное0
)bonus+=1
,. - Независимо от вышеупомянутых двух правил, если ваш код распознает недопустимую входную строку, например
20100101|20100202
или2010010120100202
, и печатаетE
(& завершает программу или возвращает что-то подобное0
)bonus+=1
,.
score = floor(-4.2*code.length/bonus)
, Код с наибольшим количеством очков выигрывает. Если два верхних кода имеют одинаковое количество очков, выигрывают коды с наибольшим бонусом. Если два верхних кода имеют одинаковый счет и бонус, выигрывают коды с наибольшим количеством голосов.
(Должно быть: когда есть более 5 кодов, у которых больше (или равно) +1
голосов.)
20040229
. : P365*4 + 2 + 2
1464 года. Спасибо за информацию!Ответы:
Perl 5.14, оценка = -162
-163-181-196-214-167-213-234-p
опциейКод
Вычисляет модифицированный юлианский номер дня для каждой даты (игнорируя корректировки, относящиеся к эпохе, чтобы сохранить длину кода) и вычитает их. (ссылка "Юлианский день" в Википедии ).
/r
опции на подстановках30+($m&1^$m>7)
части указывается продолжительность любого месяца, кроме февраля; остаток корректируется на февраль в обычном или високосном годуПредположения
00000101-00010101
должно дать 366, так как 0 - это целое кратное 400, и поэтому год 0 является високосным годом.источник
20111300-20119999
возвраты2717
.PHP, оценка: -539,1
Код
Ungolfed
Запись
Вычисляет количество дней, повторяя каждую действительную дату между двумя указанными. Это довольно медленно на больших диапазонах. Я уверен, что это не лучший способ решить эту проблему, но я потерял терпение, и это то, чем я закончил. :)
Кроме того, я знаю, что «неопрятный» код все еще не очень читабелен, но полное его переписывание потребует слишком больших усилий.
источник
Ruby 1.9, оценка: -175
-186-191-199243250260символовКод принимает ввод через стандартный ввод.
Заметки:
(!x[e]||e*f<1||f>x[e])
Условие обрабатывает недействительные бонусы месяц / день / дата.33320229 17000101
приводит к596134
.источник
Python, оценка: -478
решение:
У меня нет версии «без гольфа», так как я ее написал. Я не проверял это должным образом, поэтому, если вы найдете ошибку - пожалуйста, прокомментируйте.
edit: надеюсь исправлена ошибка, указанная в комментариях и добавлена распаковка в виде [a, b], [c, d] = [[1,2], [3,4]
источник
E
. (FYI,0>-1>12
,0>6>12
,0>13>12
возвращаетсяFalse
.)x<y<z
сравнение или естьx if y else z
. Пытался это исправить.[x,z][y]
корочеx if y else z
, хотя это не всегда работает, так как в отличие от выражения if оно не ленивое.PHP, оценка: -516
символы:
685676бонус: 5.5
источник
<?
запускаться в начале, иначе он просто печатает код.