이 날짜까지 얼마나 걸립니까?


11

아이디어는 다음과 같습니다. 현재 / 오늘 날짜 (함수가 호출 될 때)부터 인수로 제공된 날짜까지의 시간을 인쇄하는 함수를 작성하십시오.

가정 :

  • 입력 날짜는 항상 내일 또는 나중에입니다.
  • 입력 날짜는 앞으로 10 년을 넘지 않습니다.

규칙 :

  • 출력 형식은 "[z year (s)], [x month (s)], y 일-입력 날짜까지"형식이어야합니다. "
  • 출력 시간 프레임 (일 / 월 / 년)은 복수형이어야합니다. 즉 1 month, 아닙니다1 months
  • 입력 중 날짜 형식 일 수 있습니다 당신은 (- 2010 년 3 월 15, 2012 - 2012년 3월 15일을 3/15/12)을 선호한다.

예 : 프로그램이 2012 년 3 월 15 일에 실행되고 있다고 가정합니다.

  • 입력 날짜 3/20/12=5 days until 3/20/12
  • NOT4/16/12 = 날짜 입력1 month, 1 days until 3/20/12
  • 입력 날짜 2012.04.20=1 month, 5 days until 2012.04.20
  • NOT2012.04.20 = 날짜 입력36 days until 2012.04.20
  • 입력 날짜 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • 입력 날짜 3/15/13=1 year until 3/15/13

이것은 코드 골프이므로 가장 짧은 길이의 코드가 승리합니다.

마감일을 지키기 위해 다음과 같은 답변을 선택합니다.

2012 년 3 월 23 일!

(이것은 첫 번째 CG 질문이므로 내 질문의 모든 오류를 기꺼이 수정하겠습니다!)


3
Wolfram | 알파 10 문자 : now until <input time> : p
그리핀

3
@Griffin 4 문자 :now-<input time>
PhiNotPi

1
@PhiNotPi 잘 연주했습니다.
Griffin

2
"3/16/12까지 1 일"이라고해도 괜찮습니까?
MrZander

1
도약 예라와 함께 작업하는 방법? 10 년 후 2 일 오류가 발생합니다. 월은 얼마나 되나요?
Hauleth

답변:


3

R, 99 자

나는 그것이 일종의 부정 행위라는 것을 알고 있지만 R은 패키지에 관한 것이고 윤활제 는 이러한 종류의 작업에 매우 편리합니다!

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

용법:

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 자

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

용법:

p("11/03/2006");

날짜를 dd/mm/yyyy형식으로 취 합니다. 그리핀의 월 길이 계산 ( 다시 )을 사용했지만 우선 순위가 올바르게 작동하도록 추가 괄호를 붙여야했습니다. 또한 좀 더 읽기 쉽도록 줄 바꿈을 남겼습니다.


1

루비 (213)

어떤 형식 으로든 날짜를 Date.parse받아들입니다. 그냥 시도yyyy-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

몇 주를 얻으려면 다음을 추가하십시오.

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

그리고 [0,'week'],(월과 일 사이). 그때는 항상있을 것입니다< 7


어떤 루비 버전을 사용하고 있습니까 .... ruby1.9.2p0에서 코드를 실행하려고했지만 오류가 발생합니다 uninitialized constant Object::Date (NameError)... Rails Date클래스를 사용하고 있다고 생각합니다.
Rohit

@Rohit 1.9.3, Rails를 사용하지 않습니다. 날짜 rdoc
jsvnm

나는 문서를 더 일찍 보았다 .. 그러나 내가 받고있는 오류에 대해 혼란 스러웠다. 나는 왜이 오류가 발생하는지 이해할 수 없다. 나는 Windows 7 64 비트, ruby192p0에 있습니다
Rohit

@rohit은 193으로 시도 하시겠습니까?
jsvnm

1

VBA : 766 631 문자

문자열 생성 시간을 줄이는 데 도움을 준 mellamokb 에게 감사드립니다 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

나는 VBA다른 언어뿐만 아니라 코드 골프에 적합하지 않다는 것을 알고 있지만, 내가 전문가 (전문가 아님)입니다. :-)

이것은 나에게 재미있는 운동이었다!


1
그것은 VBA의 잘못이 아니며 코드에서 논리를 결합하는 좋은 방법 If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"이 있습니다. 예를 들어 다음과 같이 결합 할 수 있습니다a = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb 아주 좋아. 나는 그것을보고 다시 게시 할 것입니다!
Gaffi

내가 즉, 몇 가지 테스트 케이스에 문제가 있었다 1 year, 1 month, 1 day. 나는 대답에서 이것을 고쳤다. 실제로 더 짧은 코드를 만들었습니다!
Gaffi

그리고 업데이트를 게시 한 후 추가 20자를 절약 If v < w Then d = w - v:If v = w Then d = 0하기 If v <= w Then d = w - v위해 변경할 수 있음을 알았습니다 . 게시 할 내용이 크게 변경되면 답변을 업데이트하겠습니다.
Gaffi

배열을 사용하여이 작업을 더 잘 수행 할 수 있다고 생각합니다. 다른 모양을 취하고 다른 대답을 추가 할 수 있습니다 ...
Gaffi

1

자바 스크립트 (ES6), 125 바이트

Paolo의 답변 은 외부 라이브러리를 사용 했기 때문에 동일한 작업을 수행합니다. Node.js는 NPM 패키지와 모멘트 + HumanizeDuration 에 관한 모든 것이이 작업에 매우 편리합니다!

노드 환경

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

브라우저 환경

라이브러리는 전역 변수를 선언하므로 실제로는 조금 더 짧습니다 (102 바이트). 타사 JavaScript에로드하는 데 필요한 스크립트 태그를 포함해야하는지 확실하지 않으므로 공식적으로 노드 1을 계산합니다.

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

CoffeeScript, 125 바이트

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

1

PHP, 151 자

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

format ()이 달에서 며칠을 빼지 않기 때문에 복수가 누락되고 올바르게 계산되지 않습니다 ... PHP와 비슷한 솔루션을 가지고있었습니다.
powtac

이것은 내 PHP 솔루션이지만 여전히 이전에 언급 한 오류가 없습니다 echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');. 명령 줄에서 호출 할 때 길이는 92 자입니다.
powtac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.