0000-01-01から99999-12-31までの回文のプライム日付をすべてリストします


11

回文プライム日付が何であるかを知っています。

あなたの仕事は、3つの特性すべてを満たす10万年のすべての日付をリストすることです。

数字以外は気にせず、次の形式を使用します:YYYYMMDDおよびYYYYYMMDD

0000-01-01から9999-12-31 までの日付は8桁の回文日付(ある場合)として印刷し、10000-01-01から99999-12-31までの日付は9桁の回文日付として印刷する必要があります。

日付を時系列にリストすることは必須ではありません。

有効な出力の一部の例。

最初の3つの9桁の主回文日付:

...
100111001
100131001
100161001
...

ルール

標準の抜け穴が適用されます。


ルール:02-29400で割り切れる年または(4で割り切れ、100で割り切れない)年だけ存在します。
user202729

@ user202729ええ、そうだと思います。たとえば、2017-02-29、2018-02-29、1900-02-29は「日付」と見なすことはできないと思います。
エリックアウトゴルファー

4
同じく素数である8桁の回文日付はありません。以下は、返される/印刷されるリスト(合計197)のペーストビンです。これは正しい@Plarsenですか?
ケビンクルーイッセン

1
2月30日を許可する必要がありますか?> timeanddate.com/date/february-30.html
jrtapsell

回答:


5

Ruby144 141バイト(-rprimeフラグの場合は134 + 7 )

benj2240のおかげで3バイト節約されました

('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)}}}

オンラインでお試しください!

アルゴリズム:

  • 「0101」から「1231」までの可能なすべてのMMDDの組み合わせを生成する
  • MMDD文字列を反転し、(0..9)範囲のすべての文字を順番に中央に追加することにより、パリンドロームをもたらすその日付のすべての年を生成する
  • それが作成することにより、有効な日付であるかどうかを確認Time与えてインスタンスをymdの値。結果の時間オブジェクトの#day値がに等しい場合d、それは有効な日付でした。そうしないと、日付がシフトします(たとえば、をTime.new 2018,2,30返します2018-03-02)。
  • 有効な回文日付も素数であるかどうかを確認し、素数である場合は表示します。

内側のループは、最初は(?0..?9)範囲内の各要素と空の文字列に対して呼び出される関数でした。

空の文字列は結果を生成しなかったため(有効な8桁のプライムパリンドロームはありません)、私はそれを削除し、このバージョンにリファクタリングすることにしました。


t変数を削除することで数バイト節約できると思います:TIO
benj2240

@ benj2240そうです!ありがとう!
クリスティアンルパスク

4

パイソン2116の 107 128 122 119バイト

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行目の後半は、別のゴルフの質問に対するmxdsp回答に触発されています。

説明

この関数g()は、nデフォルト値を使用して変数を初期化するためだけに引数を取ります。初期値は、最初の有効な回答100111001よりも小さい一方で、できるだけ短く、できるだけ大きい奇数です。

n日付範囲10 9の終わりに達するまでループします。n2.の増分mは、日付の月ですn

場合はn、有効な日付、回文と素数である、それを印刷。

  • 日付:
    • 0 < m < 13m有効な月であることを確認します。
    • n % 100 < 31 + (m+m/8)%2nの日付が有効であることを確認します。31日間のすべての月に(m+m/8)%2追加さ1れます。その功績は、ArmanXの答えにあります。2月29〜30日には素数はありません。
  • パリンドローム:`n`[::-1] == `n`。バックティックは文字列化しnます。[::-1]文字列を反転します。
  • 首相は:2**n % n == 2あるフェルマー素数判定テスト。このテストは確率的です。一致する非プライムもあります。しかし、私たちが見ている数字の範囲内ではありません。

Fermatの素数性テストを使用した素晴らしいものです!
-agtoever

3

APL(Dyalog Unicode)、155バイト

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

オンラインでお試しください!

これはTradfnある(トラッド itional F unctio nは一つの引数を取る)arg = yyyymmdd、またはarg = yyyyymmdd。使用法はf argです。

引数が1000010160秒で主要な回文の日付を見つけられないため、引数の開始時に何も出力されません。

以下は、OPの出力例であるゴルフの少ないアプローチです。

100111001
100131001
100161001

オンラインで試してみてください!

次の日付で関数を再帰的に呼び出す直前まで、両方のコードはまったく同じであることに注意してください。golfedバージョンが同じようにそれを呼び出しますがf arg+1、あまりgolfedコードが日からジャンプ31の日に01、月から12月に01かなりそれをスピードアップされ、。

使い方:

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バイト

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)

解決策はかなり長いですが(おそらく改善される可能性があります)、組み込み関数をプライム/日付/パリンドロームのチェックに使用しません。わかりやすくするため、やや未使用のバージョン:

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)

月と日を選択することにより、有効な日付が生成されます。前にコメントしたように、サイズ9のみを考慮する必要があります。また、うるう年は考慮されないことに注意してください。これは、0229で終了する長さ9のパリンドローム素数が存在しないという幸運な偶然のために必要ではありません(1712年2月30日のような他の日付異常は同じ理由で破棄できます)。

次に、中央の数字が自由に選択され、プライムテストが実行されます。プライムテストはできるだけ短くする必要があったため、非常に単純であり、結果として非常に遅くなります。外部ライブラリを使用するとこれを解決できます(そして、いくつかのバイトを節約できます)が、前述したように、私は何も使いたくありませんでした。


バイトをカウントしたときのコードを正確に見えるようにする必要があります(この場合、インデントの間隔を縮小します)。また、無料版を含めたことは素晴らしいことですが、通常はゴルフ版が最初にリストされています
-wnnmaw

@wnnmaw答えで提供されたものと数えたバージョンの唯一の違いは、ここで使用されるスペースの代わりにタブを使用したことです。私が知っているように、タブは自動変換されるため、これを修正する方法はありません。
Def

@Def IIRC Pythonでは、スペースをインデントとして使用することもできます。これにより、回答でも同じように見える場合があります。最初の部分が間違っている場合は修正してください。
要素バインド

@elementbound提案に感謝します。
Def

2

WolframLanguage(Mathematica)187バイト

サイズが多少減少する場合があります。続く説明...

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

テストケース

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"} *)

コードの説明

DayRange[d@#,d@#2]{10011, 10, 1}との間のすべての日付を返します{10017, 1, 1}。この場合、約5年、4か月の日付(正確には1920年の日付)を返します。うるう年が考慮されます。

日付はWolfram標準形式で返されます。たとえば、最初の日付はDateObject[List[1,1,1],"Day","Gregorian",-5.] ` と表示されます

#[[1]] & /@私たちに関係する日付の各日付の部分を削除します。例でDateObject[List[1,3,7],"Day","Gregorian",-5.]は、省略された日付を返します{1,3,7}

t/@p[#3,2]}またはToString/@Padleft[#3,2]、3番目の要素、つまり、「月の7日目」の7をのように埋め込み"07"ます。同様のパディングが3月の1桁の記号に提供さ3"03"ます。つまり、として返されます。

p[#, If[Length@# < 5, 4, 5]]4桁または5桁の文字列の長さに達するまで年をゼロで埋めます。この場合、1月、つまり1が `" 00001 "'として返されます。

"" <>...文字列を結合します。この場合、を返します"000010307"

Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x] 1920年の日付のうち、回文と素数であるケースを返します。


2

Javascript187 177

前提:一致する4桁の年なし。2月29日から30日の間に一致する日はありません

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

それはこのように動作します:

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!

歴史:

  • 187から177:2月29日または30日に収まる主な回文の日付はないため、2月が30日であり、10文字を節約することができます。

ノート:

テストを通じて、4桁の年または2月29日または30日に該当する有効な一致がないことがわかりました。 31日しかない。


2

ジャワ10、329 327 320 318 312の 308 307 264バイト

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のおかげで-1バイト。

説明:

オンラインで試してください(注:プライムチェック部分はより効率的な分離方法に置き換えられましたが、それでも60秒後にタイムアウトし、最初の〜115回のパリンドロームプライム日付のみが出力されます)。
ローカル実行からの197のすべての出力のペーストビン。

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文字を節約するために(両方の文字列が同じ長さであることがわかっているため機能します)。それはそれほどではありません:-(
assylias

@assylias Smart、私はそれが好きです。ありがとう!そして、1バイトはそれほど多くはありませんが、それでも1バイトです。Codegolfは常に可能な限り短くすることであるため、すべてのバイトがカウントされます。:)
ケビンクルーイッセン

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へようこそ!私はVBAを知りませんが、いくつかの空白をゴルフで飛ばすことができるようです。
FantaC

私もVBAを本当に知りませんが、私DateStringは任意の変数名だと思うので、それを1文字に減らすことができるはずですよね?
マーティンエンダー

3
そして、「パリンドロームのプライムデート」の主要部分を見逃したと思います。
メルカトル

うるう年を計算するためのコードがあります(2月29日)
-RosLuP

5桁の年も欠落しており、Elseは必要ありません。
ウェイジュン周


0

Javascriptを234の 229バイト

少しかさばりますが、投稿してJSボールを転がします。どんな提案も歓迎します!

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

ゴルフをしていない:

// 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)
            }
}

使い方:

桁反転マジックは、主に実験に基づいています。
反転バージョンを得るために何を引くかを考え出すことから始めました。私は最後の2桁しか気にしませんでした。
それで、我々が取るならば、そのようnに見つけkてくださいn+k=flip(n)。以下のために10<n<20 k101で開始し、のために、しかし、9の刻みで増加しn<10、これは私が想定さ100であった。k10のすべてのジャンプのために増加し、いじるのビットの後、私はそれが正しかった考え出し。
したがって、k=100+9*n+n//10ここで//は整数除算を意味します。

したがって、が得られn+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)ます。

私はこれがどんな数字でも機能することを証明することも主張することもできませんが、ここで使用されている数字に対して正しい結果をもたらしました。

素数性テストについては、Kevin Cruijssenの答えを評価してください。私は少し短いバージョンを持っていましたが、私はそれを正しく得ることができませんでした:

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

月、日、および中間桁をループすることにより、パリンドロームテストをスキップしたためdDmMxMmDd、文字列を作成できます。ここDで、1日の最初の桁、d2番目の桁などです。

歴史

qの条件部分を取り除くことで5バイトを節約

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

バイト数をいじってごめんなさい。誤っていくつかのソフトタブで滑った。正しいはずです。
要素バインド

fの結果をのパラメーターとしてのみ使用qしているため、中間者を切り取って書き込みf=n=>''+n%10+(n/10|0)、qの結果は常に文字列として使用されるため、を書き込むことができますq=n=>n<10?'0'+n:n
ニール

0

APL NARS 626バイト、313文字

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

これは、50秒で見つかるものを、それ自体を停止するよりも印刷します(そうしないと、インタープリターのウィンドウを閉じずにプログラムを停止する方法がわからないため、テストをコピーして貼り付けるためにプログラムを停止できません)テスト:

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

0

ジュリア0.6、109バイト

リンクは次の2つの違いがある長いバージョンになります。

  1. PrimesパッケージはTIOでは利用できないため、手書き関数を使用して素数をチェックします。
  2. タイムアウトしないように、異なる日付範囲で繰り返します。
[s for s in Dates.format(Date(0,1,1):Date(100000,1,1),"YYYYmmdd") if Primes.isprime(parse(s))&&s==reverse(s)]

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.