Mungkinkah mereka menjadi hari yang sama dalam seminggu?

14

Tantangan

Diberikan bilangan bulat non-negatif, keluaran apakah mungkin untuk dua tanggal (dari kalender Gregorian) berbeda dengan berapa tahun untuk berbagi satu hari dalam seminggu. Satu tahun diasumsikan sebagai tahun kabisat baik jika itu dibagi dengan 4 tetapi tidak oleh 100, atau jika itu dibagi dengan 400.

Output mungkin:

  • falsey / truthy (dalam orientasi manapun)
  • ada dua nilai yang berbeda
  • satu nilai berbeda dan satu menjadi lainnya
  • dengan kode pengembalian program
  • oleh kesuksesan / kesalahan
  • dengan cara apa pun yang masuk akal lainnya - tanyakan saja apakah Anda curiga itu kontroversial

Tetapi tidak dengan dua set nilai yang tidak berbeda, kecuali untuk falsey / truthy (karena ini akan memungkinkan no-op!)

Detail

Ini adalah apakah input tersebut adalah anggota urutan OEIS A230995 .

Anggota:

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

Bukan anggota:

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

Ini adalah sehingga jawaban terpendek di setiap bahasa menang!

Jonathan Allan
sumber
Dapatkah output menjadi: program berakhir (dalam waktu kurang dari 30 detik) jika input milik urutan, atau berjalan tanpa batas (infinite loop) sebaliknya?
Luis Mendo
@LuisMendo saya akan mengizinkan program yang melakukan itu asalkan disertai dengan program yang memberikan batas waktu (sehingga orang dapat memperolehnya sebelum perangkat kerasnya). Ini memang kontroversial :)
Jonathan Allan
Dalam situasi mana angka dibagi dengan 400 tetapi tidak dibagi dengan 100?
ATaco
@ATaco Tidak ada. Pengecualian untuk setiap aturan tahun keempat adalah tahun yang dapat dibagi oleh 4 dan 100, tetapi tidak oleh 400.
Dennis
@ATaco mungkin kata-katanya lebih jelas sekarang
Jonathan Allan

Jawaban:

4

MATL , 17 byte

`0Gv@+5:YcYO8XOda

Program berhenti jika input milik urutan, atau berjalan tanpa batas (infinite loop) sebaliknya.

Biarkan nmenjadi input. Kode mengeksekusi loop yang menguji tahun 1dan 1+n; kemudian2 dan 2+n; ... sampai hari yang cocok dalam seminggu ditemukan. Jika tidak ada yang cocok, loop berjalan tanpa batas.

Fungsi keanggotaan nadalah periodik dengan periode 400. Oleh karena itu, paling banyak 400iterasi diperlukan jika ntermasuk dalam urutan. Ini membutuhkan kurang dari 20 detik di Try It Online. Sebagai bukti batas atas ini, inilah program yang dimodifikasi yang membatasi jumlah iterasi hingga 400 (dengan menambahkan@401<* di akhir). Perhatikan juga bahwa ikatan ini longgar, dan beberapa detik biasanya sudah cukup.

Cobalah online!

Penjelasan

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

Versi lama, 24 byte

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

Output adalah 0jika input milik urutan, atau1 sebaliknya.

Cobalah online!

Penjelasan

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
sumber
Kelihatannya bagus, permintaan saya adalah benar-benar ingin mengetahui input kasus terburuk, atau memiliki program yang memaksa 400 iterasi - dengan cara itu seseorang bisa mendapatkan batas atas di mana pun seseorang memilih untuk menjalankannya. (BTW saya pikir loop tak terbatas, dalam praktiknya, berakhir dengan kesalahan di luar batas.)
Jonathan Allan
1
@Jonathan Allan Terima kasih. Saya melihat. Saya telah menambahkan program yang dimodifikasi yang membatasi jumlah iterasi hingga 400. Dibutuhkan sekitar 14 detik, jadi saya menggunakan 20 detik sebagai batas atas
Luis Mendo
5

Python 2 , 58 byte

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

Cobalah online!

Formula langsung.

Tidak
sumber
Ini bagus. Saya percaya Anda dapat menyimpan 2 byte dengan 5*u/4%7-3bukan (u-8)*5/4%7.
Jonathan Allan
Simpan 2 lagi dengan menggunakan opsi sukses / kesalahan dengan 1/(...)bukan print ....
Jonathan Allan
5

Jelly , 20 18 byte

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

Output 1 untuk anggota, 0 untuk non-anggota.

Cobalah online!

Bagaimana itu bekerja

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

Haskell , 76 byte

-35 byte terima kasih kepada Jonathan Allan. -2 byte terima kasih kepada 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

Cobalah online!

Menggunakan algoritma program OEIS PARI.

benar-benar manusiawi
sumber
1
5*(n#4)bisa 5*n#4juga!
Lynn
1

Pyth , 32 byte

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

Coba di sini!(Klik "Alihkan ke Test Suite" untuk memverifikasi lebih banyak kasus uji sekaligus)

Bagaimana?

Menggunakan trik keren yang baru saja saya tambahkan ke utas "Tips untuk bermain golf di Pyth".

iI7 * FsM.: hMs.iKiIL4S99 * 98] K% Q400 | Program lengkap. Baca dari STDIN, output ke STDOUT.

                   S99 | Hasilkan bilangan bulat dalam 1 ... 99.
                 L | Untuk setiap bilangan bulat N dalam daftar itu ...
               iI 4 | Periksa apakah 4 tidak berubah dibandingkan penerapan GCD dengan N.
                                 | Ini sama dengan memeriksa apakah 4 | N.
              K | Simpan hasilnya dalam variabel K.
            .i * 98] K | Dan interleave K dengan elemen K dibungkus
                                 | ke dalam daftar dan diulang 98 kali.
           s | Meratakan.
         hM | Kenaikan.
       .: | Dan menghasilkan semua substring ...
                           % Q400 | Panjangnya% 400.
     sM | Jumlahkan masing-masing.
   * F | Dan oleskan produk yang dilipat.
iI7 | Periksa apakah 7 tidak berubah ketika diterapkan GCD dengan
                                 | produk (pada dasarnya periksa apakah 7 | produk).
                                 | Secara implisit mengeluarkan nilai boolean yang sesuai.
Tuan Xcoder
sumber
0

Python 3 , 110 107 byte

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

Cobalah online!

-3 byte terima kasih kepada Tn. Xcoder.

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