Anda tahu apa itu palindrome , prime, dan kencan .
Tugas Anda adalah membuat daftar semua tanggal dalam 100 ribu tahun yang memenuhi ketiga karakteristik.
Jangan pikirkan apa pun selain angka, gunakan format berikut: YYYYMMDD dan YYYYYMMDD .
Tanggal antara 0000-01-01 dan 9999-12-31 harus dicetak sebagai tanggal 8 digit palindrom (Jika ada?) Dan tanggal antara 10000-01-01 dan 99999-12-31 harus dicetak sebagai palindrom 9 digit .
Tidak wajib mencantumkan tanggal dalam urutan kronologis.
Contoh bagian dari output yang valid.
Tiga tanggal 9 digit pertama palindromik prima:
...
100111001
100131001
100161001
...
Aturan
Celah standar berlaku.
02-29
hanya ada selama bertahun-tahun yang dapat dibagi 400 atau (habis dibagi 4 dan tidak habis dibagi 100).Jawaban:
Ruby ,
144141 byte (134 + 7 untuk-rprime
bendera)Disimpan 3 byte berkat benj2240 !
Cobalah online!
Algoritma:
Time
misalnya dengan diberikany
,m
,d
nilai-nilai. Jika objek waktu yang dihasilkan memiliki#day
nilai yang sama dengand
, maka itu adalah tanggal yang valid. Kalau tidak, itu akan menggeser tanggal (misalnya,Time.new 2018,2,30
kembali2018-03-02
).Loop dalam awalnya merupakan fungsi yang dipanggil untuk setiap elemen dalam
(?0..?9)
rentang, serta untuk string kosong.Karena string kosong tidak membuahkan hasil (tidak ada palindrom prime 8 digit yang valid), saya memutuskan untuk menghapusnya dan melakukan refactor ke versi ini.
sumber
t
variabel: TIOPython 2 ,
116107128122119 byteParuh kedua dari baris ke-4 terinspirasi oleh jawaban mxdsp di sini untuk pertanyaan golf lainnya .
Penjelasan
Fungsi hanya
g()
membutuhkan argumen untuk menginisialisasin
variabel menggunakan nilai standarnya. Nilai awal adalah angka ganjil yang sesingkat mungkin dan sebesar mungkin sementara masih kurang dari jawaban valid pertama 100111001.Ulangi hingga
n
mencapai akhir rentang tanggal 10 9 . Kenaikann
menurut 2.m
adalah bulan tanggaln
.Jika
n
tanggal yang valid, palindrome dan prime, cetak:0 < m < 13
memeriksa itum
adalah bulan yang valid.n % 100 < 31 + (m+m/8)%2
memeriksa bahwan
hari dalam bulan itu valid.(m+m/8)%2
menambahkan1
semua bulan dengan 31 hari. Penghargaan untuk itu berlaku untuk jawaban ArmanX . Tidak ada bilangan prima untuk 29-30 Februari.`n`[::-1] == `n`
. The backticks menguatn
.[::-1]
membalikkan string.2**n % n == 2
adalah tes primitif Fermat . Tes itu hanya probabilistik. Ada juga non-prima yang cocok. Tetapi tidak dalam kisaran angka yang kita lihat.sumber
APL (Dyalog Unicode) , 155 byte
Cobalah online!
Ini adalah Tradfn ( trad itional f unctio n ) yang mengambil satu argumen
arg = yyyymmdd
atauarg = yyyyymmdd
. Penggunaan adalahf arg
.Ini tidak akan menghasilkan apa pun ketika argumen dimulai
10000101
karena tidak menemukan tanggal palindrom utama dalam 60 detik.Berikut adalah pendekatan yang kurang golf yang akan menampilkan output contoh OP
( Cobalah Online! )
Perhatikan bahwa kedua kode sama persis sampai tepat sebelum memanggil fungsi secara rekursif untuk tanggal berikutnya. Sementara versi golf hanya menyebutnya sebagai
f arg+1
, kode yang kurang golf melompat dari hari31
ke hari01
dan dari bulan12
ke bulan01
, yang mempercepatnya sedikit.Bagaimana itu bekerja:
sumber
Python 3, 163 byte
Solusi cukup panjang (dan mungkin bisa diperbaiki), tetapi tidak menggunakan fungsi bawaan untuk pemeriksaan prime / date / palindrome. Versi yang agak tidak jernih untuk kejelasan:
Tanggal yang valid dihasilkan dengan memilih satu bulan dan satu hari. Seperti yang dikomentari sebelumnya, hanya ukuran 9 yang perlu dipertimbangkan. Perhatikan juga bahwa tahun kabisat tidak dipertimbangkan. Ini tidak diperlukan karena kebetulan kebetulan bahwa bilangan prima palindrome dengan panjang 9 yang berakhir pada 0229 tidak ada (anomali tanggal lainnya seperti 30 Februari 1712 dapat dibuang karena alasan yang sama).
Berikutnya digit tengah dipilih secara bebas, dan tes utama dilakukan. Karena tes prima harus sesingkat mungkin, sangat naif dan dengan demikian lambat. Menggunakan perpustakaan eksternal dapat menyelesaikan ini (dan menyimpan beberapa byte), tetapi seperti yang disebutkan sebelumnya saya tidak ingin menggunakan.
sumber
Bahasa Wolfram (Mathematica) 187 byte
Mungkin ada beberapa pengurangan ukuran yang bisa ditemukan. Penjelasan untuk mengikuti ...
Uji kasus
(* {"100111001", "100131001", "100161001"} *)
Penjelasan kode
DayRange[d@#,d@#2]
mengembalikan semua tanggal antara{10011, 10, 1}
dan{10017, 1, 1}
. Dalam hal ini, ia mengembalikan sekitar 5 tahun, 4 bulan tanggal (tepatnya 1920 tanggal). Tahun kabisat diperhitungkan.Tanggal dikembalikan dalam format standar Wolfram. Misalnya, tanggal pertama akan muncul sebagai
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `#[[1]] & /@
akan menghapus bagian tanggal, di setiap tanggal, yang menjadi perhatian kami. Dalam contoh,DateObject[List[1,3,7],"Day","Gregorian",-5.]
kembalikan tanggal yang disingkat{1,3,7}
,.t/@p[#3,2]}
atauToString/@Padleft[#3,2]
bantalan elemen ketiga, yaitu, 7 berdiri "untuk hari ke 7 bulan itu" sebagai"07"
. Padding serupa disediakan untuk simbol satu digit untuk bulan Maret, yaitu,3
dikembalikan sebagai"03"
.p[#, If[Length@# < 5, 4, 5]]
mengisi tahun dengan nol untuk mencapai panjang string 4 atau 5 digit. Dalam hal ini, Januari, yaitu1
, dikembalikan sebagai `" 00001 "'."" <>...
bergabung dengan string. Dalam hal ini, ia kembali"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
mengembalikan kasus-kasus itu, di antara tahun 1920, yang merupakan palindrom dan bilangan prima.sumber
Javascript ,
187177Asumsi: tidak ada pencocokan 4 digit tahun; tidak ada hari yang cocok di bulan Februari antara 29-30
Ini berfungsi seperti ini:
Sejarah:
Catatan:
Melalui pengujian, saya menemukan tidak ada kecocokan yang valid yaitu 4 digit tahun atau jatuh pada 29 atau 30 Februari. Sayangnya, hanya demi kode, lima hasil (tidak valid) tepat jatuh pada tanggal 31 dari berbagai bulan yang hanya memiliki 31 hari.
sumber
Java 10,
329327320318312308307264 byte-1 byte terima kasih kepada @assylias .
Penjelasan:
Cobalah secara online (catatan: bagian pengecekan utama telah diganti dengan metode terpisah yang lebih efisien, meskipun dengan itu masih habis setelah 60 detik, hanya mengeluarkan tanggal utama ~ 115 palindromik utama).
Pastebin dari ke-197 keluaran dari proses lokal.
sumber
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
untuk menyimpan 1 karakter (berfungsi karena kita tahu kedua string memiliki panjang yang sama). Itu tidak banyak :-(VBA, 347
sumber
DateString
ini adalah nama variabel yang berubah-ubah, jadi Anda harus dapat menguranginya menjadi satu karakter, bukan?Bersih ,
262... 213 byteCobalah online!
sumber
Javascript ,
234229 byteAgak tebal, tapi mempostingnya untuk membuat bola JS bergulir. Ada saran!
Tidak Disatukan:
Bagaimana itu bekerja:
Digit flipping magic sebagian besar didasarkan pada percobaan.
Saya mulai dengan mencari tahu nomor apa yang harus dikurangi untuk mendapatkan versi terbalik. Saya hanya peduli dengan dua digit terakhir.
Jadi, jika kita ambil
n
, temukank
itun+k=flip(n)
. Untuk10<n<20
k
mulai dari 101 dan meningkat secara bertahap 9. Namun, untukn<10
, ini adalah 100. Saya mengasumsikank
meningkat untuk setiap lompatan 10, dan setelah sedikit mengutak-atik saya pikir itu benar.Begitu,
k=100+9*n+n//10
mana // berarti pembagian integer.Jadi, kita dapatkan
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.Saya tidak dapat membuktikan, juga tidak mengklaim bahwa ini berfungsi untuk nomor apa pun, tetapi ini menghasilkan hasil yang benar untuk nomor yang digunakan di sini.
Untuk tes primality, berikan penghargaan untuk jawaban Kevin Cruijssen . Saya memiliki versi yang sedikit lebih pendek, tetapi saya tidak dapat melakukannya dengan benar:
Saya melewatkan tes palindrome, dengan memutar selama berbulan-bulan, berhari-hari, dan digit tengah sehingga saya dapat membangun string
dDmMxMmDd
, di manaD
digit pertama hari itu,d
adalah yang kedua, dll.Sejarah
Disimpan 5 byte dengan menyingkirkan bagian bersyarat dari q
sumber
f
hasil sebagai parameterq
, jadi hilangkan perantara dan tulisf=n=>''+n%10+(n/10|0)
, dan hasil q selalu digunakan sebagai string, sehingga Anda dapat menulisq=n=>n<10?'0'+n:n
.APL NARS 626 byte, 313 karakter
cetak ini menemukan apa dalam 50 detik, daripada berhenti sendiri (karena kalau tidak saya tidak dapat menghentikan program untuk menyalin paste tes, karena saya tidak tahu bagaimana menghentikan program tanpa menutup jendela penerjemah) tes:
sumber
Julia 0,6 , 109 byte
Tautan menuju ke versi yang lebih panjang dengan dua perbedaan:
Cobalah online!
sumber