Potrebbero essere lo stesso giorno della settimana?


14

Sfida

Dato un numero intero non negativo, indica se è possibile che due date (del calendario gregoriano) differiscano esattamente di tanti anni per condividere un giorno della settimana. Si presume che un anno sia un anno bisestile o se è divisibile per 4 ma non per 100, oppure se è divisibile per 400.

L'output può essere:

  • falso / verità (in entrambi gli orientamenti)
  • due valori distinti
  • un valore distinto e uno altro
  • dal codice di ritorno del programma
  • per successo / errore
  • con qualsiasi altro mezzo ragionevole, basta chiedere se si sospetta che possa essere controverso

Ma non da due insiemi di valori non distinti, ad eccezione di false / verità (in quanto ciò consentirebbe un no-op!)

Dettaglio

Indica se l'ingresso è un membro della sequenza OEIS A230995 .

Membri:

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 soci:

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

Questo è quindi vince la risposta più breve in ogni lingua!


L'output può essere: il programma termina (entro meno di 30 secondi) se l'input appartiene alla sequenza, oppure viene eseguito indefinitamente (loop infinito) altrimenti?
Luis Mendo il

@LuisMendo Consentirò un programma che lo fa purché sia ​​accompagnato da un programma che prevede il limite di tempo (quindi uno può acquisirlo prima per il proprio hardware). È davvero controverso però :)
Jonathan Allan il

In quale situazione è un numero divisibile per 400 ma non è divisibile per 100?
ATaco,

@ATaco In nessuno. L'eccezione alla regola del quarto anno sono gli anni che sono divisibili per 4 e 100, ma non per 400.
Dennis

@ATaco forse la formulazione è più chiara ora
Jonathan Allan il

Risposte:


4

MATL , 17 byte

`0Gv@+5:YcYO8XOda

Il programma si interrompe se l'ingresso appartiene alla sequenza o viene eseguito indefinitamente (ciclo infinito) in caso contrario.

Lascia che nsia l'input. Il codice esegue un ciclo che verifica anni 1e 1+n; quindi 2e 2+n; ... fino a quando non viene trovato un giorno corrispondente della settimana. Se non esiste alcuna corrispondenza, il ciclo viene eseguito indefinitamente.

La funzione di iscrizione per nè periodica con punto 400. Pertanto, al massimo 400sono necessarie iterazioni se nappartiene alla sequenza. Ciò richiede meno di 20 secondi in Provalo online. A riprova di questo limite superiore, ecco un programma modificato che limita il numero di iterazioni a 400 (aggiungendo @401<*alla fine). Si noti inoltre che questo limite è allentato e di solito bastano pochi secondi.

Provalo online!

Spiegazione

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

Vecchia versione, 24 byte

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

L'output è 0se l'ingresso appartiene alla sequenza o in 1altro modo.

Provalo online!

Spiegazione

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)

Sembra buono, la mia richiesta era davvero che mi piacerebbe sapere l'input del caso peggiore, o avere un programma che forza le 400 iterazioni - in questo modo si potrebbe ottenere un limite superiore ovunque si scelga di eseguirlo. (A proposito, penso che il ciclo infinito sia, in pratica, terminato da un errore fuori limite.)
Jonathan Allan,

1
@JonathanAllan Grazie. Vedo. Ho aggiunto un programma modificato che limita il numero di iterazioni a 400. Ci vogliono circa 14 secondi, quindi sto usando 20 secondi come limite superiore
Luis Mendo


5

Gelatina , 20 18 byte

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

Output 1 per membri, 0 per non membri.

Provalo online!

Come funziona

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 byte

-35 byte grazie a Jonathan Allan. -2 byte grazie 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

Provalo online!

Utilizzo dell'algoritmo del programma PARI OEIS.


1
5*(n#4)può 5*n#4anche essere !
Lynn,

1

Pyth , 32 byte

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

Provalo qui! (Fai clic su "Passa a Test Suite" per verificare più casi di test contemporaneamente)

Come?

Usa un bel trucco che ho appena aggiunto al thread "Suggerimenti per giocare a golf in Pyth".

iI7 * FsM.: hMs.iKiIL4S99 * 98] K% Q400 | Programma completo. Legge da STDIN, genera STDOUT.

                   S99 | Genera i numeri interi in 1 ... 99.
                 L | Per ogni numero intero N in quell'elenco ...
               iI 4 | Controlla se 4 è invariante rispetto all'applicazione di GCD con N.
                                 | Ciò equivale a verificare se 4 | N.
              K | Memorizza il risultato in una variabile K.
            .i * 98] K | E interlacciamo K con gli elementi di K avvolti
                                 | in un elenco e ripetuto 98 volte.
           s | Appiattire.
         hM | Incremento.
       .: | E genera tutte le sottostringhe ...
                           % Q400 | Di lunghezza% 400.
     sM | Somma ciascuno.
   * F | E applicare il prodotto piegato.
iI7 | Controlla se 7 è invariante quando applicato GCD con
                                 | prodotto (fondamentalmente controlla se 7 | prodotto).
                                 | Emette implicitamente il valore booleano appropriato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.