0000-01-01 ve 99999-12-31 arasındaki tüm palindromik ana tarihleri ​​listele


11

Bir biliyor palindrom , bir asal ve tarih vardır.

Göreviniz, her üç özelliği de yerine getiren 100 bin yıllık tüm tarihleri ​​listelemek.

Sayılardan başka bir şey yok, şu formatları kullanın: YYYYMMDD ve YYYYYMMDD .

0000-01-01 ile 9999-12-31 arasındaki tarihler 8 haneli palindrom tarihleri ​​olarak (varsa) ve 10000-01-01 ile 99999-12-31 arasındaki tarihler 9 haneli palindromlar olarak yazdırılmalıdır .

Tarihleri ​​kronolojik sırayla listelemek zorunlu değildir.

Geçerli çıktının örnek kısmı.

İlk üç 9 haneli prime palindromik tarih:

...
100111001
100131001
100161001
...

kurallar

Standart boşluklar geçerlidir.


Kural: 02-29Sadece 400 ile bölünebilen veya 4 ile bölünebilen ve 100 ile bölünemeyen yıllar için vardır.
user202729

@ user202729 Evet, sanırım, örneğin 2017-02-29, 2018-02-29 ve 1900-02-29'un "tarih" olarak düşünülebileceğini sanmıyorum.
Outgolfer Erik

4
Asal olan 8 basamaklı palindromik tarihler yoktur. İşte bir geri dönüş / baskı yapmamız gereken liste (toplam 197) . Bu doğru mu? @Plarsen?
Kevin Cruijssen

1
30 Şubat'a izin vermeli miyiz? > timeanddate.com/date/february-30.html
jrtapsell

Yanıtlar:


5

Yakut , 144 (134 + 7 141 bayt -rprimebayrak)

Benj2240 sayesinde 3 bayt tasarruf edildi !

('01'..'12').map{|m|('01'..'31').map{|d|(?0..?9).map{|k|q=m+d
y=q.reverse+k
r=y+q
Time.new(y,m,d).day==d.to_i&&r.to_i.prime?&&(p r)}}}

Çevrimiçi deneyin!

Algoritma:

  • "0101" den "1231" e kadar tüm olası MMDD kombinasyonlarını üretin
  • MMDD dizesini tersine çevirip ortadaki (0..9) aralığındaki tüm karakterleri ekleyerek bu tarih için bir palindromla sonuçlanacak tüm yılları oluşturun
  • bu oluşturarak geçerli bir tarih olup olmadığını kontrol Timeverilen ile örneğini y, m, ddeğerler. Sonuçta elde edilen zaman nesnesinin #daydeğeri eşitse d, bu geçerli bir tarihtir. Aksi takdirde, tarihi değiştirir (örneğin, Time.new 2018,2,30geri döner 2018-03-02).
  • geçerli palindrom tarihinin de asal olup olmadığını kontrol edin ve varsa görüntüleyin.

İç döngü başlangıçta (?0..?9)aralıktaki her öğe ve boş dize için çağrılan bir işlevdi.

Boş dize sonuç üretmediği için (geçerli 8 basamaklı asal palindrom yoktur), onu kaldırmaya ve bu sürüme yeniden bakmaya karar verdim.


tDeğişkeni kaldırarak birkaç bayt kaydedebileceğinizi düşünüyorum : TIO
benj2240

@ benj2240 Doğru! Teşekkürler!
Cristian Lupascu

4

Python 2 , 116 107 128 122 119 bayt

def g(n=9**8):
 while n<1e9:
  n+=2;m=n/100%100
  if 0<m<13and n%100<31+(m+m/8)%2and`n`[::-1]==`n`and 2**n%n==2:print n

4 hattın ikinci yarısından esinlenerek mxdsp 'ın başka golf soruya burada yanıt .

açıklama

İşlev g(), yalnızca nvarsayılan değerini kullanarak değişkeni başlatmak için bağımsız değişken alır . Başlangıç ​​değeri, ilk geçerli cevap 100111001'den daha az olmakla birlikte, mümkün olduğunca kısa ve mümkün olduğunca büyük olan tek bir sayıdır.

n10 9 tarih aralığının sonuna ulaşıncaya kadar döngü yapınız . n2'ye göre artış m, tarih ayıdır n.

Eğer ngeçerli bir tarih, palindrom ve asal olduğunu yazdırmak:

  • Tarih:
    • 0 < m < 13mgeçerli bir ay olup olmadığını kontrol eder .
    • n % 100 < 31 + (m+m/8)%2nayın gününün geçerli olup olmadığını kontrol eder . 31 gün ile tüm aylar için (m+m/8)%2ekler 1. Bunun için kredi ArmanX'in cevabına gidiyor . 29-30 Şubat tarihleri ​​için asal sayı yok.
  • Palindrom: `n`[::-1] == `n`. Ters çiviler dizgi yapar n. [::-1]dizeyi tersine çevirir.
  • Prime: 2**n % n == 2Bir olan Fermat asallık testi . Bu test sadece olasılıklıdır. Ayrıca eşleşen asal olmayanlar da vardır. Ama baktığımız sayı aralığında değil.

Fermat'ın öncelik testini kullanarak iyi bir tane!
agtoever

3

APL (Dyalog Unicode) , 155 bayt

CY'dfns'
n←⍕x
m←(⍎2↑¯4n)
d←(⍎¯2n)
:If n≡⌽n
:AndIf 1 pco x
:AndIf m<13
:AndIf d<32
:If m d2 29
:AndIf (400|⍎((≢n)-4)↑n)=0
⎕←x
f x+72
:End
⎕←x
:End
f x+1

Çevrimiçi deneyin!

Bu Tradfn (olup Çevirmen itional f unctio n bir argüman alır) arg = yyyymmddveya arg = yyyyymmdd. Kullanımı f arg.

Bu, argüman başladığında hiçbir şey vermeyecektir, 10000101çünkü 60 saniye içinde bir ana palindrom tarihi bulamaz.

İşte OP'nin örnek çıktısını verecek daha az golfçü bir yaklaşım

100111001
100131001
100161001

( Çevrimiçi deneyin! )

Bir sonraki tarih için işlevi yinelemeli olarak çağırmadan hemen önce her iki kodun da aynı olduğuna dikkat edin. Golfed versiyonu gibi deyimiyle iken f arg+1, daha az golfed kod günden atlar 31güne 01ve aydan 12aya 01biraz hızlandırır, hangi.

Nasıl çalışır:

CY'dfns'                    Copy (⎕CY) all dfns to enable the use of pco.
n←⍕x                         Assign (←) the input to the variable n.
m←(⍎2↑¯4n)                  Take (↑) the last 4 4) elements of n, then take the first 2 elements of that and assign to m. 
d←(⍎¯2n)                    Take the last 2 2) elements of n, and assign to d.
:If n≡⌽n                     If n matches (≡) its reverse (⌽) (is a palindrome)
:AndIf 1 pco x               And a prime (1 pco)
:AndIf m<13                  And month < 13
:AndIf d<32                  And day < 32
:If m d2 29                 If it is 2/29
:AndIf (400|⍎((≢n)-4)↑n)=0   And the year mod 400 = 0
⎕←x                          Print x
f x+72                       call f with arg year0301
:End
⎕←x                          Print x
:End
f x+1                        call f for the next date.

2

Python 3, 163 bayt

r=range
for m in r(1,13):
 for d in r(1,31+(m%2==(m<8))-2*(m==2)):
  t="%02d"*2%(m,d)
  for i in r(10):x=int(t[::-1]+str(i)+t);all(x%i for i in r(2,x))and print(x)

Çözüm oldukça uzundur (ve muhtemelen geliştirilebilir), ancak asal / tarih / palindrom kontrolü için yerleşik işlevler kullanmaz. Netlik için biraz ungolfed versiyonu:

for month in range(1,13):
    for day in range(1,31 + (month%2==(month<8)) - 2*(month==2)):
        t = "%02d%02d" % (month, day)
        for i in range(10):
            x = int(t[::-1] + str(i) + t)
            if all(x%i for i in range(2,x)):print(x)

Geçerli tarihler, bir ay ve gün seçilerek oluşturulur. Daha önce yorumlandığı gibi, sadece 9 beden dikkate alınmalıdır. Ayrıca artık yılların dikkate alınmadığını unutmayın. Bu, 0229 ile biten 9 uzunluktaki palindrom primlerinin mevcut olmadığı şanslı tesadüf nedeniyle gerekli değildir (30 Şubat 1712 gibi diğer tarih anomalileri aynı nedenden dolayı atılabilir).

Daha sonra orta basamak serbestçe seçilir ve bir birincil test yapılır. Birincil testin olabildiğince kısa olması gerektiğinden, çok saf ve dolayısıyla sakince yavaştır. Harici bir kütüphane kullanmak bunu çözebilir (ve bazı baytları kaydedebilir), ancak daha önce de bahsettiğim gibi kullanmak istemedim.


Kodunuzu, bayt saydığınızda tam olarak nasıl göründüğünü göstermelisiniz (bu durumda girinti aralığını daraltarak). Ayrıca, golf edilmemiş bir versiyon eklemeniz harika, ancak genellikle golf versiyonu ilk sırada yer alıyor
wnnmaw

@wnnmaw Yanıtta verilen sürümde saydığım sürüm arasındaki tek fark, burada kullanılan boşluklar yerine sekmeler kullanmam. Sekmelerin otomatik olarak dönüştürüldüğünün farkında olduğum için, bunu düzeltmek için herhangi bir yol göremiyorum.
Def

@Def IIRC Python, boşlukları girintiler olarak da kullanmanıza izin verir, böylece cevabınızda da aynı görünebilir. İlk bölümde yanılıyorsam beni düzeltin.
elementbound

@elementbound Gerçekten, öneri için teşekkürler.
Def

2

WolframLanguage (Mathematica) 187 bayt

Bulunacak boyutta bir miktar azalma olabilir. Takip edilecek açıklama ...

t=ToString;p=PadLeft;d=DateObject;Cases[""<>{t/@p[#,If[Length@#<5,4, 5]],t/@ p[#2,2],t/@p[#3,2]}&@@@(IntegerDigits/@#[[1]]&/@DayRange[d@#,d@#2]),x_/;PalindromeQ@x&&PrimeQ@ToExpression@x]&

Test senaryoları

t = ToString; p = PadLeft; d = DateObject;
Cases["" <> {t /@ p[#, If[Length@# < 5, 4, 5]], t /@ p[#2, 2], 
   t /@ p[#3, 2]} & @@@ (IntegerDigits /@ #[[1]] & /@ DayRange[d@#, d@#2]), 
   x_ /; PalindromeQ@x && PrimeQ@ToExpression@x] &[{10011, 10, 1}, {10017, 1, 1}]

(* {"100111001", "100131001", "100161001"} *)

Kod açıklaması

DayRange[d@#,d@#2]{10011, 10, 1}ve arasındaki tüm tarihleri ​​döndürür {10017, 1, 1}. Bu durumda, yaklaşık 5 yıl, 4 ay tarih (tam olarak 1920 tarih) döndürür. Artık yıllar dikkate alınır.

Tarihler Wolfram standart biçimlendirmesi ile döndürülür. Örneğin, ilk tarih DateObject[List[1,1,1],"Day","Gregorian",-5.] `

#[[1]] & /@tarihin, her tarihte bizi ilgilendiren kısmını kaldıracaktır. Örnekte, DateObject[List[1,3,7],"Day","Gregorian",-5.]kısaltılmış tarihi döndürür {1,3,7}.

t/@p[#3,2]}veya ToString/@Padleft[#3,2]üçüncü elemanı, yani 7 ayakta "ayın 7. günü" olarak doldurur "07". Mart ayı için tek haneli sembol için de benzer dolgu sağlanır, yani 3olarak döndürülür "03".

p[#, If[Length@# < 5, 4, 5]]4 veya 5 basamaklı bir dizenin uzunluğuna ulaşmak için yılı sıfırlarla doldurur. Bu durumda Ocak, yani 1"00001" olarak döndürülür.

"" <>...dizeleri birleştirir. Bu durumda geri döner "000010307".

Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x] 1920 tarihleri ​​arasında palindrom ve asal olan vakaları döndürür.


2

JavaScript , 187 177

Varsayımlar: eşleşen 4 basamaklı yıl yok; 29-30 Şubat arasında eşleşen gün yok

p=n=>(n<10?'0':'')+n;f=n=>n[3]+n[2]+n[1]+n[0];for(m=13;--m;)for(d=31+(m+(0|m/8))%2;--d;){for(y=10;y--;){z=p(m)+p(d);Y=+(f(z)+y+z);for(i=2;Y%i&&i*i<Y;i++);if(Y%i)console.log(Y)}}

Şöyle çalışır:

p=n=>(n<10?'0':'')+n;       //Prepend a 0 for 1-digit numbers and convert to a string
f=n=>n[3]+n[2]+n[1]+n[0];   //Flip four digits
for(m=13;--m;)              //Month loop, from 12 to 1
 for(d=
       31+(m+(0|m/8))%2     //Calculate the days in the month, allowing  Feb. 29 & 30
                       ;--d;){ //Day loop
  for(y=10;y--;){           //Middle digit loop
   z=p(m)+p(d);             //Prepend zeros to the month and day
   Y=+(f(z)+y+z);           //Flip the digits; append the middle digit,
                            //month, and day; convert back to an integer
   for(i=2;Y%i&&i*i<Y;i++); //Check if it's a prime
    if(Y%i)console.log(Y)}} //If it doesn't divide evenly, it's not prime. Print it!

Tarih:

  • 187 ila 177: 29 veya 30 Şubat'ta düşen ana palindrom tarihleri ​​yoktur, bu nedenle Şubat'ın 30 günü olduğunu iddia edebilir ve 10 karakter kaydedebiliriz.

Notlar:

Testler sonucunda, 4 haneli veya 29 Şubat veya 30 Şubat tarihlerinde geçerli olan geçerli bir eşleşme bulunmadığını tespit ettim. Ne yazık ki, kod adına, çeşitli ayların 31'inde düşen beş (geçersiz) sonuç var. sadece 31 gün var.


2

Java 10, 329 327 320 318 312 308 307 264 bayt

v->{for(int y=9999,m,d;++y<1e5;)for(m=0;++m<13;)for(d=0;++d<32;)try{java.time.LocalDate.of(y,m,d);var t=y+"".format("%02d%02d",m,d);long n=new Long(t),x=1;for(;n%++x%n>0;);if(t.contains(new StringBuffer(t).reverse())&n==x)System.out.println(t);}finally{continue;}}

@Assylias sayesinde -1 bayt .

Açıklama:

Çevrimiçi deneyin (not: prime kontrol kısmı daha verimli bir ayrılmış yöntemle değiştirilmiştir, ancak 60 saniyeden sonra hala zaman aşımına uğramış olsa bile, sadece ilk ~ 115 palindromik prime tarihlerini çıkarır).
Yerel bir işlemden 197 çıkışın tümünün Pastebin.

v->{                           // Method without empty unused parameter and no return-type
  for(int y=9999,m,d;++y<1e5;) //  Loop over the years in the range [1000,9999]:
    for(m=0;++m<13;)           //   Inner loop over the months in the range [1,12]:
      for(d=0;++d<32;){        //    Inner loop over the days in the range [1,31]:
        try{java.time.LocalDate.of(y,m,d);
                               //     If it's a valid date:
          var t=y+"".format("%02d%02d",m,d);
                               //      Convert the numbers to a String in format "yyyyyMMdd"
          long n=new Long(t),  //      Convert this String to a long
          x=1;for(;n%++x%n>0;);//      Prime-checking loop
          if(t.contains(new StringBuffer(t).reverse())
                               //      If the string is palindromic
             &n==x)            //      and the long is a prime:
            System.out.println(t);
                               //       Print the string with trailing newline
        }finally{              //     If it isn't a valid date:
          continue;}}}         //      Continue to the next iteration of the inner-most loop

1
if(t.equals(new StringBuffer(t).reverse()+"")-> if(t.contains(new StringBuffer(t).reverse())1 karakter kaydetmek için (her iki dizginin de aynı uzunlukta olduğunu bildiğimiz için çalışır). Çok fazla değil :-(
assylias

@assylias Smart, beğendim. Teşekkürler! Ve 1 bayt fazla olmasa da, hala 1 bayt. Codegolf her zaman mümkün olduğunca kısa yapmakla ilgilidir, bu yüzden her bayt önemlidir. :)
Kevin Cruijssen

1

VBA, 347

Sub PalindromeDate()
Dim DateString As String
For i = 0 To 9999
    For j = 1 To 12
        For k = 1 To 31
        DateString = Format(i, "0000") & Format(j, "00") & Format(k, "00")
        If DateString = StrReverse(DateString) Then
        Debug.Print DateString
        Else
        End If
        Next k
        Next j
        Next i

End Sub

PPCG'ye Hoşgeldiniz! VBA bilmiyorum, ama görünüşe göre bazı boşluklar golf olabilir.
FantaC

Ayrıca VBA'yı gerçekten bilmiyorum, ancak bence DateStringgelişigüzel bir değişken adı, bu yüzden bunu tek bir karaktere indirebilmelisiniz, değil mi?
Martin Ender

3
Ve sanırım "palindromik başbakan tarihleri" nin en önemli bölümünü kaçırdınız .
mercator

Artık yılları hesaplamak için bir kod olurdu (biri 29 Şubat günleri vardır)
RosLuP

5 haneli yıllar da eksik ve Else gerekli değil.
Weijun Zhou

0

Temiz , 262 ... 213 bayt

import StdEnv
@ =(rem)
f=[d\\d<-[a*10^4+b*100+c\\a<-[10^4..99999],b<-[1..12],c<-[1..28+[0,3,if(@a 400<1|| @a 4<1&& @a 100>0)1 0,3,2,3,2,3,3,2,3,2,3]!!b]]|(\k=k==reverse k)[p\\p<-:toString d]&&all((<)0o@d)[2..d-1]]

Çevrimiçi deneyin!


0

JavaScript , 234 229 bayt

Biraz hantal, ama JS topu haddeleme almak için gönderme. Herhangi bir öneri hoş geldiniz!

f=n=>100+10*n+n/10|0
p=n=>{for(i=2;i<n;n=n%i++<1?0:n);return n>1}
q=n=>(''+(100+n)).slice(-2)
r=_=>{for(m=13;--m;)for(d=32;--d;)for(x=10;--x+1;){s=q(f(d))+q(f(m))+x+q(m)+q(d);if(p(s|0)&&d<(m==2?29:31+(m+m/8|0)%2))console.log(s)}}

Ungolfed:

// Flip a one- or two-digit number
f=n=>100+10*n+n/10|0

// Primality test
// For initial testing, you can replace this line with:
//      p=require('primality')
// This uses the primality npm module and is way faster
p=n=>{for(i=2;i<n;n=n%i++<1?0:n);return n>1}

// Convert number to string, pad with zeroes if necessary
q=n=>(''+(100+n)).slice(-2)

r=_=>{
    // Loop months
    for(m=13;--m;)
        // Loop days
        for(d=32;--d;)
            // Loop middle digit
            for(x=10;--x+1;) {
                // Construct 'date'
                s = 
                    // Start with day and month, each flipped
                    q(f(d))+q(f(m)) + 
                    // Add middle digit ( will be casted to string since the previous expression is also a string)
                    x + 
                    // Add month and date as they are
                    q(m)+q(d);

                if(
                    // Check for primality
                    p(s|0) && 
                    // Check if it's a valid date by validating day ( month and year will always be valid)
                    d<(
                        // For February, we always assume 28 days ( check for 29 because we use less than)
                        m==2?29 : 
                        // For other months, it alternates between 31 and 30
                        // EXCEPT July and August both have 31 days, then continues alternating
                        31+(m+m/8|0)%2))
                    console.log(s)
            }
}

Nasıl çalışır:

Rakam saygısız büyü çoğunlukla denemeye dayanır.
Ters çevrilmiş sürümü elde etmek için hangi sayıdan çıkarılacağını anlayarak başladım. Sadece son iki rakamı önemsedim.
Yani, alırsak n, köyle bul n+k=flip(n). İçin 10<n<20 k101'den başlayan ve için, Ancak 9'un artışlarla artış n<10, bu 100. ben varsaydıkları oldu k10 her atlama için artmış ve işe yaramaz biraz sonra ben doğru olduğunu düşündüm.
Yani, k=100+9*n+n//10burada // tamsayı bölümü anlamına gelir.

Böylece anlıyoruz n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n).

Bunun herhangi bir sayı için işe yaradığını kanıtlayamam, iddia edemem, ancak burada kullanılan sayılar için doğru sonuçlar üretti.

Öncelik testi için Kevin Cruijssen'in cevabına teşekkür edin . Biraz daha kısa bir versiyonum vardı, ancak doğru yapamadım:

p=n=>{for(i=n;--i-1;)if(!(n%i))return 1;}

Ben aylar, günler ve ben dizeleri inşa böylece bir orta rakamı üzerinde döngü ile, palindrom testinde atlanır dDmMxMmDdnerede D, günün ilk rakamdır dikinci vb olduğunu

Tarih

Q'nun koşullu kısmından kurtularak 5 bayt kaydedildi

q=n=>n<10?'0'+n:(''+n).slice(-2) // from
q=n=>(''+(100+n)).slice(-2)      // to

Bayt sayımlarıyla uğraştığım için üzgünüm. Bazı yumuşak tırnaklarda yanlışlıkla kaymıştır. Şimdi doğru olmalı.
elementbound

Sen sadece hiç kullandığınız fbir parametre olarak 'nın sonucu qöylesine ortadaki adam ve yazma kesip, f=n=>''+n%10+(n/10|0)yazabilir, böylece her zaman bir dize olarak kullanılır ve q'in sonucu q=n=>n<10?'0'+n:n.
Neil

0

APL NARS 626 bayt, 313 karakter

f;y;m;d;i;k;v;x;t
t←{60⊥3↑3↓⎕TS}⋄t0←50+t
x←2 12⍴v,v←31 28 31 30 31 30 31 31 30 31 30 31
x[2;2]←29⋄m←d←1⋄y←10000
X:  i←{(0=4∣⍵)∧0≠100∣⍵:1⋄0=400∣⍵:1⋄0}y
A:  →0×⍳y≥1e5
    →0×⍳t≥t0
    k←d+100×m+y×100
    →B×⍳∼k=⍎⌽⍕k⋄→B×⍳∼0πk⋄⎕←k
B:  d+←1
    →A×⍳d≤x[1+i;m]
    d←1⋄→C×⍳∼m=12⋄m←1⋄y+←1⋄→X
C:  m+←1⋄→A

Bu baskı ne kendini durdurmak daha sonra 50 saniye içinde bulmak, (aksi takdirde ben kopya yapıştırmak için programı durduramıyorum testi, çünkü ben yorumlayıcı pencerelerini kapatmadan programı durdurmak için nasıl bilmiyorum) test:

  f
100111001
100131001
100161001
101030101
101060101
101141101
101171101
102040201
102070201
103000301
103060301
104000401
104030401
104040401

0

Julia 0.6 , 109 bayt

Bağlantı iki farkla daha uzun bir sürüme gider:

  1. Primes paketi TIO'da bulunmadığından, elle yazılmış fonksiyona sahip asalları kontrol eder.
  2. Zaman aşımına uğramamak için farklı bir tarih aralığında yinelenir.
[s for s in Dates.format(Date(0,1,1):Date(100000,1,1),"YYYYmmdd") if Primes.isprime(parse(s))&&s==reverse(s)]

Çevrimiçi deneyin!

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.