Könnten sie der gleiche Tag der Woche sein?

14

Herausforderung

Bei einer nicht negativen Ganzzahl wird ausgegeben, ob es möglich ist, dass zwei Daten (des Gregorianischen Kalenders) genau so viele Jahre voneinander abweichen, um einen Wochentag zu teilen. Ein Jahr wird als Schaltjahr angenommen, wenn es durch 4, nicht aber durch 100 teilbar ist oder wenn es durch 400 teilbar ist.

Die Ausgabe kann sein:

  • Falsch / Wahrhaftig (in beiden Richtungen)
  • zwei beliebige unterschiedliche Werte
  • Ein eindeutiger Wert und einer, der alles andere ist
  • per Programm-Return-Code
  • durch Erfolg / Fehler
  • Fragen Sie einfach, ob Sie den Verdacht haben, dass dies kontrovers ist

Aber nicht durch zwei nicht getrennte Wertesätze, außer Falschheit / Wahrhaftigkeit (da dies ein No-Op erlauben würde!)

Detail

Dies ist, ob die Eingabe ein Mitglied der OEIS-Sequenz A230995 ist .

Mitglieder:

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

Nichtmitglieder:

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

Das ist also gewinnt die kürzeste Antwort in jeder Sprache!

Jonathan Allan
quelle
Kann die Ausgabe sein: Programm endet (innerhalb von weniger als 30 Sekunden), wenn die Eingabe zur Sequenz gehört, oder läuft sie sonst auf unbestimmte Zeit (Endlosschleife)?
Luis Mendo
@ LuisMendo Ich werde ein Programm zulassen, das dies tut, solange es mit einem Programm geliefert wird, das das Zeitlimit vorsieht (damit man es vorab für seine Hardware erwerben kann). Es ist in der Tat umstritten :)
Jonathan Allan
In welcher Situation ist eine Zahl durch 400 teilbar, aber nicht durch 100 teilbar?
ATaco
@ATaco In keiner. Die Ausnahme von der Regel für jedes vierte Jahr sind Jahre, die durch 4 und 100 teilbar sind, jedoch nicht durch 400.
Dennis
@ATaco vielleicht ist der Wortlaut jetzt klarer
Jonathan Allan

Antworten:

4

MATL , 17 Bytes

`0Gv@+5:YcYO8XOda

Das Programm wird angehalten, wenn die Eingabe zur Sequenz gehört, oder wird auf unbestimmte Zeit ausgeführt (Endlosschleife).

Sei nder Input. Der Code führt eine Schleife aus, die Jahre testet 1und 1+n; dann 2und 2+n; ... bis ein passender Wochentag gefunden wurde. Wenn keine Übereinstimmung besteht, wird die Schleife auf unbestimmte Zeit ausgeführt.

Die Zugehörigkeitsfunktion für nist periodisch mit Punkt 400. Daher sind höchstens 400Iterationen erforderlich, wenn nsie zur Sequenz gehören. In Try It Online sind dafür weniger als 20 Sekunden erforderlich. Als Beweis für diese Obergrenze ist hier ein modifiziertes Programm , das die Anzahl der Iterationen auf 400 begrenzt (durch Hinzufügen @401<*am Ende). Beachten Sie auch, dass diese Bindung locker ist und in der Regel einige Sekunden ausreichen.

Probieren Sie es online!

Erläuterung

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

Alte Version, 24 Bytes

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

Die Ausgabe erfolgt, 0wenn die Eingabe zur Sequenz gehört oder auf 1andere Weise.

Probieren Sie es online!

Erläuterung

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
quelle
Scheint gut zu sein, meine Anfrage war wirklich, dass ich die Worst-Case-Eingabe kennen oder ein Programm haben möchte, das die 400 Iterationen erzwingt - auf diese Weise könnte man eine Obergrenze bekommen, wo immer man es ausführen möchte. (Übrigens denke ich, dass die Endlosschleife in der Praxis durch einen Fehler außerhalb der Grenzen beendet wird.)
Jonathan Allan
1
@ JonathanAllan Danke. Aha. Ich habe ein modifiziertes Programm hinzugefügt, das die Anzahl der Iterationen auf 400 begrenzt. Es dauert ungefähr 14 Sekunden, daher verwende ich 20 Sekunden als Obergrenze
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

Probieren Sie es online!

Eine direkte Formel.

xnor
quelle
Das ist nett. Ich glaube, Sie können 2 Bytes mit 5*u/4%7-3statt sparen (u-8)*5/4%7.
Jonathan Allan
Sparen Sie 2 weitere, indem Sie die Erfolgs- / Fehleroption mit 1/(...)anstelle von verwenden print ....
Jonathan Allan
5

Jelly , 20 bis 18 Bytes

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

Ausgänge 1 für Mitglieder, 0 für Nichtmitglieder.

Probieren Sie es online!

Wie es funktioniert

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
quelle
1

Haskell , 76 Bytes

-35 Bytes dank Jonathan Allan. -2 Bytes dank 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

Probieren Sie es online!

Verwendung des Algorithmus des OEIS PARI-Programms.

total menschlich
quelle
1
5*(n#4)kann 5*n#4auch sein!
Lynn
1

Pyth , 32 Bytes

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

Probieren Sie es hier aus! (Klicken Sie auf "Zur Test Suite wechseln", um weitere Testfälle gleichzeitig zu überprüfen.)

Wie?

Benutzt einen coolen Trick, den ich gerade zum Thema "Tipps zum Golfen in Pyth" hinzugefügt habe.

iI7 * FsM .: hMs.iKiIL4S99 * 98] K% Q400 | Volles Programm. Liest von STDIN, gibt an STDOUT aus.

                   S99 | Generieren Sie die Ganzzahlen in 1 ... 99.
                 L | Für jede ganze Zahl N in dieser Liste ...
               iI 4 | Überprüfen Sie, ob 4 über das Anwenden von GCD mit N invariant ist.
                                 | Dies entspricht der Überprüfung, ob 4 | N.
              K | Speichern Sie das Ergebnis in einer Variablen K.
            .i * 98] K | Und verschachtele K mit den Elementen von K, die eingewickelt sind
                                 | in eine Liste und 98 mal wiederholt.
           s | Ebnen.
         hM | Zuwachs.
       .: | Und generiere alle Teilstrings ...
                           % Q400 | Der Länge% 400.
     sM | Summe jeweils.
   * F | Und das gefaltete Produkt auftragen.
iI7 | Prüfen Sie, ob 7 invariant ist, wenn Sie GCD mit der anwenden
                                 | Produkt (grundsätzlich prüfen, ob 7 | Produkt).
                                 | Den entsprechenden Booleschen Wert implizit ausgeben.
Mr. Xcoder
quelle
0

Python 3 , 110 107 Bytes

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)]

Probieren Sie es online!

-3 Bytes dank Herrn Xcoder.

Кирилл Малышев
quelle