Cela s'est passé il y a combien de temps?


9

Cela s'est passé il y a combien de temps?

Les règles

  • Chaque soumission doit être un programme complet.
  • Le programme doit prendre la saisie sous la forme de deux dates séparées par des virgules dans le formulaire YYYY-MM-DDet imprimer le nombre de jours écoulés depuis la deuxième date dans STDOUT comme si aujourd'hui était la première date (si la deuxième date devait être dans le futur, afficher un nombre négatif) plus un retour à la ligne de fin facultatif, et rien d'autre. Supposons que les deux dates figurent dans le calendrier grégorien.
  • Le programme ne doit rien écrire dans STDERR.

    Notez qu'il doit y avoir un interprète pour que la soumission puisse être testée.

  • Les soumissions sont notées en octets , dans un codage approprié (préexistant), généralement (mais pas nécessairement) UTF-8. Certaines langues, comme les dossiers , sont un peu délicates à noter - en cas de doute, veuillez demander sur Meta .
  • C'est le , donc le code le plus court gagne

    Exemples

Contribution:

2015-12-03,2015-12-01

Production:

2

Contribution:

2015-12-03,2014-12-01

Production:

367

Contribution:

2015-12-03,2013-12-03

Production:

730

L'extrait

L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que classement et b) en tant que liste des gagnants par langue.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

## Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:

## [><>](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
Sommes-nous autorisés à utiliser des bibliothèques externes? Ceux qui sont communs dans un écosystème donné mais ne font pas partie de la bibliothèque standard? (Par exemple, personne n'utilise les API Date du JDK mais JodaTime à la place, même s'il s'agit techniquement d'une bibliothèque externe).
Ruslan

Je suppose que tout utilise UTC, car dans mon fuseau horaire, la différence entre 2015-11-01T00: 00: 00 et 2015-11-02T00: 00: 00 n'était que de ~ 0,96 jours (23 heures) en raison de l'heure d'été. Vous n'avez rien mentionné au sujet de l'arrondissement des fractions de jours, alors vous voudrez peut-être clarifier cela dans la question. (Je pense que beaucoup de bibliothèques datetime utilisent par défaut l'heure locale.)
ThisSuitIsBlackNot

1
Quel est le cas pour les années bissextiles?
TheCoffeeCup

@TheCoffeeCup ils doivent être manipulés
ev3commander

Réponses:


1

TeaScript , 24 octets

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

Utilise Date.parsepour analyser la date, puis obtient la différence et divise.

Essayez-le en ligne

Explication && 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

Utilitaires Bash + GNU, 37

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

trremplace la virgule par une nouvelle ligne. datelit les dates séparées par la nouvelle ligne et affiche le nombre de secondes écoulées depuis l'époque Unix que représente la date transmise. Ces numéros sont ensuite mis sur la dcpile. Ensuite, c'est une simple question de soustraction et de division par (24 * 60 * 60). Dans ce cas, l' dcévaluation arithmétique RPN basée sur la pile est meilleure que bcou bash $( ), principalement parce que la sous-traction avant la division n'a pas besoin de parenthèses.

Entrée 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 octets

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

Non golfé:

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

Au lieu de cela, -diff(d)[1]vous pouvez utiliser -(d...)pour enregistrer quelques octets. Quelle version de Julia utilisez-vous au fait? Sur 1.2, j'ai dû importer explicitement Dateset je ne peux pas simplement convertir des jours en entiers comme celui-ci.
Simeon Schaub

Cette réponse a été publiée en 2015, il s'agissait donc probablement de Julia 0,3 ou 0,4 au plus tard.
Alex A.

4

Scala, 166 139 120 120 116 92 octets

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

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

Remarque: La troisième version (120 octets) et plus utilise une API obsolète. Il compile toujours et fonctionne bien. Note2: Merci aux commentateurs ci-dessous pour les bons conseils!


Étant donné que la nouvelle ligne de fin est facultative, vous pouvez utiliser à la printplace de println.
Marth

Vous pouvez supprimer la Object A extends App{...}pièce et l'enregistrer sous a.scalaet l'exécuter avec scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Genius! Merci!!
Ruslan

3

Rubis, 69 66 65 57 55 octets

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

47 octets + 8 octets pour l'option de ligne de commande. Merci à Dane Anderson, enregistré 2 octets.

57 octets

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

Code de 49 octets + 8 octets pour l'option de ligne de commande. 8 octets enregistrés avec la suggestion de manatwork.

65 octets

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

66 octets

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

69 octets

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

Testez-le en ligne

Non golfé

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

Usage:

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

=> 730

Trois petits caractères: ','?,, '-'?-, to_i/div .
manatwork

L'utilisation de certaines options de ligne de commande peut le réduire davantage: ruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'59 caractères comme je le compte.
manatwork

@manatwork Je ne sais pas si cela est autorisé.
Vasu Adari

La règle est que la nécessité minimale nécessaire pour passer le code (dans le cas de Ruby -e) est gratuite, tout le reste doit être inclus dans le décompte. Il existe différentes opinions sur ce qu'est exactement tout le reste. Par exemple, certains membres incluent le caractère d'espace séparateur d'options et des guillemets autour des valeurs des paramètres. À mon avis, il ne faut compter que ce qui est réellement passé à l'interpréteur, pas les caractères supplémentaires requis par la syntaxe du shell. Mais je ne me souviens d'aucune voix élevée pour interdire l'utilisation d'options.
manatwork

2
presque pas la peine de mentionner, mais vous pouvez raser un octet en déplaçant le code répété dans un proc:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen

2

Japt , 41 octets

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

Jusqu'à présent, c'est le mieux que je puisse obtenir car toutes les variables $et les parenthèses tuent vraiment le nombre d'octets.

Essayez-le en ligne

Explication

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

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

L'entrée doit être un tableau de cellules séparé par des virgules. datenumconvertit la cellule d'entrée en un tableau numérique 2x1 avec l'horodatage. diffprend la différence entre les deux.


Ancienne solution, 41 octets :

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

L'entrée doit être une chaîne séparée par des virgules:

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

Les curieuses façons de programmer. Cela fonctionne en raison de la conversion implicite de MATLAB entre les types de données.

La sortie de strsplit(input(''))est une cellule de chaînes. Vous ne pouvez pas l'utiliser diffsur une cellule, mais heureusement, cela datenumfonctionne, et cela remet en fait l'entrée de la cellule dans un tableau numérique 2x1, ce qui diffpermet de l'utiliser.

Vous pouvez spécifier un grand nombre de délimiteurs dans strsplit, mais la virgule est celle par défaut. De plus, l'entrée par défaut de datenumest sur le format yyyy-mm-dd. Pour ces raisons, de nombreuses spécifications telles que: datenum (s, 'aaaa-mm-jj') sont évitées, ce qui permet d'économiser beaucoup d'octets.

Pour mémoire, ce serait 21 octets si je pouvais utiliser une fonction:

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

1
Comment pourrais-je oublier diff ... Pourrait aussi bien supprimer ma soumission, car c'est essentiellement la même chose, mais avec 2 appels à datenum à la place.
slvrbld

1
Grand choix de format d'entrée!
Luis Mendo

2

Javascript ES6, 63 octets

Testé en chrome.

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


@ ev3commander Oui, je viens de corriger cela.
SuperJedi224

2
@ SuperJedi224 Huh. Firefox donne une date invalide , tandis que Chrome continue joyeusement.
Conor O'Brien

5
Je marquerais cette spécification Chrome car elle ne semble fonctionner que dans Chrome. Je pense que la manière conforme serait d'utiliser Date.parseet de remplacer le -par/
Downgoat

1
La plupart des navigateurs nécessitent que la date soit complétée, donc 2015-12-03cela fonctionnera mais 2015-12-3pas (sauf dans Chrome). La question dit que la date sera au format, YYYY-MM-DDdonc si l'entrée a vraiment suivi, elle serait compatible avec tous les navigateurs, mais les exemples semblent dire le contraire. Quoi qu'il en soit, vous pouvez utiliser Date.parseau lieu de new Datepour enregistrer 2 octets:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 octets

Trouvé que l'approche classique est plus courte que celle de la POO:

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

Lit la chaîne séparée par des virgules STDIN.


La méthode OOP simple ( 77 octets ):

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

Modifications

  • Enregistré 13 octets en utilisant strtotimeau lieu de DateTime.
  • Enregistré 1 octet en stockant strtotimedans une variable. Merci à Blackhole .

-3 octets: déplacez les affectations à leur première utilisation entre parenthèses (-1 octet chacune) et vous pouvez utiliser à la <?=place de echo.
Titus

1

VBA, 69 octets

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

1

psql, 75 octets

(Code de 74 caractères + option de ligne de commande de 1 caractère)

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

psqlest le terminal interactif de PostgreSQL. Pour respecter le "Chaque soumission doit être un programme complet." règle, le code lit l'entrée elle-même.

Exemple d'exécution:

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

1

MATL, 5 octets

iPYOd

C'est la même chose que la réponse de StewieGriffin, sauf que j'ai utilisé flipalors diffplutôt que de diffnier le résultat.

Explication complète, avec les fonctions Matlab correspondantes:

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
Remarque: Bien que MATL n'ait été publié que le 12 décembre, après la publication de ce défi, j'ai trouvé cette réponse le 9 décembre en utilisant un compilateur MATL pré-version, qui est presque identique au compilateur publié, ce code est le même.
David

2
En outre, il ne s'agit en aucun cas d'une approbation du populaire appareil de musique portable Apple: P
David

1
J'aurais dû utiliser opour la datenumfonction :-D
Luis Mendo

Cela aurait été incroyable!
David

1
@ ev3commander la plupart des réponses sur PPCG sont les mêmes que les autres réponses, surtout dans des cas comme celui-ci où 4 commandes suffisent.
David

1

PowerShell v2 +, 50 44 octets

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

Prend l'argument d'entrée sous forme de chaîne, le divise sur la virgule, puis redirige le tableau via un alias dateabrégé pour Get-Dateconvertir nos chaînes au format .NET datetime. Ces deux dates sont ensuite stockées simultanément dans $aet $b. Nous utilisons ensuite un opérateur de soustraction surchargé pour soustraire le second du premier et en sortir .Dayscelui - ci.

Golfé 6 octets grâce à TessellatingHeckler .

Techniquement non concurrentiel, car il n'a pas d'interprète en ligne disponible, car l'implémentation FOSS de PowerShell, Pash , concerne PowerShell v0.5. Il ne prend pas -splitencore en charge , sans parler de la fonctionnalité de date .NET complexe.


1

Excel, 25 octets

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

Excel gère automatiquement les chaînes comme des dates.


0

Jolf , 33 octets

Fonctionne uniquement dans Chrome. Pas de compétition, car la langue met à jour la question postdate. J'ajouterai une explication plus approfondie plus tard.

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

"Explication"

$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

Et si vous mettiez "non compétitif" dans votre en-tête?
ev3commander

0

MATLAB, 59 octets

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

Approche très simple: l'entrée doit être donnée sous forme de chaîne à partir de la fenêtre de commande. La chaîne d'entrée est ensuite divisée et le nombre de jours entre les dates (et rien d'autre) est calculé à partir des numéros de date de série. Je suis sûr qu'il existe un moyen d'éviter le besoin d'appeler deux fois le datenum ...


0

Python 2, 109 113 octets

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 octets

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

Testé avec SQL Server 2008R2. $ (I) est remplacé par l'entrée fournie comme argument de ligne de commande.

Exemple d'exécution:

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

0

Mathematica, 61 octets

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

Soustraction de date de base.


0

Perl, 91 86 + 2 pour drapeaux np, 88 octets

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

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

Exemple

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

0

jq, 50 octets

(Code de 49 caractères + option de ligne de commande de 1 caractère)

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

Exemple d'exécution:

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

Test en ligne (la -Rtransmission via l'URL n'est pas prise en charge - la saisie a donc été transmise sous la forme "2015-12-3,2013-12-3".)


0

Mathematica, 56 octets

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

La plupart des fonctions de date (toutes?) Essaieront d'analyser automatiquement les entrées de chaîne dans les dates.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.