Eles poderiam ser o mesmo dia da semana?


14

Desafio

Dado um número inteiro não negativo, mostre se é possível por duas datas (do calendário gregoriano) diferindo exatamente por muitos anos para compartilhar um dia da semana. Um ano é considerado um ano bissexto, se é divisível por 4, mas não por 100, ou se é divisível por 400.

A saída pode ser:

  • falsey / truthy (em qualquer orientação)
  • quaisquer dois valores distintos
  • um valor distinto e um sendo qualquer outra coisa
  • pelo código de retorno do programa
  • por sucesso / erro
  • por qualquer outro meio razoável - pergunte se você suspeita que possa ser controverso

Mas não por dois conjuntos de valores não distintos, exceto falsey / truthy (pois isso permitiria um não-op!)

Detalhe

É se a entrada é um membro da sequência A230995 do OEIS .

Membros:

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, ...

Não membros:

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, ...

Isso é e a resposta mais curta em cada idioma vence!


A saída pode ser: o programa termina (em menos de 30 segundos) se a entrada pertencer à sequência ou executar indefinidamente (loop infinito), caso contrário?
Luis Mendo

@LuisMendo Permitirei um programa que faça isso desde que seja acompanhado de um programa que forneça o limite de tempo (para que você possa adquiri-lo antes do hardware). É realmente controverso, embora :) #
4411 Jonathan Allan

Em que situação um número é divisível por 400, mas não é divisível por 100?
ATaco 31/12

@ATaco Em nenhum. A exceção à regra a cada quarto ano são os anos que são divisíveis por 4 e 100, mas não por 400.
Dennis

@ATaco, talvez o texto esteja mais claro agora #
Jonathan Allan

Respostas:


4

MATL , 17 bytes

`0Gv@+5:YcYO8XOda

O programa pára se a entrada pertence à sequência ou é executado indefinidamente (loop infinito).

Let nSer a entrada. O código executa um loop que testa anos 1e 1+n; então 2e 2+n; ... até que um dia correspondente da semana seja encontrado. Se não houver correspondência, o loop será executado indefinidamente.

A função de associação para né periódica com período 400. Portanto, na maioria das 400iterações são necessárias se npertencer à sequência. Isso requer menos de 20 segundos no Try It Online. Como prova desse limite superior, aqui está um programa modificado que limita o número de iterações a 400 (adicionando @401<*no final). Observe também que esse limite está solto e geralmente alguns segundos são suficientes.

Experimente online!

Explicação

`           % 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

Versão antiga, 24 bytes

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

Saída é 0se a entrada pertencer à sequência ou 1não.

Experimente online!

Explicação

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)

Parece bom, meu pedido foi realmente que eu gostaria de saber a pior entrada possível, ou ter um programa que force as 400 iterações - dessa forma, é possível obter um limite superior onde quer que seja necessário executá-lo. (BTW, eu acho que o loop infinito é, na prática, terminado por um erro fora dos limites.) #
3177 Jonathan Allan

1
@JonathanAllan Thanks. Entendo. Adicionei um programa modificado que limita o número de iterações a 400. Demora cerca de 14 segundos, por isso estou usando 20 segundos como limite superior.
Luis Mendo

5

Python 2 , 58 bytes

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

Experimente online!

Uma fórmula direta.


Isso é legal. Eu acredito que você pode salvar 2 bytes com em 5*u/4%7-3vez de (u-8)*5/4%7.
Jonathan Allan

Economize mais 2 usando a opção de sucesso / erro com em 1/(...)vez de print ....
Jonathan Allan

5

Geléia , 20 18 bytes

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

Saídas 1 para membros, 0 para não membros.

Experimente online!

Como funciona

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 bytes

-35 bytes graças a Jonathan Allan. -2 bytes graças a Lynn.

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

Experimente online!

Usando o algoritmo do programa OEIS PARI.


1
5*(n#4)pode ser 5*n#4também!
Lynn

1

Pitão , 32 bytes

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

Experimente aqui! (Clique em "Alternar para o conjunto de testes" para verificar mais casos de teste de uma só vez)

Quão?

Usa um truque legal que acabei de adicionar ao tópico "Dicas para jogar golfe em Pyth".

iI7 * FsM.: hMs.iKiIL4S99 * 98] K% Q400 | Programa completo. Lê de STDIN, produz para STDOUT.

                   S99 Gere os números inteiros em 1 ... 99.
                 L Para cada número inteiro N nessa lista ...
               i 4 | Verifique se 4 é invariável ao aplicar GCD com N.
                                 | Isso é equivalente a verificar se 4 | N.
              K Armazene o resultado em uma variável K.
            .i * 98] K | E intercale K com os elementos de K envolvidos
                                 | em uma lista e repetida 98 vezes.
           s Aplainar.
         hM Incremento.
       .: | E gere todas as substrings ...
                           % Q400 | De comprimento% 400.
     sM Soma cada.
   * F E aplique o produto dobrado.
iI7 Verifique se 7 é invariável quando aplicado o GCD com o
                                 | produto (verifique basicamente se 7 | produto).
                                 | Implica implicitamente o valor booleano apropriado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.