Berapa lama sampai tanggal ini?

11

Idenya adalah ini: Tulis fungsi untuk mencetak lamanya waktu dari tanggal sekarang / hari ini (pada saat fungsi dipanggil) sampai tanggal yang disediakan sebagai argumen.

Asumsi:

  • Tanggal input akan selalu besok atau lambat, di masa depan.
  • Tanggal input tidak akan pernah lebih dari 10 tahun di masa depan.

Aturan:

  • Output harus dalam format ini: "[z tahun (s)], [x bulan (s)], y hari hingga -Input Tanggal-"
  • Kerangka waktu keluaran (hari / bulan / tahun) harus jamak dengan benar. yaitu 1 monthtidak1 months
  • Masukan dapat dalam format tanggal mana saja yang Anda inginkan (15/3/12 - 15 Maret 2012 - 2012.03.15).

Contoh: Program asumsi dijalankan pada 15 Maret 2012:

  • Masukkan tanggal 3/20/12=5 days until 3/20/12
  • BUKAN tanggal input 4/16/12=1 month, 1 days until 3/20/12
  • Masukkan tanggal 2012.04.20=1 month, 5 days until 2012.04.20
  • BUKAN tanggal input 2012.04.20=36 days until 2012.04.20
  • Masukkan tanggal 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • Masukkan tanggal 3/15/13=1 year until 3/15/13

Ini kode golf, jadi kode panjang terpendek menang.

Saya kira demi memiliki tenggat waktu, saya akan memilih jawaban pada:

23 Maret 2012!

(Ini adalah pertanyaan CG pertama saya, jadi saya akan dengan senang hati memperbaiki kesalahan pertanyaan di pihak saya!)

Gaffi
sumber
3
Wolfram | Alpha 10 karakter now until <input time> :: p
Griffin
3
@Griffin 4 karakter:now-<input time>
PhiNotPi
1
@PhiNotPi dimainkan dengan baik, tuan baik.
Griffin
2
Apakah saya tetap bisa mengatakan "1 hari hingga 3/16/12"?
MrZander
1
Bagaimana cara bekerja dengan lompatan yeras sebagai jawaban? Dalam 10 tahun maka akan ada 2 hari kesalahan. Berapa bulan?
Hauleth

Jawaban:

3

R, 99 karakter

Saya tahu ini agak curang, tapi R adalah soal paketnya dan lubridate sangat nyaman untuk tugas semacam ini!

f=function(x){library(lubridate);cat(show(as.period(interval(mdy("3/15/2012"),mdy(x)))),"until",x)}

Pemakaian:

f("10/31/2017")
[1] 5 years, 7 months and 16 days 
5 years, 7 months and 16 days  until 10/31/2017
Paolo
sumber
1

PHP, 315 karakter

function p($z)
{
list($d,$m,$y)=explode("/",$z);
$d=$d-date("d");
$n=$m-1;
$m=$m-date("m")-($d<0);
$d=$d+($d<0)*($n>7^$n&1)+27+($n-2?3:($y%4?1:($y%100?2:($y%400?1:2))));
$y=$y-date("Y")-($m<0);
$s="s ";
echo ($y?$y." year".$s[$y<2]:"")." ".($m?$m." month".$s[$m<2]:"")." ".($d?$d." day".$s[$d<2]:"")." until ".$z;
}

Pemakaian:

p("11/03/2006");

Membawa tanggal dalam dd/mm/yyyyformat. Saya telah menggunakan perhitungan panjang bulan Griffin ( lagi ), meskipun saya harus menempelkan tanda kurung tambahan di dalamnya untuk membuat presedensi berfungsi dengan baik. Saya juga meninggalkan beberapa jeda baris untuk membuatnya sedikit lebih mudah dibaca.

Gareth
sumber
1

Ruby (213)

menerima tanggal dalam format apa pun yang Date.parsediterima. Sudah mencoba sajayyyy-mm-dd

def u s
t=Date.today
f=Date.parse s
[[0,'year'],[0,'month'],[0,'day']].map{|c,n| while t<f 
c+=1
t=t.send"next_#{n}"
end
c,t=c-1,t.send("prev_#{n}")if t>f
[c,n+(c>1??s:'')]*' 'if c>0}.compact*', '+' until '+s
end

untuk mendapatkan minggu, tambahkan:

['prev_','next_'].each{|n|Date.send(:define_method,n+'week'){send n+'day',7}}

dan [0,'week'],(antara bulan dan hari). hari akan selalu begitu< 7

jsvnm
sumber
versi ruby ​​mana yang Anda gunakan .... Saya mencoba menjalankan kode Anda di ruby1.9.2p0, tetapi itu memberi saya kesalahan uninitialized constant Object::Date (NameError)... Saya pikir Anda menggunakan Datekelas Rails
Rohit
@Rohit 1.9.3, tidak menggunakan barang Rails. Tanggal rdoc
jsvnm
Saya melihat dokumen sebelumnya .. tetapi bingung tentang kesalahan yang saya dapatkan ... Saya masih tidak dapat menemukan mengapa saya mendapatkan kesalahan ini. Saya di windows 7 64-bit, ruby192p0
Rohit
@rohit coba dengan 193?
jsvnm
1

VBA: 766 631 Chars

Terima kasih kepada mellamokb untuk membantu mempersingkat pembuatan string dan IIf.

Function k(i)
e=" month"
g="s"
n=Now()
r=Month(n)
s=Month(i)
t=DateSerial(Year(i),s,1)
u=DateSerial(Year(i),s-1,1)
v=Day(n)
w=Day(i)
x=DateSerial(Year(n),r,1)
d=t-u-v+w
For y=0 To 10
If Year(DateAdd("yyyy",-1*y,i))=Year(n) Then Exit For
Next
y=IIf(s=1,y-1,y)
z=s-r
z=IIf(z<0,z+12,z)
For m=0 To z
If Month(DateAdd("m",-1*m,i))=r Then Exit For
Next
d=IIf(v<=w,w-v,d)
m=IIf(v>w,m-1,m)
If y Then a=y & " year" & Left(g,y-1)
a=IIf((m Or d) And y,a & ",",a)
If m Then b=IIf(d,m & e & Left(g,m-1) & ",",m & e & Left(g,m-1))
If d Then c=IIf(d>1,d & " days",d & " day")
k=Trim(Trim(a & " " & b) & " " & c) & " until " & i & "."
End Function

Saya tahu VBApasti tidak meminjamkan kode golf dan juga beberapa bahasa lain, tapi itulah yang saya kuasai (bukan ahli). :-)

Ini merupakan latihan yang menyenangkan bagi saya!

Gaffi
sumber
1
Ini bukan sepenuhnya kesalahan VBA, ada beberapa cara yang baik untuk menggabungkan logika dalam kode Anda :) Misalnya, If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"dapat digabungkan menjadia = y & " year" & Left("s", y - 1) & ","
mellamokb
@ellamokb Sangat bagus. Saya akan melihatnya dan memposting ulang!
Gaffi
Aku punya masalah dengan beberapa uji kasus, yaitu 1 year, 1 month, 1 day. Saya telah mengoreksi ini dalam jawabannya. Ini sebenarnya dibuat untuk kode yang lebih pendek!
Gaffi
Dan setelah memposting pembaruan, saya melihat bahwa saya dapat mengubah If v < w Then d = w - v:If v = w Then d = 0ke If v <= w Then d = w - vuntuk penghematan 20 karakter tambahan. Saya akan memperbarui jawabannya jika saya memiliki perubahan yang lebih signifikan untuk dikirim.
Gaffi
Saya membayangkan saya bisa melakukan ini dengan lebih baik dengan array ... Saya akan melihat lagi dan mungkin menambahkan jawaban lain ...
Gaffi
1

JavaScript (ES6), 125 byte

Karena jawaban oleh Paolo menggunakan perpustakaan eksternal, saya akan melakukan hal yang sama. Node.js adalah semua tentang paket NPM dan saat ini + HumanizeDuration sangat nyaman untuk tugas ini!

Lingkungan simpul

m=require('moment'),f=d=>console.log(require('humanize-duration')(m(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

Lingkungan browser

Karena perpustakaan mendeklarasikan variabel global, itu sebenarnya sedikit lebih pendek (102 byte). Tidak jelas apakah saya harus menyertakan tag skrip yang diperlukan untuk memuat dalam JavaScript pihak ketiga, jadi saya akan menghitung Node yang resmi.

f=d=>console.log(humanizeDuration((m=moment)(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

CoffeeScript, juga 125 byte

f=(d)->console.log require('humanize-duration')((m=require 'moment')(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d
rink.attendant.6
sumber
1

PHP, 151 karakter

function p($z){$n=date_create(date('Y-m-d'));$d=date_create($z);$i=date_diff($n,$d);print($i->format('%R%y years, %m months, and %a days until '.$z));}
Conor
sumber
Itu hilang bentuk jamak dan tidak dihitung dengan benar, karena format () tidak mengurangi hari-hari dari bulan ... Saya punya solusi yang sama dengan PHP juga.
powtac
Ini adalah solusi PHP saya, tetapi masih kekurangan kesalahan yang disebutkan sebelumnya: echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');Panjangnya 92 karakter, saat dipanggil pada baris perintah.
powtac