Bao lâu cho đến ngày này?


11

Ý tưởng là thế này: Viết một hàm để in khoảng thời gian từ ngày này đến ngày hôm nay (tại thời điểm hàm được gọi) cho đến ngày được cung cấp dưới dạng đối số.

Giả định:

  • Ngày đầu vào sẽ luôn luôn là ngày mai hoặc muộn hơn, trong tương lai.
  • Ngày đầu vào sẽ không bao giờ quá 10 năm trong tương lai.

Quy tắc:

  • Đầu ra phải ở định dạng này: "[z năm (s)], [x tháng (s)], y ngày cho đến -Input Date-"
  • Khung thời gian đầu ra (ngày / tháng / năm) phải được chia số nhiều một cách chính xác. tức là 1 monthkhông1 months
  • Đầu vào có thể ở bất kỳ định dạng ngày nào bạn thích (3/15/12 - 15/03/2012 - 2012.03.15).

Ví dụ: Giả sử chương trình được chạy vào ngày 15 tháng 3 năm 2012:

  • Ngày đầu vào của 3/20/12=5 days until 3/20/12
  • KHÔNG nhập ngày của 4/16/12=1 month, 1 days until 3/20/12
  • Ngày đầu vào của 2012.04.20=1 month, 5 days until 2012.04.20
  • KHÔNG nhập ngày của 2012.04.20=36 days until 2012.04.20
  • Ngày đầu vào của 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • Ngày đầu vào của 3/15/13=1 year until 3/15/13

Đây là mã golf, vì vậy mã dài nhất sẽ thắng.

Tôi cho rằng để có thời hạn, tôi sẽ chọn một câu trả lời trên:

Ngày 23 tháng 3 năm 2012!

(Đây là câu hỏi CG đầu tiên của tôi, vì vậy tôi sẽ vui lòng sửa bất kỳ lỗi câu hỏi nào từ phía tôi!)


3
Wolfram | Alpha 10 ký tự now until <input time> :: p
Griffin

3
@Griffin 4 ký tự:now-<input time>
PhiNotPi

1
@PhiNotPi chơi tốt, thưa ông.
Griffin

2
Có ổn không khi nói "1 ngày cho đến ngày 16/12"?
MrZander

1
Làm thế nào để làm việc với bước nhảy vọt trong câu trả lời? Trong 10 năm thì sẽ có 2 ngày lỗi. Tháng này dài bao nhiêu
Hauleth

Câu trả lời:


3

R, 99 ký tự

Tôi biết đó là một loại gian lận, nhưng R là tất cả về các gói của nó và Lubridate rất thuận tiện cho loại nhiệm vụ này!

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

Sử dụng:

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

1

PHP, 315 ký tự

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

Sử dụng:

p("11/03/2006");

Có ngày trong một dd/mm/yyyyđịnh dạng. Tôi đã sử dụng phép tính độ dài tháng của Griffin ( một lần nữa ), mặc dù tôi phải dán thêm dấu ngoặc vào đó để làm cho quyền ưu tiên hoạt động chính xác. Tôi cũng đã để lại một số ngắt dòng để dễ đọc hơn một chút.


1

Hồng ngọc (213)

mất ngày ở bất kỳ định dạng Date.parsechấp nhận. Đã thử chỉ vớiyyyy-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

để cũng nhận được tuần, thêm:

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

[0,'week'],(giữa tháng và ngày). ngày sẽ luôn luôn< 7


Bạn đang sử dụng phiên bản ruby ​​nào .... Tôi đã thử chạy mã của bạn trên ruby1.9.2p0, nhưng nó gây ra lỗi cho tôi uninitialized constant Object::Date (NameError)... Tôi nghĩ rằng bạn đang sử dụng Datelớp Rails
Rohit

@Rohit 1.9.3, không sử dụng công cụ Rails. Ngày thứ bảy
jsvnm

Tôi đã xem tài liệu trước đó .. nhưng tôi đã nhầm lẫn về lỗi tôi đang gặp phải ... Tôi vẫn không thể hiểu tại sao tôi lại gặp phải lỗi này. Tôi đang ở trên windows 7 64-bit, ruby192p0
Rohit

@rohit thử với 193?
jsvnm

1

VBA: 766 631 Chars

Cảm ơn mellamokb đã giúp rút ngắn việc tạo chuỗi và 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

Tôi biết VBAchắc chắn không cho vay để viết mã golf cũng như một số ngôn ngữ khác, nhưng đó là điều tôi giỏi (không phải chuyên gia). :-)

Đây là một bài tập thú vị cho tôi!


1
Đó không phải là lỗi hoàn toàn của VBA, có một số cách hay để kết hợp logic trong mã của bạn :) Ví dụ: If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"có thể được kết hợp với nhau đểa = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb Rất tốt. Tôi sẽ xem xét điều đó và đăng lại!
Gaffi

Tôi đã có một vấn đề với một số trường hợp kiểm tra, cụ thể là 1 year, 1 month, 1 day. Tôi đã sửa điều này trong câu trả lời. Nó thực sự làm cho mã ngắn hơn!
Gaffi

Và sau khi đăng cập nhật, tôi thấy rằng tôi có thể thay đổi If v < w Then d = w - v:If v = w Then d = 0để If v <= w Then d = w - vtiết kiệm thêm 20 ký tự. Tôi sẽ cập nhật câu trả lời nếu tôi có một thay đổi quan trọng hơn để đăng.
Gaffi

Tôi tưởng tượng tôi có thể làm điều này tốt hơn với mảng ... Tôi sẽ xem xét lại và có thể thêm một câu trả lời khác ...
Gaffi

1

JavaScript (ES6), 125 byte

câu trả lời của Paolo đã sử dụng một thư viện bên ngoài, tôi sẽ làm như vậy. Node.js là tất cả về các gói NPM và khoảnh khắc + HumanizeDuration rất thuận tiện cho nhiệm vụ này!

Môi trường nút

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

Môi trường trình duyệt

Vì các thư viện khai báo các biến toàn cục, nên nó thực sự ngắn hơn một chút (102 byte). Không rõ liệu tôi có cần bao gồm các thẻ script cần để tải trong JavaScript của bên thứ ba hay không, vì vậy tôi sẽ đếm Node một cách chính thức.

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

CoffeeScript, cũng 125 byte

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

1

PHP, 151 ký tự

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

Nó thiếu số nhiều và không được tính chính xác, vì định dạng () không trừ các ngày trong tháng ... Tôi cũng có một giải pháp tương tự với PHP.
powtac

Đây là giải pháp PHP của tôi, nhưng vẫn thiếu lỗi đã đề cập trước đó: echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');92 ký tự của nó dài, khi được gọi trên dòng lệnh.
powtac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.