Tanggal berapa, dalam waktu Usenet?

9

September 1993 dikenal di Usenet sebagai September yang tidak pernah berakhir. Jadi, misalnya, hari pertanyaan ini diposting adalah Sabtu, September 8740, 1993.

Program atau fungsi Anda harus mengambil setiap tanggal Gregorian (dengan tahun positif) sebagai input dan mengembalikan tanggal yang sama dengan output jika sebelum September 1993 atau tanggal pada kalender September 1993 jika sesudahnya.

Anda dapat menerima YYYY-MM-DD, YYYY / MM / DD, MM / DD / YYYY, DD / MM / YYYY, D-Monthnameabbr-YYYY, atau format populer lainnya yang menggunakan keseluruhan tahun (sebagai lawan dari tahun modulo 100). Anda hanya perlu menerima satu format seperti itu, pilihan Anda. Format output harus cocok dengan format input.

Input sampel → output:

  • Minggu, 6 Agustus 2017 → Minggu, 8741 September 1993
  • Selasa, 28 Januari 1986 → Selasa, 28 Januari 1986

Atau:

  • 2017-08-06 → 1993-09-8741
  • 1986-01-28 → 1986-01-28

Demi jawaban yang lebih menarik, penggunaan fungsi bawaan yang dirancang untuk tujuan ini (seperti perintah UN * X sdate) dilarang. Selain itu dan pengecualian standar , ini adalah golf, jadi jawaban terpendek menang.

msh210
sumber
1
Anda maksud saya tidak dapat menggunakan DateDifference sehingga orang-orang di sini dapat mengomentari builtins Mathematica ???
J42161217
@ Jenny_mathy, DateDifference ini ? Saya kira Anda bisa menggunakannya, ya, mengapa tidak?
msh210

Jawaban:

2

JavaScript (ES6), 48 byte

f=
s=>(d=new Date(s)/864e5-8643|0)>9?'1993-09-'+d:s
<input size=10 oninput=o.textContent=/\d{4}(-\d\d){2}/.test(this.value)?f(this.value):``><pre id=o>

Berdasarkan algoritma @ Mr.Xcoder.

Neil
sumber
3

Python 3 , 109 byte

from datetime import*
i=input()
z=date(*map(int,i.split())).toordinal()-727806
print([i,'1993 09 %d'%z][z>9])

Cobalah online!

-59 byte terima kasih kepada notjagan
-3 byte terima kasih kepada tuan Xcoder
-2 byte terima kasih untuk officialaimm
-12 byte terima kasih kepada Jonathan Allan

HyperNeutrino
sumber
-54 byte.
notjagan
1
Atau lebih baik lagi, -59 byte.
notjagan
1
123 bytes (-62)
Mr. Xcoder
1
-8644+1bisa -8643..
officialaimm
1
@ Mr.Xcoder Perlu z>9dinyatakan sebaliknya, Anda kehilangan nol di depan pada hari itu.
Neil
2

Mathematica, 55 byte

If[(s=#&@@{1993,9}~DateDifference~#)>0,{1993,9,s+1},#]&

I / O

{2017, 8, 6} -> {1993, 9, 8741}
{1986, 1, 28} -> {1986, 1, 28}

-6 byte thanx ke pengguna202729

J42161217
sumber
Apakah Anda mempertimbangkan untuk menggeser tanda waktu {1993,9,1}kembali satu hari, sehingga untuk menghapus +1, menghemat 2 byte?
user202729
Terima kasih. Saya harus mencoba menjadi lebih sopan lain kali. Dan saya bahkan tidak tahu {1993,9,0}diizinkan.
user202729
1

Perl 5 , 102 + 16 (-MTime :: Lokal -F-) = 118 byte

$,='-';say @F=($t=timelocal(0,0,0,$F[2],$F[1]-1,$F[0]-1900)-749433599)>0?(1993,'09',31+int$t/86400):@F

Cobalah online!

Mengambil tanggal sebagai "YYYY-MM-DD"

Saya pikir saya melakukan hitungan tepat pada opsi baris perintah. Saya yakin seseorang akan memperbaiki saya jika saya tidak melakukannya.

Xcali
sumber
1

C # (.NET Core) , 107 byte

s=>{var d=(System.DateTime.Parse(s)-new System.DateTime(1993,8,31)).TotalDays;return d<1?s:"9/"+d+"/1993";}

Cobalah online!

Mengambil tanggal sebagai M / D / YYYY (angka di bawah 10 ditulis dengan hanya 1 digit). Ditulis dari ponsel saya menggunakan API dengan hati.

Charlie
sumber
1

Gaia , 78 byte

ℍZ¤∨4Ė
:'//d¦[1993₉31];>\{\‡:(…1993>↑¦365+¦¤ṇ↑∂K∂k,=;((<¤)-243]_ḥΣ“1993/09/”¤+}?

Cobalah online!

Penjelasan

Pertama, kami memiliki fungsi pembantu yang menentukan apakah satu tahun adalah tahun kabisat.

ℍ       100
 Z      Divmod year by 100, pushing the first 2 digits, then the second 2 digits
  ¤     Swap
   ∨    Logical OR, gives the left-most non-zero number
    4Ė  Check for divisibility by 4

Fungsi utama mengerjakan sisa pekerjaan:

:              Push two copies of the input.
'//            Split the top on on slashes.
d¦             Parse each section as a number.
[1993₉31]      Push the list [1993 9 31].
;>             Copy the date and check if its less than that.
\              If it is, delete the list and leave the input string on top.
{              Else:
 :(             Copy the date and get the year.
 …1993>         Get the range from 1993 to year-1.
 ↑¦365+¦        Map each to 365+(whether it's a leap year).
 ¤              Swap, bring the date back to the top.
 ṇ↑             Pull out the year and check if it's a leap year.
 ∂K∂k,          Push the pair of lists [[days in months in a leap year] [days in months]]
 =              Index the result of checking if the year is a leap year into the pair.
 ;((<           Get the first (month number - 1) elements.
 ¤              Swap, bring date back to the top.
 )              Get the day.
 -243           Push -243 (243 is the number of days between Jan 1 1993 and Sept 1 1993).
 ]              Wrap everything in a list.
 _              Flatten the list.
 ḥ              Remove the first element (the input string).
 Σ              Sum it.
 “1993/09/”¤+   Append the resulting number to "1993/09/".
}?             (end if)
               Implicitly display whatever is on top of the stack.
Kucing Bisnis
sumber