Họ có thể là cùng một ngày trong tuần?


14

Thử thách

Cho một số nguyên không âm, xuất ra liệu có thể cho hai ngày (của lịch Gregorian) khác nhau bởi chính xác là nhiều năm để chia sẻ một ngày trong tuần. Một năm được coi là một năm nhuận nếu nó chia hết cho 4 nhưng không chia cho 100 hoặc nếu nó chia hết cho 400.

Đầu ra có thể là:

  • falsey / sự thật (theo một trong hai định hướng)
  • bất kỳ hai giá trị riêng biệt
  • một giá trị khác biệt và một giá trị khác
  • theo mã trả về của chương trình
  • bởi thành công / lỗi
  • bằng bất kỳ phương tiện hợp lý nào khác - chỉ cần hỏi nếu bạn nghi ngờ nó có thể gây tranh cãi

Nhưng không phải bởi hai bộ giá trị không khác biệt, ngoại trừ falsey / thật (vì điều này sẽ cho phép không có tác dụng!)

Chi tiết

Đây là liệu đầu vào có phải là thành viên của chuỗi OEIS A230995 hay không .

Các thành viên:

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

Không phải thành viên:

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

Đây là vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!


Đầu ra có thể là: chương trình kết thúc (trong vòng dưới 30 giây) nếu đầu vào thuộc về chuỗi hoặc chạy vô thời hạn (vòng lặp vô hạn) nếu không?
Luis Mendo

@LuisMendo Tôi sẽ cho phép một chương trình hoạt động miễn là nó đi kèm với một chương trình cung cấp giới hạn thời gian (vì vậy người ta có thể có được nó trước phần cứng của một người). Nó thực sự gây tranh cãi mặc dù :)
Jonathan Allan

Trong tình huống nào một số chia hết cho 400 nhưng không chia hết cho 100?
ATaco

@ATaco Trong không có. Ngoại lệ cho quy tắc năm thứ tư là các năm chia hết cho 4 và 100, nhưng không chia cho 400.
Dennis

@ATaco có thể từ ngữ rõ ràng hơn bây giờ
Jonathan Allan

Câu trả lời:


4

MATL , 17 byte

`0Gv@+5:YcYO8XOda

Chương trình tạm dừng nếu đầu vào thuộc về chuỗi hoặc chạy vô thời hạn (vòng lặp vô hạn) nếu không.

Hãy nlà đầu vào. Mã thực thi một vòng lặp kiểm tra năm 11+n; sau đó 22+n; ... cho đến khi một ngày phù hợp trong tuần được tìm thấy. Nếu không có kết quả khớp thì vòng lặp chạy vô thời hạn.

Các chức năng thành viên nlà định kỳ với thời gian 400. Do đó, hầu hết các 400lần lặp là cần thiết nếu nthuộc về trình tự. Điều này đòi hỏi ít hơn 20 giây trong Dùng thử trực tuyến. Để chứng minh cho giới hạn trên này, đây là một chương trình được sửa đổi giới hạn số lần lặp là 400 (bằng cách thêm @401<*vào cuối). Cũng lưu ý rằng ràng buộc này là lỏng lẻo và một vài giây thường là đủ.

Hãy thử trực tuyến!

Giải trình

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

Phiên bản cũ, 24 byte

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

Đầu ra là 0nếu đầu vào thuộc về trình tự, hoặc 1nếu không.

Hãy thử trực tuyến!

Giải trình

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)

Có vẻ tốt, yêu cầu của tôi thực sự là tôi muốn biết đầu vào trường hợp xấu nhất hoặc có một chương trình buộc 400 lần lặp - theo cách đó, người ta có thể có giới hạn trên bất cứ nơi nào người ta chọn để chạy nó. (BTW Tôi nghĩ rằng vòng lặp vô hạn, trên thực tế, đã kết thúc bằng một lỗi ngoài giới hạn.)
Jonathan Allan

1
@Jonathan ALLan Cảm ơn. Tôi hiểu rồi. Tôi đã thêm một chương trình sửa đổi giới hạn số lần lặp là 400. Mất khoảng 14 giây, vì vậy tôi đang sử dụng 20 giây làm giới hạn trên
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

Hãy thử trực tuyến!

Một công thức trực tiếp.


Cái này đẹp đấy. Tôi tin rằng bạn có thể lưu 2 byte 5*u/4%7-3thay vì (u-8)*5/4%7.
Jonathan Allan

Tiết kiệm thêm 2 bằng cách sử dụng tùy chọn thành công / lỗi 1/(...)thay vì print ....
Jonathan Allan

5

Thạch , 20 18 byte

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

Đầu ra 1 cho thành viên, 0 cho người không thành viên.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Bình thường , 32 byte

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

Hãy thử nó ở đây! (Nhấp vào "Chuyển sang Bộ kiểm tra" để xác minh thêm các trường hợp kiểm tra cùng một lúc)

Làm sao?

Sử dụng một mẹo hay mà tôi vừa thêm vào chủ đề "Mẹo chơi gôn trong Pyth".

iI7 * FsM .: hss.iKiIL4S99 * 98] K% Q400 | Chương trình đầy đủ. Đọc từ STDIN, xuất ra STDOUT.

                   S99 | Tạo các số nguyên trong 1 ... 99.
                 L | Đối với mỗi số nguyên N trong danh sách đó ...
               iI 4 | Kiểm tra xem 4 có bất biến khi áp dụng GCD với N.
                                 | Điều này tương đương với việc kiểm tra nếu 4 | N
              K | Lưu trữ kết quả trong một biến K.
            .i * 98] K | Và xen kẽ K với các yếu tố của K bọc
                                 | vào một danh sách và lặp lại 98 lần.
           s | Làm phẳng.
         hM | Tăng.
       .: | Và tạo ra tất cả các chuỗi con ...
                           % Q400 | Độ dài% 400.
     sM | Tính tổng mỗi.
   * F | Và áp dụng sản phẩm gấp.
iI7 | Kiểm tra xem 7 có bất biến khi áp dụng GCD với
                                 | sản phẩm (về cơ bản kiểm tra xem 7 | sản phẩm).
                                 | Ngẫu nhiên xuất giá trị boolean thích hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.