Jangan bilang siapa-siapa, tapi saya sudah mencambuk mesin perjalanan waktu paman saya! Paman saya terobsesi dengan bilangan prima, dan itu menunjukkan di mesin - ia telah memprogramnya sehingga hanya bisa pergi ke tanggal yang jumlah bilangan prima.
Jadi tidak bisa pergi ke 1947-08-15
karena 1947 + 8 + 15 = 1970, yang bukan bilangan prima. Hal bisa pergi ke 1947-07-25
, karena 1947 + 7 + 25 = 1979, yang merupakan perdana. Jadi jika saya ingin kembali menonton perayaan kemerdekaan India, sepertinya saya harus pergi beberapa minggu sebelumnya dan menunggu 20 hari itu.
Saya memiliki beberapa kencan lain yang ingin saya tuju, dan saya juga harus pergi ke kencan sebelumnya (atau jika saya beruntung, sama dengan) tanggal target saya, yang meringkas ke nomor utama. Tapi saya tidak sabar, dan tidak ingin menunggu terlalu lama - jadi saya ingin mencari tanggal yang bisa saya gunakan yang paling dekat dengan tanggal target saya.
Dapatkah Anda menulis saya sebuah program yang mengambil tanggal target saya dan memberi saya tanggal yang harus saya masukkan ke mesin waktu - tanggal terdekat sebelum atau sama dengan tanggal yang diberikan yang bagian-bagiannya menambahkan hingga bilangan prima?
(Untuk tantangan ini, kami menggunakan proleptik Gregorian yang - yang berarti kami menggunakan kalender Gregorian saat ini bahkan untuk periode ketika orang-orang saat itu menggunakan kalender Julian yang lebih tua.)
Memasukkan
- Kencan
- idealnya, setiap tanggal di Era Saat Ini (AD); praktis, apa pun bagian dari bahasa Anda yang secara alami dapat menangani
- dalam format tunggal yang dapat dibaca manusia⁺ yang Anda suka
Keluaran
- Tanggal yang paling dekat dengan tanggal input, yang kurang dari atau sama dengan input dan yang tanggal + bulan + tahun jumlah hingga bilangan prima.
- dalam format tunggal yang dapat dibaca manusia⁺ yang Anda suka
⁺: "dapat dibaca manusia" seperti pada hari, bulan dan tahun yang secara terpisah dijabarkan, dalam urutan apa pun
Uji kasus
1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01
(Terima kasih kepada @Shaggy, @PeterTaylor, dan @Arnauld untuk bantuannya.)
Fri Jul 25 02:46:39 CEST 1947
)Jawaban:
Merah , 87 byte
Cobalah online!
Lebih mudah dibaca:
sumber
JavaScript (Node.js) , 94 byte
Mengambil input sebagai 3 bilangan bulat dalam sintaks currying
(year)(month)(day)
. Mengembalikan string yang dipisahkan dengan tanda hubung dengan tanda hubung terkemuka.Cobalah online!
Bagaimana?
Kami pertama kali mengkonversi tanggal ke format JSON
yyyy-mm-ddT00:00:00.000Z
( ISO 8601 ), membaginya pada'T'
, hanya menyimpan bagian kiri dan menambahkan tanda hubung utama, yang memberi-yyyy-mm-dd
.Ungkapan ini s sekarang bisa
eval()
'uated untuk mendapatkan sebaliknya n dari jumlah tahun + bulan + hari .Kami menggunakan fungsi helper P () untuk menguji apakah -n adalah prima (dalam hal ini mengembalikan 0 ). Jika ya, kami mengembalikan s . Kalau tidak, kami coba lagi dengan hari sebelumnya.
sumber
Python 2 ,
130127 byteMasukan adalah
year, month, day
.-3 byte terima kasih kepada Kevin Cruijssen .
Cobalah online!
sumber
Java 8,
144128 bytesTry it online.
java.time.LocalDate
class has been an improvement in comparison to the oldjava.util.Date
, but why did they had to make those names longer (getMonthValue
andgetDayOfMonth
instead ofgetMonth
andgetDay
).. >.>Explanation:
sumber
Ruby, 94 bytes
Try it online!
Takes a single Date input, and returns a string in the ISO 8601 format (
YYYY-MM-DD
).It uses Ruby's prime module. If that's not allowed, or frowned upon, then for two bytes more I present this abomination:
Ruby, 97 bytes
Try it online!
It uses a check for a number being prime from this stackoverflow answer. I have no idea how this works, it looks a bit like witchcraft. Same input as above, and same output.
sumber
d
and the space after theif
though, so you can shave off 3 bytes from your first answer removing those. TIO link?x*n !~ /^x?$|^(xx+?)\1+$/
= to check if n is prime, make a string of n 'x's, check that it's not 0 or 1 x's (which are not prime), and that it doesn't match any 2 or more x's repeating itself (matching^(xxxxx)\1+$
would mean n is divisible by 5). It abuses the regex engine's backtracking to do our looping for us - it's brilliant, it's monstrous, and animal sacrifice was probably involved in its discovery.Ruby,
5753 bytesTry it online!
Not my idea - stolen from the "abomination" by IMP1
Original idea:
Ruby, 59 bytes
Try it online!
sumber
8e4
instead work?R, 117 bytes
Try it online!
sumber
F#,
134133 bytes-1 byte thanks to from sundar.
Try it online!
Total the day, month and year and see if it's prime. If it is, return that date. If not, decrement the date by 1 day and try again.
sumber
-1.0
as-1.
, in the AddDays call.PowerShell,
10590 bytesTry it online!
Thanks to sundar for -13 bytes.
Takes input as a
DateTime
2018-06-20
and saves it into$a
. Then we're in afor
loop. Each iteration, we're taking$a
-f
ormatted likeyyyy+MM+dd
(i.e., the current date we're on separated by+
signs) added together with|iex
(similar toeval
), string-multiplying that with1
s to form a unary number, and using a prime-checking regex to determine if the current date is prime or not. If it is not prime, we.AddDays(-1)
to go backwards a day and continue the loop. If it is prime, we break out of the loop and place$a
onto the pipeline with implicit output.The resulting output is culture-dependent. On TIO, which uses
en-us
, the output is long-date format, which looks likeSaturday, July 1, 1319 12:00:00 AM
.sumber
0001-01-01
whose sum is 3). I took a crack at these changes here.Bash,
114108 bytesTry it online!
My first ever bash golf. Honestly, my first real bash program ever ... primality test taken from here.
This might sometimes fail if there is a timezone change, but TIO uses UTC, so there it should work.
sumber
@$
, memberikan kode kerja pada 110 byte .C (gcc) , 167 byte
Cobalah online!
Kehabisan
Fungsi anti-prime-checking. Karena tahun paling awal yang valid yang perlu kita tangani adalah 0001-01-01, jumlah terendah yang perlu kita khawatirkan adalah 3, sehingga pemeriksaan case khusus untuk n == 2 atau n <2 dicoret. r diatur ke nilai kebenaran jika n bukan bilangan prima. r tetap global, karena tidak harus mengembalikannya menghemat dua byte (
i=n;
untuk kembali vs,r
untuk memeriksa global). saya diatur ke 1 oleh pemanggil fungsi, untuk menyimpan 2 byte lainnya.Kami mengambil tanggal sebagai tiga bilangan bulat terpisah dan memulai loop utama, yang berlangsung sampai y + m + d adalah prima. Lalu kita sampai pada daging fungsi:
Mungkin tampak rapuh untuk menggunakan m dan y baik di tahun kabisat dan sebagai indeks string, ketika urutan evaluasi tidak ditentukan. Untungnya, kami hanya memeriksa tahun kabisat jika m == 2, yang tidak dapat terjadi pada saat yang sama dengan kami mengubah m dan y, karena itu hanya terjadi dari Januari hingga Desember, jadi tahun kabisat tidak pernah terganggu oleh urutan evaluasi.
Akhirnya, hasilnya dicetak ke STDOUT:
sumber
C # -
281239232 Charungolfed:
Membuat kode kurang efisien tetapi lebih kecil. Prime loop sekarang akan naik ke integer daripada root kuadrat. Ini juga akan memproses semua angka genap.
sumber
public
. Selain itu, karena sepertinya tidak diizinkan untuk mendapatkan input tanggal sebagai parameter panggilan, Anda dapat memilikiMain(string[]a)
dan kemudianDateTime.Parse(a[0])
MATL , 14 byte
Cobalah online!
Bergantian:
15 byte
Cobalah online!
sumber