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-DD
i 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 golf-golf, 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 N
jest 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>
Odpowiedzi:
TeaScript , 24 bajty
Używa
Date.parse
parsować datę, a następnie pobiera różnicę i dzieli.Wypróbuj online
Wyjaśnienie i nieugolfowany
źródło
Narzędzia Bash + GNU, 37
tr
zastępuje przecinek nową linią.date
odczytuje daty oddzielone znakiem nowej linii i wyświetla liczbę sekund od epoki Uniksa, którą reprezentuje data przekazania. Liczby te są następnie umieszczane nadc
stosie. Następnie jest to prosta kwestia odjęcia i podzielenia przez (24 * 60 * 60). W takim przypadkudc
ocena arytmetyczna RPN oparta na stosie jest lepsza niżbc
lub bash$( )
, głównie dlatego, że poddziałanie przed podziałem nie wymaga nawiasów.Wejście przez STDIN:
źródło
Julia, 67 bajtów
Nie golfowany:
źródło
-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ć,Dates
a także nie mogę po prostu przekonwertować dni na liczby całkowite w ten sposób.Scala,
16613912011692 bajtówStosowanie:
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ę!
źródło
print
zamiastprintln
.Object A extends App{...}
część i zapisać ją jakoa.scala
i uruchomićscala a.scala 2015-12-3,2015-12-1
;)Rubinowy,
6966655755 bajtów47 bajtów + 8 bajtów dla opcji wiersza poleceń. Dzięki Dane Anderson zaoszczędzono 2 bajty.
57 bajtów
Kod 49 bajtów + 8 bajtów dla opcji wiersza poleceń. Zapisano 8 bajtów dzięki sugestii manatwork.
65 bajtów
66 bajtów
69 bajtów
Przetestuj online
Nie golfił
Stosowanie:
źródło
','
→?,
,'-'
→?-
,to_i/
→div
.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.-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.t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Japt , 41 bajtów
Jak dotąd jest to najlepsze, co mogę uzyskać, ponieważ wszystkie zmienne
$
i nawiasy naprawdę zabijają liczbę bajtów.Wypróbuj online
Wyjaśnienie
źródło
MATLAB,
4131 bajtówDane wejściowe muszą być tablicą komórek oddzieloną przecinkami.
datenum
konwertuje komórkę wejściową na tablicę numeryczną 2x1 ze znacznikiem czasu.diff
bierze różnicę między nimi.Stare rozwiązanie, 41 bajtów :
Dane wejściowe muszą być ciągami oddzielonymi przecinkami:
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ćdiff
na komórce, ale na szczęściedatenum
działa, i faktycznie rzutuje dane wejściowe komórki z powrotem na tablicę numeryczną 2x1, codiff
umożliwia użycie.Możesz podać wiele separatorów
strsplit
, ale przecinek jest domyślny. Domyślnym wejściemdatenum
jest formatyyyy-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:
źródło
JavaScript ES6, 63 bajty
Testowane w chromie.
źródło
Date.parse
i wymienić-
z/
2015-12-03
będzie działać, ale2015-12-3
nie będzie (z wyjątkiem Chrome). Pytanie mówi, że data będzie w formacie,YYYY-MM-DD
wię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.parse
zamiastnew Date
zapisać 2 bajty:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
PHP, 63
6477bajtówStwierdzono, że klasyczne podejście jest krótsze niż OOP:
Odczytuje ciąg oddzielony przecinkami
STDIN
.Prosty sposób OOP ( 77 bajtów ):
Edycje
strtotime
zamiastDateTime
.strtotime
w zmiennej. Dzięki Blackhole .źródło
<?=
zamiastecho
.VBA, 69 bajtów
źródło
psql, 75 bajtów
(74-znakowy kod + 1-znakowa opcja wiersza poleceń)
psql
jest 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:
źródło
MATL, 5 bajtów
Jest to to samo, co odpowiedź StewieGriffin, tyle że użyłem
flip
wtedydiff
zamiast negowaćdiff
wynik.Pełne wyjaśnienie wraz z odpowiednimi funkcjami Matlaba:
źródło
o
tejdatenum
funkcji :-DPowerShell v2 +,
5044 bajtówStaje argumentu wejściowego jako ciąg, dzieli go na przecinek, potem rury tablica poprzez wbudowany alias
date
skrótGet-Date
przekonwertować nasze struny do .NET datetime format. Te dwie daty są następnie zapisywane jednocześnie w$a
i$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
-split
jeszcze, a tym bardziej złożonej funkcjonalności daty .NET.źródło
Excel, 25 bajtów
Excel automatycznie obsługuje ciągi jako daty.
źródło
Jolf , 33 bajty
Działa tylko w Chrome. Niekonkurencyjne, ponieważ aktualizacja języka po pytaniu data. Bardziej szczegółowe wyjaśnienie dodam później.
"Wyjaśnienie"
źródło
MATLAB, 59 bajtów
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 ...
źródło
Python 2,
109113 bajtówźródło
T-SQL + SQLCMD, 51 bajtów
Testowane z SQL Server 2008R2. $ (I) zostaje zastąpione danymi wejściowymi podanymi jako argument wiersza poleceń.
Przykładowy przebieg:
źródło
Mathematica, 61 bajtów
Podstawowe odejmowanie dat.
źródło
Perl,
9186 + 2 dla flag np. 88 bajtówużyj Date :: Calc qw (Delta_Days); ($ a, $ b) = split (/, /); $ _ = Delta_Days (split (/ - /, $ b), split (/ - /, $ a))Przykład
źródło
jq, 50 bajtów
(Kod 49 znaków + opcja wiersza poleceń 1 znak)
Przykładowy przebieg:
Test online (Przekazanie
-R
adresu URL nie jest obsługiwane - więc dane wejściowe zostały przekazane jako ciąg „2015-12-3,2013-12-3”).źródło
Mathematica, 56 bajtów
Większość funkcji daty (wszystkie?) Spróbuje automatycznie parsować dane wejściowe ciągu.
źródło
Japt , 13 bajtów
Spróbuj
źródło
C # .NET , 148 bajtów
Wypróbuj online
źródło