Jak dawno to było?


9

Jak dawno to było?

Zasady

  • Każde zgłoszenie musi być pełnym programem.
  • Program musi wprowadzić dane jako dwie daty oddzielone przecinkami w formularzu YYYY-MM-DDi wydrukować liczbę dni, które upłynęły od drugiej daty do STDOUT, tak jakby dzisiaj była pierwsza data (jeśli druga data będzie w przyszłości, wypisz liczba ujemna) plus opcjonalny znak nowej linii i nic więcej. Załóżmy, że obie daty są w kalendarzu gregoriańskim.
  • Program nie może pisać niczego do STDERR.

    Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie.

  • Zgłoszenia są oceniane w bajtach , w odpowiednim (wcześniej istniejącym) kodowaniu, zwykle (ale niekoniecznie) UTF-8. Niektóre języki, takie jak Foldery , są trudne do zdobycia - w razie wątpliwości zapytaj na Meta .
  • To jest , więc najkrótszy kod wygrywa

    Przykłady

Wejście:

2015-12-03,2015-12-01

Wynik:

2)

Wejście:

2015-12-03,2014-12-01

Wynik:

367

Wejście:

2015-12-03,2013-12-03

Wynik:

730

Snippet

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako tabeli wyników i b) jako listy zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](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
Czy wolno nam korzystać z bibliotek zewnętrznych? Te, które są wspólne w danym ekosystemie, ale nie są częścią standardowej biblioteki? (Na przykład nikt nie korzysta z interfejsów API JDK Date, ale JodaTime, mimo że technicznie jest to biblioteka zewnętrzna).
Ruslan,

Zakładam, że wszystko korzysta z UTC, ponieważ w mojej strefie czasowej różnica między 2015-11-01T00: 00: 00 a 2015-11-02T00: 00: 00 wynosiła tylko ~ 0,96 dni (23 godziny) z powodu oszczędności w świetle dziennym. Nie wspominałeś nic o zaokrąglaniu dni ułamkowych, więc możesz to wyjaśnić w pytaniu. (Myślę, że wiele bibliotek datetime domyślnie używa czasu lokalnego.)
ThisSuitIsBlackNot

1
Co dzieje się w latach przestępnych?
TheCoffeeCup,

@TheCoffeeCup muszą być obsługiwane
ev3commander

Odpowiedzi:


1

TeaScript , 24 bajty

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

Używa Date.parseparsować datę, a następnie pobiera różnicę i dzieli.

Wypróbuj online

Wyjaśnienie i nieugolfowany

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

Narzędzia Bash + GNU, 37

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

trzastępuje przecinek nową linią. dateodczytuje daty oddzielone znakiem nowej linii i wyświetla liczbę sekund od epoki Uniksa, którą reprezentuje data przekazania. Liczby te są następnie umieszczane na dcstosie. Następnie jest to prosta kwestia odjęcia i podzielenia przez (24 * 60 * 60). W takim przypadku dcocena arytmetyczna RPN oparta na stosie jest lepsza niż bclub bash $( ), głównie dlatego, że poddziałanie przed podziałem nie wymaga nawiasów.

Wejście przez 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 bajtów

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

Nie golfowany:

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

Zamiast tego -diff(d)[1]możesz użyć, -(d...)aby zapisać kilka bajtów. Nawiasem mówiąc, jakiej wersji Julii używasz? W wersji 1.2 musiałem jawnie zaimportować, Datesa także nie mogę po prostu przekonwertować dni na liczby całkowite w ten sposób.
Simeon Schaub,

Ta odpowiedź została opublikowana w 2015 roku, więc prawdopodobnie była to Julia 0.3 lub 0.4 najpóźniej.
Alex A.,

4

Scala, 166 139 120 116 92 bajtów

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

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

Uwaga: trzecia wersja (120 bajtów) i nowsze używa przestarzałego interfejsu API. Nadal się kompiluje i działa dobrze. Uwaga 2: Dzięki komentatorom poniżej za świetną radę!


Ponieważ końcowa nowa linia jest opcjonalna, możesz jej użyć printzamiast println.
Marth

Możesz usunąć Object A extends App{...}część i zapisać ją jako a.scalai uruchomić scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Genius! Dzięki!!
Ruslan,

3

Rubinowy, 69 66 65 57 55 bajtów

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

47 bajtów + 8 bajtów dla opcji wiersza poleceń. Dzięki Dane Anderson zaoszczędzono 2 bajty.

57 bajtów

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

Kod 49 bajtów + 8 bajtów dla opcji wiersza poleceń. Zapisano 8 bajtów dzięki sugestii manatwork.

65 bajtów

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

66 bajtów

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

69 bajtów

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

Przetestuj online

Nie golfił

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

Stosowanie:

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

=> 730

Trzy małe znaki: ','?,, '-'?-, to_i/div .
manatwork,

Korzystanie z niektórych opcji wiersza poleceń może go bardziej zmniejszyć: ruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'liczę 59 znaków.
manatwork

@manatwork Nie jestem pewien, czy jest to dozwolone.
Vasu Adari,

Zasadą jest, że minimalna konieczność przekazania kodu (w przypadku Ruby -e) jest bezpłatna, wszystko inne musi być uwzględnione w liczbie. Istnieją różne opinie na temat tego, co dokładnie to wszystko. Na przykład niektórzy członkowie zawierają znak spacji separatora opcji i cudzysłowy wokół wartości parametrów. Moim zdaniem należy liczyć tylko to, co faktycznie zostaje przekazane interpreterowi, dodatkowe znaki wymagane przez składnię powłoki nie. Ale nie pamiętam żadnego głosu podniesionego, by uniemożliwić korzystanie z opcji.
manatwork

2
prawie nie warte wspomnienia, ale możesz ogolić bajt, przenosząc powtarzający się kod do proc:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen

2

Japt , 41 bajtów

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

Jak dotąd jest to najlepsze, co mogę uzyskać, ponieważ wszystkie zmienne $i nawiasy naprawdę zabijają liczbę bajtów.

Wypróbuj online

Wyjaśnienie

             // 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 bajtów

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

Dane wejściowe muszą być tablicą komórek oddzieloną przecinkami. datenumkonwertuje komórkę wejściową na tablicę numeryczną 2x1 ze znacznikiem czasu. diffbierze różnicę między nimi.


Stare rozwiązanie, 41 bajtów :

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

Dane wejściowe muszą być ciągami oddzielonymi przecinkami:

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

Ciekawe sposoby programowania. Działa to z powodu niejawnego rzutowania MATLAB między typami danych.

Dane wyjściowe strsplit(input(''))to komórka ciągów znaków. Nie możesz używać diffna komórce, ale na szczęście datenumdziała, i faktycznie rzutuje dane wejściowe komórki z powrotem na tablicę numeryczną 2x1, co diffumożliwia użycie.

Możesz podać wiele separatorów strsplit, ale przecinek jest domyślny. Domyślnym wejściem datenumjest format yyyy-mm-dd. Z tych powodów unika się wielu specyfikacji, takich jak: datenum (s, „rrrr-mm-dd”), co pozwala zaoszczędzić wiele bajtów.

Dla przypomnienia byłoby to 21 bajtów, gdybym mógł użyć funkcji:

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

1
Jak mogłem zapomnieć o diff ... Równie dobrze mogę po prostu usunąć moje zgłoszenie, ponieważ jest zasadniczo takie samo, ale zamiast tego ma 2 wywołania do bazy danych.
slvrbld

1
Duży wybór formatu wejściowego!
Luis Mendo,

2

JavaScript ES6, 63 bajty

Testowane w chromie.

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

przecinek oddzielony od pytania
dowódca ev3,

@ ev3commander Tak, właśnie to naprawiłem.
SuperJedi224,

2
@ SuperJedi224 Huh. Firefox podaje niepoprawną datę , podczas gdy Chrome szczęśliwie działa.
Conor O'Brien,

5
Chciałbym zaznaczyć ten chromowo-specyficzne, jak to tylko wydaje się działać w chromie. Myślę, że sposób zgodny byłoby wykorzystanie Date.parsei wymienić -z/
Downgoat

1
Większość przeglądarek wymaga uzupełnienia daty, więc 2015-12-03będzie działać, ale 2015-12-3nie będzie (z wyjątkiem Chrome). Pytanie mówi, że data będzie w formacie, YYYY-MM-DDwięc jeśli dane wejściowe rzeczywiście nastąpią, to będzie kompatybilny z różnymi przeglądarkami, jednak przykłady wydają się mówić inaczej. W każdym razie możesz użyć Date.parsezamiast new Datezapisać 2 bajty:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 bajtów

Stwierdzono, że klasyczne podejście jest krótsze niż OOP:

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

Odczytuje ciąg oddzielony przecinkami STDIN.


Prosty sposób OOP ( 77 bajtów ):

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

Edycje

  • Zapisano 13 bajtów , używając strtotimezamiast DateTime.
  • Zapisano 1 bajt , przechowując strtotimew zmiennej. Dzięki Blackhole .

-3 bajty: przenieś przypisania do ich pierwszego użycia w nawiasach (-1 bajt każdy) i możesz użyć <?=zamiast echo.
Tytus


1

psql, 75 bajtów

(74-znakowy kod + 1-znakowa opcja wiersza poleceń)

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

psqljest interaktywnym terminalem PostgreSQL. Aby przestrzegać „Każde zgłoszenie musi być pełnym programem”. reguła, kod odczytuje same dane wejściowe.

Przykładowy przebieg:

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

1

MATL, 5 bajtów

iPYOd

Jest to to samo, co odpowiedź StewieGriffin, tyle że użyłem flipwtedy diffzamiast negować diffwynik.

Pełne wyjaśnienie wraz z odpowiednimi funkcjami Matlaba:

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
Uwaga: Chociaż MATL został wydany dopiero 12 grudnia, po opublikowaniu tego wyzwania, 9 grudnia wymyśliłem tę odpowiedź przy użyciu kompilatora MATL przedpremierowego, który jest prawie identyczny z wydanym kompilatorem, ten kod jest taki sam.
David

2
Ponadto nie jest to w żaden sposób poparcie popularnego przenośnego urządzenia muzycznego Apple: P
David

1
Powinienem był użyć otej datenumfunkcji :-D
Luis Mendo

To byłoby niesamowite!
David

1
@ ev3commander większość odpowiedzi na PPCG jest taka sama jak inne odpowiedzi, szczególnie w takich przypadkach, w których wystarczą 4 polecenia.
David

1

PowerShell v2 +, 50 44 bajtów

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

Staje argumentu wejściowego jako ciąg, dzieli go na przecinek, potem rury tablica poprzez wbudowany alias dateskrót Get-Dateprzekonwertować nasze struny do .NET datetime format. Te dwie daty są następnie zapisywane jednocześnie w $ai $b. Następnie używamy przeciążonego operatora odejmowania, aby odjąć drugi od pierwszego i wyprowadzić go .Days.

Gra w golfa 6 bajtów dzięki TessellatingHeckler .

Technicznie niekonkurencyjne, ponieważ nie ma dostępnego interpretera online, ponieważ implementacja FOSS PowerShell, Pash , jest w pobliżu PowerShell v0.5. Nie obsługuje -splitjeszcze, a tym bardziej złożonej funkcjonalności daty .NET.


1

Excel, 25 bajtów

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

Excel automatycznie obsługuje ciągi jako daty.


0

Jolf , 33 bajty

Działa tylko w Chrome. Niekonkurencyjne, ponieważ aktualizacja języka po pytaniu data. Bardziej szczegółowe wyjaśnienie dodam później.

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

"Wyjaśnienie"

$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

Co powiesz na umieszczenie w nagłówku słowa „niekonkurencyjne”?
ev3commander

0

MATLAB, 59 bajtów

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

Bardzo proste podejście: dane wejściowe należy podać jako ciąg z okna poleceń. Łańcuch wejściowy jest następnie dzielony, a liczba dni między datami (i niczym więcej) jest obliczana na podstawie numerów seryjnych dat. Jestem pewien, że istnieje sposób na uniknięcie konieczności dwukrotnego wywoływania bazy danych ...


0

Python 2, 109 113 bajtów

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 bajtów

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

Testowane z SQL Server 2008R2. $ (I) zostaje zastąpione danymi wejściowymi podanymi jako argument wiersza poleceń.

Przykładowy przebieg:

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

0

Mathematica, 61 bajtów

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

Podstawowe odejmowanie dat.


0

Perl, 91 86 + 2 dla flag np. 88 bajtów

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

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

Przykład

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

0

jq, 50 bajtów

(Kod 49 znaków + opcja wiersza poleceń 1 znak)

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

Przykładowy przebieg:

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

Test online (Przekazanie -Radresu URL nie jest obsługiwane - więc dane wejściowe zostały przekazane jako ciąg „2015-12-3,2013-12-3”).


0

Mathematica, 56 bajtów

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

Większość funkcji daty (wszystkie?) Spróbuje automatycznie parsować dane wejściowe ciągu.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.