Чи можуть вони бути тим самим днем ​​тижня?


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 Я дозволю програмі, яка робить це до тих пір, поки вона супроводжується програмою, яка забезпечує обмеження часу (щоб можна було придбати її до апаратного забезпечення). Це справді суперечливо :)
Джонатан Аллан

У якій ситуації число ділиться на 400, але не ділиться на 100?
Атако

@ATaco У жодному. Виняток із правила кожного четвертого року - це роки, які поділяються на 4 та 100, але не на 400.
Денніс

@ATaco, можливо, формулювання зараз зрозуміліше
Джонатан Аллан

Відповіді:


4

MATL , 17 байт

`0Gv@+5:YcYO8XOda

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

Нехай nбуде вхідним. Код виконує цикл, який тестує роки 1та 1+n; тоді 2і 2+n; ... поки не буде знайдений відповідний день тижня. Якщо відповідності не існує, цикл працює нескінченно.

Функція членства для nперіодичного періоду 400. Тому максимум 400ітерації потрібні, якщо nналежить до послідовності. На це потрібно менше 20 секунд у програмі "Спробуйте онлайн". Як доказ цієї верхньої межі, ось модифікована програма, яка обмежує кількість ітерацій до 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 ітерацій - таким чином можна отримати верхню межу, де б хто не захотів її запустити. (BTW Я думаю, що нескінченний цикл на практиці закінчується помилкою поза межами.)
Джонатан Аллан

1
@JonathanAllan Дякую Я бачу. Я додав модифіковану програму, яка обмежує кількість ітерацій до 400. Це займає близько 14 секунд, тому я використовую 20 секунд як верхня межа
Луїс Мендо


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

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, загорнуті
                                 | у список і повторюється 98 разів.
           s | Згладити.
         hM | Приріст.
       .: | І генерувати всі підрядки ...
                           % Q400 | Довжина% 400.
     sM | Підсумовуйте кожен.
   * F | І нанесіть складений виріб.
iI7 | Перевірте, чи є 7 інваріантним, коли застосовано GCD з
                                 | продукт (в основному перевірте, чи 7 | продукт).
                                 | Неналежне виведення відповідного булевого значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.