これはどれくらい前ですか。


9

これはどれくらい前ですか。

ルール

  • 各提出物は完全なプログラムでなければなりません。
  • プログラムは入力を2つのカンマ区切りの日付形式YYYY-MM-DDで受け取り、2 番目の日付から経過した日数を、今日が最初の日付であるかのようにSTDOUTに出力する必要があります(2番目の日付が将来の場合は、負の数)に加えて、オプションの末尾の改行のみ。両方の日付がグレゴリオ暦であると想定します。
  • プログラムはSTDERRに何も書き込まないでください。

    提出物をテストできるように、通訳が必要です。

  • 送信は、適切な(既存の)エンコーディングでバイト単位でスコアリングされます。通常(必ずというわけではありません)はUTF-8です。Foldersのような一部の言語は、スコアを付けるのが少し難しいです。疑問がある場合は、Metaで質問してください。
  • これはので、最短のコードが勝ちます

入力:

2015-12-03、2015-12-01

出力:

2

入力:

2015-12-03、2014-12-01

出力:

367

入力:

2015-12-03、2013-12-03

出力:

730

スニペット

この投稿の下部にあるスタックスニペットは、a)リーダーボードとして、b)言語ごとの受賞者のリストとして、回答からカタログを生成します。

回答が確実に表示されるようにするには、次のMarkdownテンプレートを使用して、見出しから回答を始めてください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを向上させる場合、古いスコアを打ち消すことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数値を含めたい場合(たとえば、スコアが2つのファイルの合計である場合、またはインタープリターフラグのペナルティを個別にリストしたい場合)、実際のスコアがヘッダーの最後の数値であることを確認してください。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=65989,OVERRIDE_USER=46167;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>



1
外部ライブラリの使用は許可されていますか?特定のエコシステムに共通しているが、標準ライブラリの一部ではないものはどれですか?(たとえば、技術的には外部ライブラリですが、JDKの日付APIを使用するのではなく、代わりにJodaTimeを使用しています)。
Ruslan

私のタイムゾーンでは、夏時間のために2015-11-01T00:00:00と2015-11-02T00:00:00の差はわずか0.96日(23時間)だったので、すべてがUTCを使用すると想定しています。端数の端数の丸めについては何も言及しなかったので、質問でこれを明確にすることをお勧めします。(多くの日時ライブラリはデフォルトで現地時間を使用すると思います。)
ThisSuitIsBlackNot

1
うるう年の場合はどうなりますか?
TheCoffeeCup

@TheCoffeeCup処理する必要があります
ev3commander

回答:


1

TeaScript、24バイト

((a=D.parse)×-a(y©/864e5

を使用Date.parseして日付を解析し、差を取得して除算します。

オンラインでお試しください

説明とゴルフ

((a=D.parse)(x)-a(y))/864e5

               // Implicit: x is first date
               // y is second date
(
 (a=D.parse)   // Assign Date.parse to 'a'
 (x)           // Run Date.parse with first date
 -a(y)         // Subtract Date.parse run with second date
)/864e5        // Divide by 86,400,000

13

Bash + GNUユーティリティ、37

tr , \\n|date -f- +%s|dc -e??-86400/p

trコンマを改行に置き換えます。 date改行で区切られた日付を読み取り、渡された日付が表すUnixエポックからの秒数を出力します。その後、これらの数値はdcスタックに入れられます。次に、単純な減算と除算(24 * 60 * 60)の問題です。この場合、主にsubraction-before-divisionに括弧が必要ないため、dcスタックベースのRPN算術評価はbcor bash よりも優れて$( )います。

STDINを介した入力:

$ echo 2015-12-3,2015-12-1 | ./longago.sh
2
$ echo 2015-12-3,2014-12-1 | ./longago.sh
367
$ echo 2015-12-3,2013-12-3 | ./longago.sh
730
$ 

4

ジュリア、67バイト

print(Int(-diff(map(i->Date(i,"y-m-d"),split(readline(),",")))[1]))

非ゴルフ:

# Read a line from STDIN
r = readline()

# Split it into two character dates
s = split(r, ",")

# Convert each to a Date object
d = map(i -> Date(i, "y-m-d"), s)

# Compute the difference in dates (first-second)
f = diff(d)[1]

# Convert the Base.Date.Day object to an integer
# Negate to get second-first
i = Int(-f)

# Print to STDOUT
print(i)

代わりに-diff(d)[1]使用-(d...)して、数バイトを節約できます。ちなみにジュリアのバージョンは何ですか?1.2では、明示的にインポートする必要がDatesあり、このように日数を整数に変換することもできません。
Simeon Schaub

この回答は2015年に投稿されたため、遅くともJulia 0.3または0.4でした。
Alex A.

4

スカラ、166の 139 120 116 92バイト

print(args(0).replace('-','/').split(",").map(java.util.Date.parse(_)/86400000).reduce(_-_))

使用法: scala [source filename].scala [date1],[date2]

注:3番目のバージョン(120バイト)以降では、非推奨のAPIを使用しています。それでもコンパイルして正常に動作します。 注2:すばらしいアドバイスを下のコメント投稿者に感謝します!


末尾の改行はオプションなので、のprint代わりに使用できますprintln
Marth

Object A extends App{...}パーツを削除して名前を付けて保存a.scalascala a.scala 2015-12-3,2015-12-1、;)で実行することができます
Martijn

@MartijnR Genius!ありがとう!!
Ruslan

3

Ruby、69 66 65 57 55バイト

a=->l{Time.gm *$F[l,3]};p (a[0]-a[3]).div 86400

47バイト+コマンドラインオプションの8バイト。Dane Andersonのおかげで、2バイト節約できました。

57バイト

p (Time.gm(*$F[0,3])-Time.gm(*$F[3,3])).div 86400

49バイトのコード+コマンドラインオプションの8バイト。manatworkの提案により8バイトを節約しました。

65バイト

a,b=gets.split(?,).map{|i|Time.gm *i.split(?-)};p (a-b).div 86400

66バイト

a,b=gets.split(?,).map{|i|Time.new *i.split(?-)};p (a-b).div 86400

69バイト

a,b=gets.split(',').map{|i|Time.new *i.split('-')};p (a-b).to_i/86400

オンラインでテストする

未ゴルフ

a = -> l {
  Time.gm *$F[l,3]       # Anonymous method to parse time
}
p (a[0]-a[3]).div 86400  # Subtracts two times and divides by 24*60*60

使用法:

ruby -naF[,-] -e 'a=->l{Time.gm *$F[l,3]};p (a[0]-a[3]).div 86400' <<< '2015-12-3,2013-12-3'

=> 730

3つの小さな文字:','?,'-'?-to_i/div
manatwork

一部のコマンドラインオプションを使用すると、さらに削減される可能性がありますruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'
manatwork

@manatworkそれが許可されているかどうかはわかりません。
Vasu Adari、2015

ルールは、コードを渡すために必要な最小限の必要性(Rubyの場合-e)は無料であり、他のすべてはカウントに含まれる必要があるということです。正確には何がすべてなのかについては、さまざまな意見があります。たとえば、一部のメンバーには、オプションの区切りの空白文字とパラメーター値を囲む引用符が含まれます。私の見解では、インタプリタに実際に渡されるものだけをカウントする必要があります。シェル構文で必要な余分な文字はカウントされません。しかし、オプションの使用を禁止するために発せられた声を覚えることはできません。
manatwork

2
ほとんどない言及する価値がありますが、procのに繰り返しコードを移動することでバイトを剃ることができます:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
アレクシス・アンダーセン

2

Japt、41バイト

A=K$.parse)(($B=Uq',  g0)-$A($Bg1))/864e5

これまでのところ、これは、すべての変数$と括弧がバイト数を本当に殺すので、私が得ることができる最高のものです。

オンラインでお試しください

説明

             // Implicit: U is set to input
A=K$.parse)  // Set variable A to date parsing function
(($B=Uq',    // Set B to input split by ,
  g0)        // Get the first date and parse
-            // Subtract...
$A(          // Parse this date...
   $Bg1      // Get's second date
))/864e5     // Divides by 86,400,000

2

MATLAB、41 31バイト

disp(-diff(datenum(input(''))))
{'2015-12-03', '2014-12-22'}
   346  

入力はコンマ区切りのセル配列でなければなりません。datenum入力セルをタイムスタンプ付きの2x1数値配列に変換します。diff2つの違いをとります。


古いソリューション、41バイト

disp(-diff(datenum(strsplit(input('')))))

入力はカンマ区切りの文字列でなければなりません:

disp(-diff(datenum(strsplit(input('')))))
'2015-12-03, 2014-12-22'
   346

奇妙なプログラミング方法。これは、データ型間のMATLABの暗黙的なキャストのために機能します。

からの出力strsplit(input(''))は文字列のセルです。diffセルで使用することはできませんが、幸い、datenum機能diffします。実際には、セル入力を2x1数値配列にキャストして戻し、使用できるようにします。

strsplitでは区切り記号をすべて指定できますが、デフォルトはカンマです。また、へのデフォルトの入力datenumは形式ですyyyy-mm-dd。これらの理由により、datenum(s、 'yyyy-mm-dd')などの多くの指定は避けられ、バイトの全体が節約されます。

レコードの場合、関数を使用できれば21バイトになります。

@(s)-diff(datenum(s))

1
どうすればdiffを忘れることができますか?基本的には同じですが、代わりにdatenumを2回呼び出すため、送信を削除するだけでもよいでしょう。
slvrbld

1
入力フォーマットの素晴らしい選択!
Luis Mendo

2

JavaScript ES6、63バイト

クロムでテストされています。

alert(((p=Date.parse)((a=prompt().split`,`)[0])-p(a[1]))/864e5)

質問からカンマ区切り
ev3commander

@ ev3commanderはい、修正しました。
SuperJedi224

2
@ SuperJedi224ええと。Firefoxは無効な日付を示しますが、Chromeは問題なく処理されます。
Conor O'Brien

5
これはChromeでしか機能しないようなので、このChrome固有のものにマークを付けます。私は準拠した方法を使用することだと思うDate.parseと置き換える-/
Downgoat

1
ほとんどのブラウザは、パッド入りそうする日付が必要と2015-12-03動作しますが2015-12-3(クロームを除く)ではないでしょう。質問は日付がフォーマットになると言っているYYYY-MM-DDので、入力が実際に続いた場合、ブラウザー間の互換性がありますが、例ではそうではないようです。とにかく、あなたが使用できるDate.parse代わりのnew Date2バイト節約するために:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP、63 64 77バイト

従来のアプローチはOOPのアプローチよりも短いことがわかりました。

$x=fgetcsv(STDIN);$s=strtotime;echo($s($x[0])-$s($x[1]))/86400;

からカンマ区切りの文字列を読み取りますSTDIN


単純なOOP方法(77バイト):

$x=fgetcsv(STDIN);echo(new DateTime($x[0]))->diff(new DateTime($x[1]))->days;

編集

  • 代わりにを使用して13バイトを節約しましたstrtotimeDateTime
  • 変数に格納することで1バイトを節約しstrtotimeました。Blackholeに感謝します。

-3バイト:割り当てを括弧内の最初の使用法に移動します(それぞれ-1バイト)。の<?=代わりに使用できますecho
タイタス


1

psql、75バイト

(74文字のコード+ 1文字のコマンドラインオプション)

\prompt i
select split_part(:'i',',',1)::date-split_part(:'i',',',2)::date

psqlPostgreSQLのインタラクティブターミナルです。「すべての提出物は完全なプログラムでなければなりません。」を尊重する ルール、コードは入力自体を読み取ります。

サンプルの実行:

bash-4.3$ psql -tf how-long-was-this.sql <<< '2015-12-3,2013-12-3'
      730

1

MATL、5バイト

iPYOd

私が使用した以外これは、StewieGriffinの答えと同じであるflip、その後diffのではなくdiff、結果を否定します。

対応するMatlab関数を含む完全な説明:

i   %// input(''), get input
P   %// flip, flips the array
YO  %// datenum, converts date string into an integer
d   %// diff, finds the difference between dates

2
注:MATLは12月12日にリリースされただけですが、このチャレンジが投稿された後、リリースされたコンパイラとほぼ同じプレリリースMATLコンパイラを使用して12月9日にこの回答を思いつきました。このコードは同じです。
デビッド

2
また、これは決して人気のあるAppleポータブルミュージックデバイスの推奨ではありません:P
David

1
私は関数に使用oする必要があったdatenum:-D
Luis Mendo

それはすごかったでしょう!
デビッド

1
@ ev3commander PPCGのほとんどの回答は他の回答と同じです。特に、このような場合は4つのコマンドで十分です。
デビッド

1

PowerShell v2 +、50 44バイト

$a,$b=$args-split','|%{date $_};($a-$b).Days

入力引数を文字列として受け取り、コンマで分割し、組み込みのエイリアスdateshortを介して配列をパイプ処理してGet-Date、文字列を.NET日時形式に変換します。これら二つの日付はその後に同時に保存されます$a$b。次に、オーバーロードされた減算演算子を使用して、最初の演算子から2番目の演算子を減算し、その演算子を出力し.Daysます。

TessellatingHecklerのおかげで、6バイトでゴルフしました。

PowerShellの、のFOSS実装するので、それは、利用可能なオンライン通訳を持っていないよう技術的には、非競合パッシュは、PowerShellのV0.5の周りにあります。-split複雑な.NET日付機能はもちろん、まだサポートしていません。



0

ジョルフ、33バイト

Chromeでのみ機能します。競合しない、言語の更新が日付の質問を更新するため。後で、より完全な説明を追加します。

$S=$viGi', mDN~DH r}/m4SmeP"864"5

"説明"

$S=$viGi', mDN~DH r}
$S=$                 sets S equal to
    viGi',           take string input and reassign it to the comma-split input
           mD      } map with this function 
             N~DH r  return the time of the date of H (element)

/m4SmeP"864"5
/             divide
 m4S           subtraction applied to S (S[0] - S[1])
    meP"864"5  and 864 * 10 ^ 5 (thanks to Super Jedi for his nice constant)
              implicit output

ヘッダーに「競合しない」を入れてみませんか?
ev3commander 2015

0

MATLAB、59バイト

s=strsplit(input(''),',');disp(datenum(s{1})-datenum(s{2}))

非常に単純なアプローチ:入力はコマンドウィンドウから文字列として指定する必要があります。次に、入力文字列が分割され、日付間の日数(およびその他のもの)がシリアル日付番号から計算されます。しかし、datenumを2回呼び出す必要を回避する方法があると確信しています...


0

Pythonの2、109の、113バイト

import datetime as d 
j=[d.date(*[int(k) for k in g.split('-')]) for g in raw_input().split(',')]
print j[0]-j[1]

0

T-SQL + SQLCMD、51バイト

PRINT DATEDIFF(D,RIGHT('$(i)',10),LEFT('$(i)',10))

SQL Server 2008R2でテスト済み。$(i)は、コマンドライン引数として提供される入力に置き換えられます。

サンプルの実行:

sqlcmd -i script.sql -v i="2015-12-08,2016-01-01"
-24

0

Mathematica、61バイト

Print@First[#-#2&@@DateObject/@InputString[]~StringSplit~","]

基本的な日付減算。


0

Perl、91 86 + npフラグ用に2、88バイト

Use Date :: Calc qw(Delta_Days);($ a、$ b)= split(/、/); $ _ = Delta_Days(split(/-/、$ b)、split(/-/、$ a))

use Date::Parse;$_=str2time((split(/,/,$_))[0])-str2time((split(/,/,$_))[1]);$_/=86400

$ echo 2015-12-3,2015-12-1 | perl -npe 'use Date::Parse;$_=str2time((split(/,/,$_))[0])-str2time((split(/,/,$_))[1]);$_/=86400'
2

0

jq、50バイト

(49文字のコード+ 1文字のコマンドラインオプション)

./","|map(.+"T0:0:0Z"|fromdate)|(.[0]-.[1])/86400

サンプルの実行:

bash-4.3$ ~/bin/jq -R './","|map(.+"T0:0:0Z"|fromdate)|(.[0]-.[1])/86400' <<< '2015-12-3,2013-12-3'
730

オンラインテスト-RURLのパススルーはサポートされていないため、入力は文字列 "2015-12-3,2013-12-3"として渡されます。)


0

Mathematica、56バイト

Print@#&@@-DateDifference@@InputString[]~StringSplit~","

ほとんどの(すべて?)日付関数は、文字列入力を日付に自動的に解析しようとします。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.