A quando risale questo?


9

A quando risale questo?

Le regole

  • Ogni invio deve essere un programma completo.
  • Il programma deve inserire input come due date separate da virgola nel modulo YYYY-MM-DDe stampare il numero di giorni trascorsi dalla seconda data a STDOUT come se oggi fosse la prima data (se la seconda data sarebbe in futuro, produrre un numero negativo) più una nuova riga finale facoltativa e nient'altro. Supponiamo che entrambe le date siano nel calendario gregoriano.
  • Il programma non deve scrivere nulla su STDERR.

    Si noti che deve essere presente un interprete per poter testare l'invio.

  • Le iscrizioni vengono classificate in byte , con una codifica appropriata (preesistente), solitamente (ma non necessariamente) UTF-8. Alcune lingue, come Cartelle , sono un po 'difficili da segnare - in caso di dubbi, chiedi su Meta .
  • Questo è , quindi vince il codice più corto

    Esempi

Ingresso:

2015-12-03,2015-12-01

Produzione:

2

Ingresso:

2015-12-03,2014-12-01

Produzione:

367

Ingresso:

2015-12-03,2013-12-03

Produzione:

730

Lo snippet

Lo snippet di stack in fondo a questo post genera il catalogo dalle risposte a) come classifica eb) come lista di vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello 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>



1
Ci è permesso usare librerie esterne? Quelli comuni in un determinato ecosistema ma che non fanno parte della lib standard? (Ad esempio, nessuno usa le API Date di JDK ma JodaTime invece, anche se tecnicamente è una libreria esterna).
Ruslan,

Suppongo che tutto usi UTC, poiché nel mio fuso orario la differenza tra 2015-11-01T00: 00: 00 e 2015-11-02T00: 00: 00 era solo ~ 0,96 giorni (23 ore) a causa dell'ora legale. Non hai menzionato nulla sull'arrotondamento di giorni frazionari, quindi potresti voler chiarire questo nella domanda. (Penso che molte librerie datetime usino l'ora locale per impostazione predefinita.)
ThisSuitIsBlackNon

1
Qual è il caso degli anni bisestili?
TheCoffeeCup

@TheCoffeeCup devono essere gestiti
ev3commander il

Risposte:


1

TeaScript , 24 byte

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

Usa Date.parseper analizzare la data, quindi ottenere è la differenza e divide.

Provalo online

Spiegazione && 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à Bash + GNU, 37

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

trsostituisce la virgola con una nuova riga. datelegge le date separate della nuova riga e restituisce il numero di secondi dall'epoca di Unix rappresentata dalla data passata. Questi numeri vengono quindi messi in dcpila. Quindi è una semplice questione di sottrazione e divisione per (24 * 60 * 60). In questo caso, dcla valutazione aritmetica RPN basata su stack è migliore bco bash $( ), soprattutto perché la sottorubrica prima della divisione non ha bisogno di parentesi.

Ingresso tramite 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 byte

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)

Invece di -diff(d)[1]te puoi usare -(d...)per salvare un paio di byte. A proposito, quale versione di Julia stai usando? Su 1.2, ho dovuto importare esplicitamente Datese non posso semplicemente convertire i giorni in numeri interi come questo.
Simeon Schaub,

Questa risposta è stata pubblicata nel 2015, quindi era probabilmente Julia 0.3 o 0.4 al più tardi.
Alex A.

4

Scala, 166 139 120 116 92 byte

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

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

Nota: la terza versione (120 byte) e successive utilizza un'API obsoleta. Si compila ancora e funziona benissimo. Nota2: grazie ai commentatori qui sotto per l'ottimo consiglio!


Poiché la nuova riga finale è facoltativa, è possibile utilizzare printinvece di println.
Marth,

È possibile rimuovere la Object A extends App{...}parte e salvarla come a.scalaed eseguirla con scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Genius! Grazie!!
Ruslan,

3

Rubino, 69 66 65 57 55 byte

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

47 byte + 8 byte per l'opzione della riga di comando. Grazie a Dane Anderson, risparmiato 2 byte.

57 byte

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

Codice 49 byte + 8 byte per l'opzione della riga di comando. Salvataggio di 8 byte con il suggerimento di manatwork.

65 byte

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

66 byte

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

69 byte

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

Provalo online

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

Tre piccoli caratteri: ','?,, '-'?-, to_i/div .
arte

L'uso di alcune opzioni della riga di comando può ridurlo di più: ruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'è di 59 caratteri mentre lo conto.
arte

@manatwork Non sono sicuro che ciò sia consentito.
Vasu Adari,

La regola è che la necessità minima necessaria per passare il codice (nel caso di Ruby -e) è gratuita, tutto il resto deve essere incluso nel conteggio. Esistono opinioni diverse su cosa sia esattamente tutto il resto. Ad esempio, alcuni membri includono il carattere spazio separatore opzione e virgolette attorno ai valori dei parametri. A mio avviso, si dovrebbe considerare solo ciò che viene effettivamente trasmesso all'interprete, non i caratteri extra richiesti dalla sintassi della shell. Ma non ricordo nessuna voce alzata per impedire l'uso delle opzioni.
arte

2
quasi non vale la pena menzionare, ma puoi radere un byte spostando il codice ripetuto in un proc:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen,

2

Japt , 41 byte

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

Finora questo è il migliore che posso ottenere in quanto tutte le variabili $e le parentesi uccidono davvero il conteggio dei byte.

Provalo online

Spiegazione

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

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

L'input deve essere un array di celle separato da virgole. datenumconverte la cella di input in un array numerico 2x1 con il timestamp. diffprende la differenza tra i due.


Vecchia soluzione, 41 byte :

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

L'input deve essere una stringa separata da virgola:

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

I curiosi modi di programmare. Questo funziona a causa del cast implicito di MATLAB tra tipi di dati.

L'output da strsplit(input(''))è una cella di stringhe. Non è possibile utilizzare diffsu una cella, ma per fortuna datenumfunziona, e in realtà ricollega l'input della cella a una matrice numerica 2x1, rendendone diffpossibile l'uso.

È possibile specificare molti delimitatori in strsplit, ma la virgola è quella predefinita. Inoltre, l'input predefinito per datenumè nel formato yyyy-mm-dd. Per questi motivi, vengono evitate molte specifiche come: datenum (s, 'yyyy-mm-dd'), risparmiando un sacco di byte.

Per la cronaca, questo sarebbe di 21 byte se potessi usare una funzione:

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

1
Come potrei dimenticarmi di diff ... Potrebbe anche cancellare la mia presentazione, perché è essenzialmente la stessa, ma con 2 chiamate al datenum invece.
slvrbld,

1
Ottima scelta del formato di input!
Luis Mendo,

2

Javascript ES6, 63 byte

Testato in cromo.

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

separato da virgole dalla domanda
ev3commander

@ ev3commander Sì, l'ho appena risolto.
SuperJedi224,

2
@ SuperJedi224 Huh. Firefox indica una data non valida , mentre Chrome procede felicemente.
Conor O'Brien,

5
Mi piacerebbe segnare questa Chrome-specifica in quanto solo sembra funzionare in cromo. Penso che il modo conforme sarebbe quello di utilizzare Date.parsee sostituire il -con/
Downgoat

1
La maggior parte dei browser richiede il riempimento della data, quindi 2015-12-03funzionerà ma 2015-12-3non funzionerà (tranne che in Chrome). La domanda dice che la data sarà nel formato, YYYY-MM-DDquindi se l'input effettivamente seguisse che sarebbe compatibile con più browser, tuttavia gli esempi sembrano dire il contrario. Ad ogni modo, è possibile utilizzare Date.parseinvece di new Datesalvare 2 byte:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 byte

Ho scoperto che l'approccio classico è più breve di quello OOP:

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

Legge la stringa separata da virgola da STDIN.


Il modo OOP diretto ( 77 byte ):

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

Le modifiche

  • Salvato 13 byte usando strtotimeinvece di DateTime.
  • Salvato 1 byte memorizzando strtotimein una variabile. Grazie a Blackhole .

-3 byte: sposta le assegnazioni al loro primo utilizzo tra parentesi (-1 byte ciascuna) e puoi usare al <?=posto di echo.
Tito

1

VBA, 69 byte

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

1

psql, 75 byte

(Codice 74 caratteri + opzione riga comandi 1 carattere)

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

psqlè il terminale interattivo di PostgreSQL. Per rispettare il "Ogni invio deve essere un programma completo". regola, il codice legge l'input stesso.

Esecuzione di esempio:

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

1

MATL, 5 byte

iPYOd

Questo è lo stesso della risposta di StewieGriffin, tranne che ho usato flipallora diffpiuttosto che diffnegare il risultato.

Spiegazione completa, con le corrispondenti funzioni di 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: Mentre MATL è stato rilasciato solo il 12 dicembre, dopo che questa sfida è stata pubblicata, ho trovato questa risposta il 9 dicembre usando un compilatore MATL pre-release, che è quasi identico al compilatore rilasciato, questo codice è lo stesso.
David,

2
Inoltre, questo non è in alcun modo un'approvazione del popolare dispositivo musicale portatile Apple: P
David,

1
Avrei dovuto usare ola datenumfunzione MrGreen
Luis Mendo il

Sarebbe stato fantastico!
David,

1
@ ev3commander la maggior parte delle risposte su PPCG sono le stesse di altre risposte, specialmente in casi come questo in cui sono sufficienti 4 comandi.
David,

1

PowerShell v2 +, 50 44 byte

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

Prende argomento di input come una stringa, la divide in virgola, quindi tubi matrice tramite un alias predefinito datecorto per Get-Dateconvertire nostre corde in NET datetime formato. Queste due date vengono quindi memorizzate contemporaneamente in $ae $b. Quindi utilizziamo un operatore di sottrazione sovraccaricato per sottrarre il secondo dal primo e emetterne uno .Days.

Golfato 6 byte grazie a TessellatingHeckler .

Tecnicamente non competitivo, in quanto non ha un interprete online disponibile, poiché l'implementazione FOSS di PowerShell, Pash , si basa su PowerShell v0.5. Non supporta -splitancora, per non parlare della complessa funzionalità di data .NET.


1

Excel, 25 byte

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

Excel gestisce automaticamente le stringhe come date.


0

Jolf , 33 byte

Funziona solo con Chrome. Non competitivo, poiché la lingua aggiorna la domanda postdatata. Aggiungerò una spiegazione più approfondita in seguito.

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

"Spiegazione"

$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

Che ne dici di mettere "non competitivo" nella tua intestazione?
ev3commander,

0

MATLAB, 59 byte

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

Approccio molto diretto: l'input deve essere dato come una stringa dalla finestra di comando. La stringa di input viene quindi suddivisa e il numero di giorni tra le date (e nient'altro) viene calcolato dai numeri di data seriale. Sono abbastanza sicuro che c'è un modo per evitare la necessità di chiamare due volte il datenum ...


0

Python 2, 109 113 byte

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 byte

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

Testato con SQL Server 2008R2. $ (I) viene sostituito con l'input fornito come argomento della riga di comando.

Esecuzione di esempio:

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

0

Mathematica, 61 byte

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

Sottrazione della data di base.


0

Perl, 91 86 + 2 per flag np, 88 byte

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

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

Esempio

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

0

jq, 50 byte

(Codice 49 caratteri + opzione riga comandi 1 carattere)

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

Esecuzione di esempio:

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

Test online (il passaggio -Rtramite URL non è supportato, pertanto l'input è stato passato come stringa "2015-12-3,2013-12-3").


0

Mathematica, 56 byte

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

La maggior parte delle funzioni di data (tutte?) Tenterà di analizzare automaticamente gli input di stringa in date.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.