Há quanto tempo foi isso?


9

Há quanto tempo foi isso?

As regras

  • Cada envio deve ser um programa completo.
  • O programa deve receber a entrada como duas datas separadas por vírgula no formulário YYYY-MM-DDe imprimir o número de dias que passaram desde a segunda data para STDOUT como se hoje fosse a primeira data (se a segunda data seria no futuro, produza um número negativo) mais uma nova linha à direita opcional e nada mais. Suponha que as duas datas estejam no calendário gregoriano.
  • O programa não deve gravar nada no STDERR.

    Observe que deve haver um intérprete para que o envio possa ser testado.

  • As submissões são pontuadas em bytes , em uma codificação apropriada (pré-existente), geralmente (mas não necessariamente) em UTF-8. Alguns idiomas, como Pastas , são um pouco difíceis de classificar - em caso de dúvida, pergunte no Meta .
  • Isto é , então o código mais curto ganha

    Exemplos

Entrada:

2015-12-03,2015-12-01

Resultado:

2

Entrada:

2015-12-03,2014-12-01

Resultado:

367

Entrada:

2015-12-03,2013-12-03

Resultado:

730

O Snippet

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma tabela de classificação eb) como uma lista de vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

## [><>](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>



11
Temos permissão para usar bibliotecas externas? Aqueles que são comuns em um determinado ecossistema, mas não fazem parte da biblioteca padrão? (Por exemplo, ninguém usa as APIs de data do JDK, mas o JodaTime, embora seja tecnicamente uma biblioteca externa).
Ruslan

Presumo que tudo use o UTC, pois no meu fuso horário a diferença entre 2015-11-01T00: 00: 00 e 2015-11-02T00: 00: 00 foi de apenas 0,96 dias (23 horas) devido ao horário de verão. Você não mencionou nada sobre o arredondamento de dias fracionários; por isso, pode esclarecer isso na pergunta. (Eu acho que um monte de data e hora bibliotecas padrão para usando o horário local.)
ThisSuitIsBlackNot

11
Qual é o caso dos anos bissextos?
TheCoffeeCup 08/12/15

@TheCoffeeCup eles devem ser manipulados
ev3commander

Respostas:


1

TeaScript , 24 bytes

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

Usa Date.parsepara analisar a data, depois obtém a diferença e divide.

Experimente online

Explicação && Ungolfed

((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

Utilitários Bash + GNU, 37

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

trsubstitui a vírgula por uma nova linha. datelê as datas separadas da nova linha e gera o número de segundos desde a época do Unix que a data passada representa. Esses números são então colocados na dcpilha. Então é uma simples questão de subtração e divida por (24 * 60 * 60). Nesse caso, a dcavaliação aritmética da RPN baseada em pilha é melhor que bcou bash$( ) , principalmente porque a sub-ação antes da divisão não precisa de parênteses.

Entrada via 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

Julia, 67 bytes

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

Ungolfed:

# 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)

Em vez de -diff(d)[1]você pode usar -(d...)para salvar alguns bytes. Qual versão Julia você está usando? Na versão 1.2, tive que importar explicitamente Datese também não posso converter dias em números inteiros como esse.
Simeon Schaub

Esta resposta foi publicada em 2015, pelo que provavelmente era Julia 0.3 ou 0.4, o mais tardar.
Alex A.

4

Scala, 166 139 120 116 92 bytes

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

Uso: scala [source filename].scala [date1],[date2]

Nota: A terceira versão (120 bytes) e on usa uma API reprovada. Ainda compila e funciona bem. Nota2: Obrigado aos comentaristas abaixo pelos ótimos conselhos!


Como a nova linha à direita é opcional, você pode usar em printvez de println.
Marth

Você pode remover a Object A extends App{...}peça e salvá-la como a.scalae executá-la com scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Genius! Obrigado!!
Ruslan

3

Ruby, 69 66 65 57 55 bytes

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

47 bytes + 8 bytes para a opção de linha de comando. Graças a Dane Anderson, economizou 2 bytes.

57 bytes

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

Código de 49 bytes + 8 bytes para a opção de linha de comando. Economizou 8 bytes com a sugestão do manatwork.

65 bytes

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

66 bytes

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

69 bytes

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

Teste on-line

Ungolfed

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

Uso:

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

=> 730

Três pequenos caracteres: ','?,, '-'?-, to_i/div .
Manatwork

O uso de algumas opções de linha de comando pode reduzi-lo mais: ruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'tem 59 caracteres, conforme conto.
precisa saber é

@manatwork Não tenho certeza se isso é permitido.
Vasu Adari

A regra é que a necessidade mínima necessária para passar o código (no caso de Ruby -e) é gratuita, todo o resto precisa ser incluído na contagem. Existem opiniões diferentes sobre o que exatamente é isso tudo. Por exemplo, alguns membros incluem o caractere de espaço separador de opções e aspas em torno dos valores dos parâmetros. Na minha opinião, deve-se contar apenas o que realmente é passado ao intérprete, caracteres extras exigidos pela sintaxe do shell não. Mas não consigo lembrar de nenhuma voz levantada para impedir o uso de opções.
precisa saber é

2
quase não vale a pena mencionar, mas você pode raspar um byte movendo o código repetido para um proc:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen

2

Japonês , 41 bytes

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

Até agora, é o melhor que posso obter, pois todas as variáveis $e parênteses realmente matam a contagem de bytes.

Experimente online

Explicação

             // 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 bytes

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

A entrada deve ser uma matriz de células separada por vírgula. datenumconverte a célula de entrada em uma matriz numérica 2x1 com o carimbo de hora. diffleva a diferença entre os dois.


Solução antiga, 41 bytes :

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

A entrada deve ser uma sequência separada por vírgula:

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

As curiosas formas de programação. Isso funciona devido à conversão implícita do MATLAB entre tipos de dados.

A saída de strsplit(input(''))é uma célula de strings. Você não pode usar diffem uma célula, mas, felizmente, datenumfunciona, e na verdade lança a entrada da célula de volta para uma matriz numérica 2x1, diffpossibilitando o uso.

Você pode especificar vários delimitadores strsplit, mas a vírgula é o padrão. Além disso, a entrada padrão para datenumestá no formato yyyy-mm-dd. Por esses motivos, muitas especificações, como: datenum (s, 'aaaa-mm-dd') são evitadas, economizando muitos bytes.

Para o registro, isso seria 21 bytes se eu pudesse usar uma função:

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

11
Como eu poderia esquecer as diferenças ... Também é possível excluir minha submissão, porque é essencialmente a mesma coisa, mas com duas chamadas para o datenum.
slvrbld

11
Ótima opção de formato de entrada!
Luis Mendo

2

Javascript ES6, 63 bytes

Testado em cromo.

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

separado por vírgula da questão
ev3commander

@ ev3commander Sim, eu apenas consertei isso.
precisa saber é o seguinte

2
@ SuperJedi224 Huh. O Firefox dá uma data inválida , enquanto o chrome continua feliz.
Conor O'Brien

5
Eu marcar este específico do Chrome como única parece funcionar no Chrome. Acho que a maneira compatível seria usar Date.parsee substituir o -com/
Downgoat

11
A maioria dos navegadores exige que a data seja preenchida para 2015-12-03que funcione, mas 2015-12-3não (exceto no Chrome). A pergunta diz que a data estará no formato; YYYY-MM-DDportanto, se a entrada realmente seguiu, seria compatível com vários navegadores; no entanto, os exemplos parecem dizer o contrário. De qualquer forma, você poderia usar em Date.parsevez de new Datesalvar 2 bytes:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 bytes

Constatou que a abordagem clássica é mais curta que a OOP:

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

Lê a sequência separada por vírgula STDIN.


A maneira OOP direta ( 77 bytes ):

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

Editar% s

  • Salva 13 bytes usando em strtotimevez de DateTime.
  • Economizou 1 byte armazenando strtotimeem uma variável. Graças ao Blackhole .

-3 bytes: mova as atribuições para o primeiro uso entre parênteses (-1 byte cada) e você pode usar em <?=vez de echo.
Titus

1

VBA, 69 bytes

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

1

psql, 75 bytes

(Código de 74 caracteres + opção de linha de comando de 1 caractere)

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

psqlé o terminal interativo do PostgreSQL. Para respeitar o "Cada envio deve ser um programa completo". regra, o código lê a entrada em si.

Exemplo de execução:

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

1

MATL, 5 bytes

iPYOd

É o mesmo que a resposta de StewieGriffin, exceto que eu o usei flipem diffvez dediff negar o resultado.

Explicação completa, com as funções correspondentes do 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
Nota: Embora o MATL tenha sido lançado apenas em 12 de dezembro, depois que esse desafio foi lançado, eu obtive essa resposta em 9 de dezembro usando um compilador MATL de pré-lançamento, que é quase idêntico ao compilador lançado, esse código é o mesmo.
David

2
Além disso, isso não é de forma alguma um endosso do popular dispositivo portátil de música da Apple: P
David

11
Eu deveria ter usado opara a datenumfunção :-D
Luis Mendo

Isso teria sido incrível!
David

11
@ ev3commander A maioria das respostas no PPCG é igual a outras respostas, especialmente em casos como este, em que 4 comandos são suficientes.
David

1

PowerShell v2 +, 50 44 bytes

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

Pega o argumento de entrada como uma sequência, divide-o na vírgula e canaliza a matriz por meio de um alias interno, dateabreviado para Get-Dateconverter nossas sequências no formato de data e hora do .NET. Essas duas datas são armazenadas simultaneamente em $ae $b. Em seguida, usamos um operador de subtração sobrecarregado para subtrair o segundo do primeiro e produzir o.Days mesmo.

Golfed 6 bytes graças a TessellatingHeckler .

Tecnicamente não concorrente, pois não possui um intérprete on-line disponível, pois a implementação do FOSS do PowerShell, Pash , gira em torno do PowerShell v0.5. Ainda não suporta -split, muito menos a complexa funcionalidade de datas do .NET.


1

Excel, 25 bytes

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

O Excel manipula automaticamente as seqüências de caracteres como datas.


0

Jolf , 33 bytes

Funciona apenas no Chrome. Não-competitivo, pois o idioma atualiza a pergunta pós-data. Vou adicionar uma explicação mais completa mais tarde.

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

"Explicação"

$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

Que tal você colocar "não-competidor" no seu cabeçalho?
ev3commander

0

MATLAB, 59 bytes

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

Abordagem muito direta: a entrada deve ser fornecida como uma string na janela de comando. A sequência de entrada é então dividida e o número de dias entre as datas (e nada mais) é calculado a partir dos números de data de série. Tenho certeza de que existe uma maneira de evitar a necessidade de chamar o datenum duas vezes ...


0

Python 2, 109 113 bytes

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 bytes

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

Testado com o SQL Server 2008R2. O $ (i) é substituído pela entrada fornecida como argumento da linha de comandos.

Exemplo de execução:

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

0

Mathematica, 61 bytes

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

Subtração de data básica.


0

Perl, 91 86 + 2 para sinalizadores np, 88 bytes

use Date :: Calc qw (Delta_Days); ($ a, $ b) = divisão (/, /); $ _ = Delta_Days (divisão (/ - /, $ b), divisão (/ - /, $ a))

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

Exemplo

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

0

jq, 50 bytes

(Código de 49 caracteres + opção de linha de comando de 1 caractere)

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

Exemplo de execução:

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

Teste on-line (o -RURL de passagem não é suportado - a entrada passou como string "2015-12-3,2013-12-3".)


0

Mathematica, 56 bytes

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

A maioria das funções de data (todas?) Tentará analisar as entradas de seqüência de caracteres em datas automaticamente.



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.