Могут ли они быть в тот же день недели?

14

Вызов

Учитывая неотрицательное целое число, выведите, возможно ли для двух дат (по григорианскому календарю) отличаться ровно на столько лет, чтобы делить день недели. Предполагается, что год является високосным, если он делится на 4, а не на 100, или если он делится на 400.

Выход может быть:

  • фальси / правдивый (в любой ориентации)
  • любые два разных значения
  • одно отличное значение, а другое - что-то еще
  • по коду возврата программы
  • по успеху / ошибке
  • любым другим разумным способом - просто спросите, если вы подозреваете, что это может быть спорным

Но не двумя непонятными наборами значений, за исключением фальси / истины (поскольку это позволило бы запретить операции!)

подробность

Это то, является ли вход членом последовательности OEIS A230995 .

Пользователи:

0, 5, 6, 7, 11, 12, 17, 18, 22, 23, 28, 29, 33, 34, 35, 39, 40, 45, 46, 50, 51, 56, 57, 61, 62, 63, 67, 68, 73, 74, 78, 79, 84, 85, 89, 90, 91, 95, 96, 101, 102, 106, 107, 108, 112, 113, 114, 117, 118, 119, 123, 124, 125, 129, 130, 131, 134, 135, 136, 140, 141, 142, 145, 146, 147, 151, 152, 153, 157, 158, 159, 162, 163, 164, 168, 169, 170, 173, 174, 175, 179, 180, 181, 185, 186, 187, 190, 191, 192, 196, 197, 198, 202, 203, 204, 208, 209, 210, 213, 214, 215, 219, 220, 221, 225, 226, 227, 230, 231, 232, 236, 237, 238, 241, 242, 243, 247, 248, 249, 253, 254, 255, 258, 259, 260, 264, 265, 266, 269, 270, 271, 275, 276, 277, 281, 282, 283, 286, 287, 288, 292, 293, 294, 298, 299, 304, 305, 309, 310, 311, 315, 316, 321, 322, 326, 327, 332, 333, 337, 338, 339, 343, 344, 349, 350, 354, 355, 360, 361, 365, 366, 367, 371, 372, 377, 378, 382, 383, 388, 389, 393, 394, 395
plus
400, 405, 406, 407, 411, ...

Нечлены:

1, 2, 3, 4, 8, 9, 10, 13, 14, 15, 16, 19, 20, 21, 24, 25, 26, 27, 30, 31, 32, 36, 37, 38, 41, 42, 43, 44, 47, 48, 49, 52, 53, 54, 55, 58, 59, 60, 64, 65, 66, 69, 70, 71, 72, 75, 76, 77, 80, 81, 82, 83, 86, 87, 88, 92, 93, 94, 97, 98, 99, 100, 103, 104, 105, 109, 110, 111, 115, 116, 120, 121, 122, 126, 127, 128, 132, 133, 137, 138, 139, 143, 144, 148, 149, 150, 154, 155, 156, 160, 161, 165, 166, 167, 171, 172, 176, 177, 178, 182, 183, 184, 188, 189, 193, 194, 195, 199, 200, 201, 205, 206, 207, 211, 212, 216, 217, 218, 222, 223, 224, 228, 229, 233, 234, 235, 239, 240, 244, 245, 246, 250, 251, 252, 256, 257, 261, 262, 263, 267, 268, 272, 273, 274, 278, 279, 280, 284, 285, 289, 290, 291, 295, 296, 297, 300, 301, 302, 303, 306, 307, 308, 312, 313, 314, 317, 318, 319, 320, 323, 324, 325, 328, 329, 330, 331, 334, 335, 336, 340, 341, 342, 345, 346, 347, 348, 351, 352, 353, 356, 357, 358, 359, 362, 363, 364, 368, 369, 370, 373, 374, 375, 376, 379, 380, 381, 384, 385, 386, 387, 390, 391, 392, 396, 397, 398, 399
plus
401, 402, 403, 404, 408, ...

Это поэтому выигрывает самый короткий ответ на каждом языке!

Джонатан Аллан
источник
Может ли вывод быть таким: программа завершается (менее чем за 30 секунд), если ввод принадлежит последовательности, или выполняется бесконечно (бесконечный цикл) в противном случае?
Луис Мендо
@LuisMendo Я разрешаю программе, которая делает это, при условии, что она сопровождается программой, которая предусматривает ограничение по времени (чтобы можно было приобрести его раньше для своего оборудования). Это действительно спорный, хотя :)
Джонатан Allan
В какой ситуации число делится на 400, но не делится на 100?
ATaco
@ATaco Ни в одном. Исключением из правила каждого четвертого года являются годы, которые делятся на 4 и 100, но не на 400.
Деннис
@ATaco, возможно, формулировка стала более ясной
Джонатан Аллан

Ответы:

4

MATL , 17 байт

`0Gv@+5:YcYO8XOda

Программа останавливается, если вход принадлежит последовательности, или выполняется бесконечно (бесконечный цикл) в противном случае.

Позвольте nбыть входом. Код выполняет цикл, который проверяет годы 1и 1+n; тогда 2и 2+n; ... пока не найден подходящий день недели. Если совпадений не существует, цикл выполняется бесконечно.

Функция членства для nявляется периодической с периодом 400. Следовательно, 400требуется максимум итераций, если они nпринадлежат последовательности. Это займет не более 20 секунд в Try It Online. В качестве доказательства этой верхней границы приведем модифицированную программу, которая ограничивает число итераций до 400 (добавляя @401<*в конце). Также обратите внимание, что эта граница свободна, и обычно достаточно нескольких секунд.

Попробуйте онлайн!

объяснение

`           % Do...while
  0Gv       %   Push column vector [0; n], where n is the input number
  @+        %   Add k, element-wise. Gives [k; k+n]
  5:        %   Push row vector [1, 2, 3, 4, 5]
  Yc        %   Horizontal "string" concatenation: gives the 2×6 matrix
            %   [k, 1, 2, 3, 4, 5; k+n, 1, 2, 3, 4, 5]. The 6 columns
            %   represent year, month, day, hour, minute, second
  YO        %   Convert each row to serial date number. Gives a column
            %   vector of length 2
  8XO       %   Convert each date number to date string with format 8,
            %   which is weekday in three letters ('Mon', 'Tue', etc).
            %   This gives a 2×3 char matrix such as ['Wed';'Fri']
  d         %   Difference (of codepoints) along each column. Gives a
            %   row vector of length 3
  a         %   True if some element is nonzero, or false otherwise
            % End (implicit). The loop proceeds with the next iteration
            % if the top of the stack is true

Старая версия, 24 байта

400:"0G&v@+5:YcYO8XOdavA

Выход - 0если вход принадлежит последовательности, или 1иначе.

Попробуйте онлайн!

объяснение

400         % Push row vector [1, 2, ..., 400]
"           % For each k in that array
  0G&v      %   Push column vector [0; n], where n is the input number
  @+        %   Add k, element-wise. Gives [k; k+n]
  5:        %   Push row vector [1, 2, 3, 4, 5]
  Yc        %   Horizontal "string" concatenation: gives the 2×6 matrix
            %   [k, 1, 2, 3, 4, 5; k+n, 1, 2, 3, 4, 5]. The 6 columns
            %   represent year, month, day, hour, minute, second
  YO        %   Convert each row to serial date number. Gives a column
            %   vector of length 2
  8XO       %   Convert each date number to date string with format 8,
            %   which is weekday in three letters ('Mon', 'Tue', etc).
            %   This gives a 2×3 char matrix such as ['Wed';'Fri']
  d         %   Difference (of codepoints) along each column. Gives a
            %   row vector of length 3
  a         %   True if some element is nonzero, or false otherwise
  v         %   Concatenate vertically with previous results
  A         %   True if all results so far are true
            % End (implicit). Display (implicit)
Луис Мендо
источник
Кажется хорошим, моя просьба была на самом деле, чтобы я хотел знать ввод в худшем случае или иметь программу, которая вынуждает 400 итераций - таким образом, можно получить верхнюю границу, где бы он ни захотел ее запустить. (Кстати, я думаю, что на практике бесконечный цикл заканчивается ошибкой вне пределов.)
Джонатан Аллан
1
@JonathanAllan Спасибо. Понимаю. Я добавил модифицированную программу, которая ограничивает число итераций до 400. Это занимает около 14 секунд, поэтому я использую 20 секунд в качестве верхней границы
Луис Мендо,
5

Python 2 , 58 байт

u=-abs(200-input()%400)-4
print u/100+5>(u-8)*5/4%7>u%4/-3

Попробуйте онлайн!

Прямая формула.

XNOR
источник
Это приятно. Я считаю, что вы можете сэкономить 2 байта с 5*u/4%7-3вместо (u-8)*5/4%7.
Джонатан Аллан
Сохраните еще 2, используя опцию успеха / ошибки с 1/(...)вместо print ....
Джонатан Аллан
5

Желе , 20- 18 байт

99R4ḍj`‘ṡ%4ȷ$S€P7ḍ

Выходы 1 для участников, 0 для не членов.

Попробуйте онлайн!

Как это устроено

99R4ḍj`‘ṡ%4ȷ$S€P7ḍ  Main link. Argument: n

99                  Set the return value to 99.
  R                 Range; yield [01, .., 99].
   4ḍ               Test each element in the range for divisibility by 4.
     j`             Join the resulting array, using itself as separator.
                    The result is an array of 9801 Booleans indicating whether the
                    years they represent have leap days.
       ‘            Increment the results, yielding 1 = 365 (mod 7) for non-leap
                    years, 2 = 366 (mod 7) for leap years.
         %4ȷ$       Compute n % 4000.
        ṡ           Take all slices of length n % 4000 of the result to the left.
             S€     Take the sum of each slice.
               P    Take the product of the sums.
                7ḍ  Test for divisibility by 7.
Деннис
источник
1

Haskell , 76 байт

-35 байтов благодаря Джонатану Аллану. -2 байта благодаря Линн.

f i=or[c y==c$y+i|y<-[0..400]]
c n=(5*n#4+n%4-n#100+n#400)%7
(%)=mod
(#)=div

Попробуйте онлайн!

Использование алгоритма программы OEIS PARI.

totallyhuman
источник
1
5*(n#4)может быть 5*n#4также!
Линн
1

Pyth , 32 байта

iI7*FsM.:hMs.iKiIL4S99*98]K%Q400

Попробуй это здесь! (Нажмите «Переключиться на набор тестов», чтобы проверить больше тестовых случаев одновременно)

Как?

Использует крутой трюк, который я только что добавил в ветку "Советы по игре в гольф в Pyth".

iI7 * FsM.: hMs.iKiIL4S99 * 98] K% Q400 | Полная программа. Читает из STDIN, выводит в STDOUT.

                   S99 | Генерация целых чисел в 1 ... 99.
                 L | Для каждого целого числа N в этом списке ...
               II 4 | Проверьте, является ли 4 инвариантным относительно применения GCD с N.
                                 | Это эквивалентно проверке, если 4 | Н.
              К | Сохраните результат в переменной K.
            .i * 98] K | И чередовать K с элементами K, завернутыми
                                 | в список и повторяется 98 раз.
           с | Свести.
         гм | Increment.
       .: | И сгенерировать все подстроки ...
                           % Q400 | Длины% 400.
     СМ | Сумма каждого.
   * F | И применить сложенный продукт.
iI7 | Проверьте, является ли 7 инвариантным при применении GCD с
                                 | продукт (в основном проверьте, 7 | продукт).
                                 | Неявно выведите соответствующее логическое значение.
Мистер Xcoder
источник