この日付までどのくらいですか?


11

考え方は次のとおりです。現在/今日の日付(関数が呼び出された時点)から引数として指定された日付までの時間の長さを出力する関数を作成します。

仮定:

  • 入力日付は常に明日以降になります。
  • 入力日が10年を超えることはありません。

ルール:

  • 出力は次の形式である必要があります。「[z年]、[x月]、y日まで-入力日-」
  • 出力時間枠(日/月/年)は正しく複数形にする必要があります。すなわち1 month、ない1 months
  • 入力は、どの日付形式にすることができますが、( - 2012年3月15日- 2012年3月15日を3/15/12)を好みます。

例: プログラムが2012年3月15日に実行されると仮定します。

  • 入力日3/20/12=5 days until 3/20/12
  • NOTの入力日付4/16/12=1 month, 1 days until 3/20/12
  • 入力日2012.04.20=1 month, 5 days until 2012.04.20
  • NOTの入力日付2012.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 | Alpha 10文字::now until <input time> p
グリフィン

3
@Griffin 4文字:now-<input time>
PhiNotPi

1
@PhiNotPiよくプレイされました、良い先生。
グリフィン

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とても良い。それを見て、再投稿します!
ガフィ

いくつかのテストケース、つまり1 year1 monthに問題がありました1 day。私は答えでこれを修正しました。実際に短いコードを作成しました!
ガフィ

そして、更新を掲示した後、私は私が変更できることを確認If v < w Then d = w - v:If v = w Then d = 0If v <= w Then d = w - v、追加の20文字の節約のために。投稿する重要な変更がある場合は、回答を更新します。
ガフィ

配列でこれをもっとうまくできると思います...もう一度見て、おそらく別の答えを追加します
...-ガフィ

1

JavaScript(ES6)、125バイト

以来パオロによって答えが外部ライブラリを使用し、私は同じことを行うものとします。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.