Pourraient-ils être le même jour de la semaine?

14

Défi

Étant donné un entier non négatif, indiquez s'il est possible que deux dates (du calendrier grégorien) différant exactement de ce nombre d'années se partagent un jour de la semaine. Une année est supposée être une année bissextile soit si elle est divisible par 4 mais pas par 100, ou si elle est divisible par 400.

La sortie peut être:

  • falsey / véridique (dans les deux sens)
  • deux valeurs distinctes
  • une valeur distincte et une autre chose
  • par code retour programme
  • par succès / erreur
  • par tout autre moyen raisonnable - demandez simplement si vous pensez que cela peut être controversé

Mais pas par deux ensembles de valeurs non distincts, sauf pour falsey / truey (car cela permettrait un no-op!)

Détail

Il s'agit de savoir si l'entrée est membre de la séquence OEIS A230995 .

Membres:

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

Non-membres:

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

C'est le donc la réponse la plus courte dans chaque langue l'emporte!

Jonathan Allan
la source
La sortie peut-elle être: le programme se termine (en moins de 30 secondes) si l'entrée appartient à la séquence, ou s'exécute indéfiniment (boucle infinie) sinon?
Luis Mendo
@LuisMendo Je vais autoriser un programme qui fait cela tant qu'il est accompagné d'un programme qui fournit la limite de temps (donc on peut l'acquérir avant pour son matériel). C'est en effet controversé cependant :)
Jonathan Allan
Dans quelle situation un nombre est-il divisible par 400 mais n'est-il pas divisible par 100?
ATaco
@ATaco En aucun. Les exceptions à la règle des quatre ans sont les années divisibles par 4 et 100, mais pas par 400.
Dennis
@ATaco peut-être que le libellé est plus clair maintenant
Jonathan Allan

Réponses:

4

MATL , 17 octets

`0Gv@+5:YcYO8XOda

Le programme s'arrête si l'entrée appartient à la séquence, ou s'exécute indéfiniment (boucle infinie) sinon.

Soit nl'entrée. Le code exécute une boucle qui teste les années 1et 1+n; puis 2et 2+n; ... jusqu'à ce qu'un jour correspondant de la semaine soit trouvé. Si aucune correspondance n'existe, la boucle s'exécute indéfiniment.

La fonction d'adhésion pour nest périodique avec période 400. Par conséquent, tout au plus400 itérations sont nécessaires si nappartient à la séquence. Cela nécessite moins de 20 secondes dans Try It Online. Comme preuve de cette limite supérieure, voici un programme modifié qui limite le nombre d'itérations à 400 (en ajoutant @401<*à la fin). Notez également que cette limite est lâche et que quelques secondes suffisent généralement.

Essayez-le en ligne!

Explication

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

Ancienne version, 24 octets

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

La sortie est 0 si l'entrée appartient à la séquence, ou 1autrement.

Essayez-le en ligne!

Explication

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)
Luis Mendo
la source
Cela semble bon, ma demande était vraiment que j'aimerais connaître le pire des cas, ou avoir un programme qui force les 400 itérations - de cette façon, on pourrait obtenir une limite supérieure partout où l'on choisit de l'exécuter. (BTW Je pense que la boucle infinie est, en pratique, terminée par une erreur hors limites.)
Jonathan Allan
1
@JonathanAllan Merci. Je vois. J'ai ajouté un programme modifié qui limite le nombre d'itérations à 400. Cela prend environ 14 secondes, donc j'utilise 20 secondes comme limite supérieure
Luis Mendo
5

Python 2 , 58 octets

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

Essayez-le en ligne!

Une formule directe.

xnor
la source
C'est sympa. Je crois que vous pouvez enregistrer 2 octets avec 5*u/4%7-3au lieu de (u-8)*5/4%7.
Jonathan Allan
Économisez 2 de plus en utilisant l'option succès / erreur avec 1/(...)au lieu de print ....
Jonathan Allan
5

Gelée , 20 18 octets

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

Sorties 1 pour les membres, 0 pour les non-membres.

Essayez-le en ligne!

Comment ça fonctionne

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.
Dennis
la source
1

Haskell , 76 octets

-35 octets grâce à Jonathan Allan. -2 octets grâce à 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

Essayez-le en ligne!

Utilisation de l'algorithme du programme OEIS PARI.

totalement humain
la source
1
5*(n#4)peut être 5*n#4aussi!
Lynn
1

Pyth , 32 octets

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

Essayez-le ici!(Cliquez sur "Passer à la suite de tests" pour vérifier plus de cas de test à la fois)

Comment?

Utilise un truc sympa que je viens d'ajouter au fil "Conseils pour jouer au golf en Pyth".

iI7 * FsM.: hMs.iKiIL4S99 * 98] K% Q400 | Programme complet. Lit depuis STDIN, sort vers STDOUT.

                   S99 | Générez les entiers dans 1 ... 99.
                 L | Pour chaque entier N dans cette liste ...
               iI 4 | Vérifiez si 4 est invariant par rapport à l'application de GCD avec N.
                                 | Cela revient à vérifier si 4 | N.
              K | Stockez le résultat dans une variable K.
            .i * 98] K | Et entrelacer K avec les éléments de K enveloppés
                                 | dans une liste et répété 98 fois.
           s | Aplatir.
         hM | Incrément.
       .: | Et générer toutes les sous-chaînes ...
                           % Q400 | De longueur% 400.
     sM | Additionnez chacun.
   * F | Et appliquez le produit plié.
iI7 | Vérifiez si 7 est invariant lorsqu'il est appliqué GCD avec le
                                 | produit (vérifier essentiellement si 7 | produit).
                                 | Sortie implicite de la valeur booléenne appropriée.
M. Xcoder
la source
0

Python 3 , 110 107 octets

from datetime import*
lambda n,d=date:0in[d(i,1,1).weekday()-d(i+n%400,1,1).weekday()for i in range(1,999)]

Essayez-le en ligne!

-3 octets grâce à M. Xcoder.

Кирилл Малышев
la source