Haftanın Aynı Günü Olabilirler mi?


14

Meydan okuma

Negatif olmayan bir tamsayı göz önüne alındığında, haftanın bir gününü paylaşmak için tam olarak o yıllara göre değişen iki tarihin (Gregoryen takviminin) mümkün olup olmadığını çıktı. Bir yılın ya 4 ile bölünebilir, ancak 100 ile bölünemezse ya da 400 ile bölünebilirse bir sıçrama yılı olduğu varsayılır.

Çıktı olabilir:

  • falsey / doğruluk (her iki yönde)
  • herhangi iki farklı değer
  • bir farklı değer ve bir başka şey
  • program dönüş koduna göre
  • başarıya / hataya göre
  • diğer makul yollarla - sadece tartışmalı olabileceğinden şüphelenip şüphelenmediğinizi sorun

Ancak , falsey / doğruluk hariç, iki farklı değer kümesi tarafından değil (bu, işlem yapılmasına izin vermeyeceği için!)

detay

Bu, girişin OEIS A230995 sekansının bir üyesi olup olmadığıdır .

Üyeler:

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

Üye olmayanlar:

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

Bu yani her dilde en kısa cevap kazanır!


Çıktı olabilir: giriş diziye aitse veya süresiz (sonsuz döngü) çalışıyorsa program sona erer (30 saniyeden daha kısa sürede)?
Luis Mendo

@LuisMendo Zaman sınırını sağlayan bir programla birlikte olduğu sürece bunu yapan bir programa izin vereceğim (böylece bir kişinin donanımı için önceden edinebilir). Gerçekten de tartışmalı :)
Jonathan Allan

Hangi durumda bir sayı 400 ile bölünebilir ancak 100 ile bölünemez?
ATaco

@ATaco Hiçbiri. Her dördüncü yıl kuralının istisnası, 4 ile 100 arasında bölünebilen, ancak 400 ile bölünemeyen yıllardır.
Dennis

@ATaco belki de ifadeler şimdi daha net
Jonathan Allan

Yanıtlar:


4

MATL , 17 bayt

`0Gv@+5:YcYO8XOda

Program, giriş diziye aitse durur veya aksi takdirde süresiz olarak (sonsuz döngü) çalışır.

Izin vermek ngirdi. Kod, yılları test eden bir döngü yürütür 1ve 1+n; sonra 2ve 2+n; ... haftanın eşleşen bir gününü bulana kadar. Eşleşme yoksa döngü süresiz olarak çalışır.

Üyelik işlevi ndönemsel olarak periyodiktir 400. Bu nedenle, diziye aitse en fazla 400yineleme gereklidir n. Bu, Try It Online'da 20 saniyeden daha az bir süre gerektirir. Bu üst sınırın bir kanıtı olarak , yineleme sayısını 400'e ( sonunda ekleyerek ) sınırlayan değiştirilmiş bir program@401<* . Ayrıca bu sınırın gevşek olduğunu ve genellikle birkaç saniye yeterli olduğunu unutmayın.

Çevrimiçi deneyin!

açıklama

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

Eski sürüm, 24 bayt

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

Çıkış, 0girişin diziye ait olması veya 1başka bir şekilde yapılmasıdır.

Çevrimiçi deneyin!

açıklama

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)

İyi görünüyor, isteğim gerçekten en kötü durum girdisini bilmek veya 400 iterasyonunu zorlayan bir programa sahip olmaktı - bu şekilde bir kişi onu çalıştırmayı seçtiği her yerde bir üst sınır elde edebilirdi. (BTW Sanırım sonsuz döngü pratikte sınırların dışında bir hata ile sona erdi.)
Jonathan Allan

1
@JonathanAllan Teşekkürler. Anlıyorum. Yineleme sayısını 400 ile sınırlayan değiştirilmiş bir program ekledim. Yaklaşık 14 saniye sürüyor, bu yüzden üst sınır olarak 20 saniye kullanıyorum
Luis Mendo


5

Jöle , 20 18 bayt

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

Üyeler için 1 , üye olmayanlar için 0 çıktılar .

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

Jonathan Allan sayesinde -35 bayt. Lynn sayesinde -2 bayt.

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

Çevrimiçi deneyin!

OEIS PARI programının algoritmasını kullanarak.


1
5*(n#4)5*n#4ayrıca olabilir !
Lynn

1

Pyth , 32 bayt

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

Burada deneyin! (Aynı anda daha fazla test durumunu doğrulamak için "Test Suite'e Geç" i tıklayın)

Nasıl?

Ben sadece "Pyth golf için ipuçları" konu ekledi serin bir hile kullanır .

iI7 * FsM.: hMs.iKiIL4S99 * 98] K% Q400 | Tam program. STDIN'den okumalar, STDOUT'a çıktılar.

                   S99 | 1 ... 99 arasında tamsayılar oluşturun.
                 L | Bu listedeki her tamsayı N için ...
               iI 4 | 4'ün N ile GCD uygulanması konusunda değişmez olup olmadığını kontrol edin.
                                 | Bu, 4 | N.
              K | Sonucu K değişkeninde saklayın.
            .i * 98] K | Ve K'yı sarılı K unsurları ile serpiştirin
                                 | bir listeye ve 98 kez tekrarladı.
           s | Düzleştirmek.
         hM | Artış.
       .: | Ve tüm alt dizeleri oluştur ...
                           % Q400 | % 400 uzunluğunda.
     sM | Her birini toplayın.
   * F | Ve katlanmış ürünü uygulayın.
iI7 | İle GCD uygulandığında 7 değişmez olup olmadığını kontrol edin
                                 | ürün (temel olarak 7 | ürün olup olmadığını kontrol edin).
                                 | Uygun boolean değerini dolaylı olarak çıktılar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.