这是多久以前的?


9

这是多久以前的?

规则

  • 每个提交必须是完整程序。
  • 程序必须在表单中以两个逗号分隔的日期作为输入YYYY-MM-DD,并将自第二个日期起经过的天数打印到STDOUT,就像今天是第一个日期一样(如果第二个日期在将来,则输出一个负数)加上可选的尾随换行符,仅此而已。假定两个日期都在公历中。
  • 该程序不得向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

摘录

这篇文章底部的Stack Snippet通过答案a)作为排行榜和b)作为每种语言的获奖者列表生成了目录。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## 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的Date API,而是使用JodaTime)。
罗斯兰

我假设一切都使用UTC,因为在我的时区中,由于夏令时,2015-11-01T00:00:00和2015-11-02T00:00:00之间的时差仅为〜0.96天(23小时)。您没有提到四舍五入天数,因此您可能需要在问题中加以澄清。(我认为许多日期时间库默认使用本地时间。)
ThisSuitIsBlackNotNot

1
leap年情况如何?
TheCoffeeCup

@TheCoffeeCup必须对其进行处理
ev3commander

Answers:


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)。在这种情况下,dc基于堆栈的RPN算术评估优于bc或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...)节省几个字节。顺便问一下,您正在使用哪种Julia版本?在1.2上,我必须显式导入,Dates而且我不能只将天转换成这样的整数。
Simeon Schaub,

该答案发布于2015年,因此最晚可能是Julia 0.3或0.4。
Alex A.

4

Scala中,166个 139 120 116 92字节

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

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

注意:第三个版本(120字节)及以后使用不推荐使用的API。它仍然可以编译并正常工作。 注意2:感谢以下评论者的出色建议!


由于尾随新行是可选的,因此您可以使用print代替println
马斯

您可以删除Object A extends App{...}零件并将其另存为a.scala并使用scala a.scala 2015-12-3,2015-12-1;)
Martijn 2015年

@MartijnR天才!谢谢!!
罗斯兰

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

三个小字符:','?,'-'?-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'我算起来是59个字符。
manatwork 2015年

@manatwork不知道是否允许。
Vasu Adari

规则是,传递代码(在Ruby的情况下-e)所需的最低限度是免费的,其他所有内容都必须包括在内。对于其他所有东西到底有什么不同的看法。例如,某些成员包括选项分隔符空格字符和参数值周围的引号。在我看来,仅应将实际传递给解释器的内容计算在内,而shell语法所需的额外字符则不应计算在内。但是不记得有人提出禁止使用选项的声音。
manatwork

2
几乎不值得一提,但是您可以通过将重复的代码移到proc中来剃掉一个字节:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen 2015年

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数字数组。diff需要两者之间的差异。


旧解决方案,41个字节

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

输入必须是逗号分隔的字符串:

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

奇怪的编程方式。由于MATLAB在数据类型之间进行隐式转换,因此该方法有效。

来自的输出strsplit(input(''))是一个字符串单元格。您不能diff在单元格上使用,但幸运的datenum是,它可以工作,并且实际上将单元格输入转换回2x1数字数组,从而diff可以使用。

您可以在中指定很多定界符strsplit,但逗号是默认定界符。另外,默认输入为datenum格式yyyy-mm-dd。由于这些原因,避免了很多规范,例如:datenum(s,'yyyy-mm-dd'),节省了大量字节。

为了记录,如果我可以使用一个函数,则将为21个字节:

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

1
我怎么能忘记diff ...也可以删除我的提交,因为它基本上是相同的,但是有2个对datenum的调用。
slvrbld

1
输入格式的绝佳选择!
Luis Mendo 2015年

2

Javascript ES6,63个字节

经过镀铬测试。

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

从问题中逗号分隔
ev3commander

@ ev3commander是的,我已经解决了。
SuperJedi224 2015年

2
@ SuperJedi224呵呵。Firefox给出无效日期,而chrome则愉快地进行。
Conor O'Brien 2015年

5
我将其标记为Chrome专用,因为它似乎只能在chrome中使用。我想兼容的方式是使用Date.parse和更换-/
Downgoat

1
大多数浏览器都要求填写日期,因此2015-12-03可以使用,但2015-12-3不能(在Chrome中除外)。问题确实表明日期将采用格式,YYYY-MM-DD因此,如果输入确实跟随日期,则它将是跨浏览器兼容的,但是示例似乎另有说明。无论如何,您可以使用Date.parse而不是new Date保存2个字节: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。感谢黑洞

-3个字节:将分配移动到括号中的第一个用法(每个-1个字节),可以使用<?=代替echo
泰特斯

1

VBA,69个字节

Function x(s)
g=Split(s, ",")
x=CDate(g(0))-CDate(g(1))
End Function

1

psql,75个字节

(74个字符的代码+ 1个字符的命令行选项)

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

psql是PostgreSQL的交互式终端。为了尊重“每次提交都必须是完整的程序。” 规则,代码将读取输入本身。

样品运行:

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

1

MATL,5个字节

iPYOd

这是一样的斯图威·格里芬的答案,但我用了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
注意:虽然仅在发布此挑战后才在12月12日发布MATL,但我在12月9日使用预发布的MATL编译器(与发布的编译器几乎相同)得出了这个答案,但是代码是相同的。
大卫

2
另外,这绝不是对流行的Apple便携式音乐设备的认可:P
David

1
我应该使用odatenum功能:-D
Luis Mendo 2015年

那真是太神奇了!
大卫

1
@ ev3commander在PPCG上的大多数答案与其他答案相同,尤其是在这样的情况下,其中4个命令就足够了。
大卫

1

PowerShell v2 +,50个 44字节

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

需要输入参数为字符串,将其分解的逗号,然后通过管道将通过阵列内置别名date简称Get-Date我们的字符串转换成.NET日期时间格式。然后将这两个日期同时存储到$a和中$b。然后,我们使用重载减法运算符从第一个中减去第二个,并输出第二个.Days

多亏了TessellatingHeckler,他打了6个字节。

技术上没有竞争,因为它没有可用的在线解释器,因为PowerShell的FOSS实现Pash围绕PowerShell v0.5。它尚不支持-split,更不用说复杂的.NET日期功能了。


1

Excel,25个字节

=LEFT(A1,10)-RIGHT(A1,10)

Excel自动将字符串作为日期处理。


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的需要。


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 + 2(用于np标志),88字节

使用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

在线测试-R不支持通过URL 传递-因此输入以字符串“ 2015-12-3,2013-12-3”传递。)


0

Mathematica,56个字节

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

大多数(全部?)日期函数将尝试将字符串输入自动解析为日期。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.