Как давно это было?


9

Как давно это было?

Правила

  • Каждое представление должно быть полной программой.
  • Программа должна принять входные данные как две разделенные запятыми даты в форме YYYY-MM-DDи вывести количество дней, прошедших со второй даты, в STDOUT, как если бы сегодня была первая дата (если вторая дата будет в будущем, выведите отрицательное число) плюс дополнительный завершающий перевод строки и ничего больше. Предположим, что обе даты в григорианском календаре.
  • Программа не должна ничего писать в STDERR.

    Обратите внимание, что должен быть переводчик, чтобы представление можно было проверить.

  • Представления оцениваются в байтах в соответствующей (ранее существующей) кодировке, обычно (но не обязательно) UTF-8. Некоторые языки, такие как папки , немного сложнее - если есть сомнения, пожалуйста, спросите на Meta .
  • Это так выигрывает самый короткий код

    Примеры

Входные данные:

2015-12-03,2015-12-01

Вывод:

2

Входные данные:

2015-12-03,2014-12-01

Вывод:

367

Входные данные:

2015-12-03,2013-12-03

Вывод:

730

Фрагмент

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде таблицы лидеров и б) в виде списка победителей по языкам.

Чтобы убедиться, что ваш ответ отображается, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:

## [><>](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
Разрешено ли нам использовать внешние библиотеки? Единицы, которые распространены в данной экосистеме, но не являются частью стандартной библиотеки? (Например, никто не использует API-интерфейсы Date JDK, кроме JodaTime, хотя технически это внешняя библиотека).
Руслан

Я предполагаю, что все используют UTC, поскольку в моем часовом поясе разница между 2015-11-01T00: 00: 00 и 2015-11-02T00: 00: 00 составляла всего ~ 0,96 дней (23 часа) из-за перехода на летнее время. Вы ничего не упомянули о округлении дробных дней, поэтому, возможно, вы захотите уточнить это в вопросе. (Я думаю, что многие библиотеки datetime по умолчанию используют местное время.)
ThisSuitIsBlackNot

1
Как обстоят дела с високосными годами?
TheCoffeeCup

@TheCoffeeCup они должны быть обработаны
ev3commander

Ответы:


1

TeaScript , 24 байта

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

Использует Date.parseдля анализа даты, а затем получить разницу и делит.

Попробуйте онлайн

Объяснение && 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

Утилиты Bash + GNU, 37

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

trзаменяет запятую на новую строку. dateчитает разделенные новой строкой даты и выводит количество секунд, прошедших с начала эпохи Unix, которые представляет перенесенная дата. Эти числа затем помещаются в dcстек. Тогда это просто вопрос вычитания и делить на (24 * 60 * 60). В этом случае dcарифметическая оценка RPN на основе стека лучше, чем bcили bash $( ), в основном потому, что для вычитания перед делением не нужны скобки.

Ввод через 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

Юлия, 67 байт

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)

Вместо этого -diff(d)[1]вы можете использовать -(d...)для сохранения пару байтов. Кстати, какую версию Юлии вы используете? На 1.2 мне пришлось явно импортировать, Datesи я также не могу просто конвертировать дни в целые числа, как это.
Симеон Шауб

Этот ответ был опубликован в 2015 году, поэтому, скорее всего, это была Юлия 0.3 или 0.4.
Алекс А.

4

Scala, 166 139 120 116 92 байта

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

Применение: scala [source filename].scala [date1],[date2]

Примечание. Третья версия (120 байт) использует устаревший API. Он все еще компилируется и работает нормально. Примечание 2: Спасибо комментаторам ниже за отличный совет!


Поскольку завершающая новая строка необязательна, вы можете использовать printвместо println.
Март

Вы можете удалить Object A extends App{...}часть и сохранить ее как a.scalaи запустить ее scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Гений! Спасибо!!
Руслан

3

Рубин, 69 66 65 57 55 байт

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

47 байт + 8 байт для параметра командной строки. Благодаря Дейну Андерсону, сэкономлено 2 байта.

57 байт

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

49-байтовый код + 8 байт для опции командной строки. Сохранено 8 байтов с предложением manatwork.

65 байт

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

66 байт

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

69 байт

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

Протестируйте это онлайн

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

Применение:

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

=> 730

Три маленьких символа: ','?,, '-'?-, 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'это 59 символов, как я считаю.
manatwork

@manatwork Не уверен, что это разрешено.
Васу Адари

Правило состоит в том, что минимальная необходимость, необходимая для передачи кода (в случае Ruby -e ), бесплатна, все остальное должно быть включено в счет. Есть разные мнения о том, что именно это все остальное. Например, некоторые члены включают символ пробела разделителя параметров и кавычки вокруг значений параметров. На мой взгляд, следует учитывать только то, что фактически передается интерпретатору, а дополнительные символы, необходимые для синтаксиса оболочки, - нет. Но не могу вспомнить ни одного голоса, поднятого, чтобы запретить использование опций.
manatwork

2
почти не стоит упоминать, но вы можете побрить байт, переместив повторяющийся код в процесс: t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Алексис Андерсен

2

Japt , 41 байт

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

Пока это лучшее, что я могу получить, так как все переменные $и скобки действительно убивают количество байтов.

Попробуйте онлайн

объяснение

             // 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 байт

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

Входные данные должны быть массивом ячеек, разделенных запятыми. datenumпреобразует входную ячейку в числовой массив 2x1 с отметкой времени. diffберет разницу между двумя.


Старое решение, 41 байт :

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

Ввод должен быть через запятую:

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

Любопытные способы программирования. Это работает из-за неявного приведения MATLAB между типами данных.

Выходом strsplit(input(''))является ячейка строк. Вы не можете использовать diffячейку, но, к счастью, она datenumработает, и она фактически возвращает вход ячейки обратно в числовой массив 2x1, делаяdiff возможным использование.

Вы можете указать множество разделителей strsplit, но запятая используется по умолчанию. Кроме того, по умолчанию ввод datenumв формате yyyy-mm-dd. По этим причинам многие спецификации, такие как: datenum (s, 'yyyy-mm-dd'), избегают, сохраняя большое количество байтов.

Для записи, это было бы 21 байт, если бы я мог использовать функцию:

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

1
Как я мог забыть о diff ... Можно также просто удалить мою заявку, потому что она по сути та же самая, но вместо этого с 2 вызовами datenum.
slvrbld

1
Отличный выбор формата ввода!
Луис Мендо

2

Javascript ES6, 63 байта

Проверено в хром.

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


@ ev3commander Да, я только что исправил это.
SuperJedi224

2
@ SuperJedi224 Да. Firefox дает неверную дату , в то время как Chrome счастливо продолжается.
Конор О'Брайен

5
Я бы пометил этот Chrome-специфичный, так как кажется, что он работает только в Chrome. Я думаю , что соответствует способ будет использовать Date.parseи заменить -с/
Downgoat

1
Большинство браузеров требуют добавления даты, поэтому 2015-12-03будет работать, но 2015-12-3не будет (кроме Chrome). Вопрос действительно говорит о том, что дата будет в формате, YYYY-MM-DDпоэтому, если ввод действительно следует, что он будет кроссбраузерно-совместимым, однако примеры, похоже, говорят об обратном. В любом случае, вы можете использовать Date.parseвместо того, new Dateчтобы сохранять 2 байта:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 байт

Установлено, что классический подход короче ООП:

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

Читает разделенную запятыми строку из STDIN.


Прямой путь ООП ( 77 байт ):

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

Правки

  • Сохранено 13 байтов при использовании strtotimeвместо DateTime.
  • Сохранено 1 байт путем сохранения strtotimeв переменной. Благодаря Черной дыре .

-3 байта: переместить назначения к их первому использованию в скобках (-1 байт каждый), и вы можете использовать <?=вместо echo.
Тит


1

PSL, 75 байт

(Код из 74 символов + 1 символ командной строки)

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

psqlинтерактивный терминал PostgreSQL Для соблюдения «Каждая заявка должна быть полная программа». Как правило, код читает сам ввод.

Образец прогона:

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

1

MATL, 5 байтов

iPYOd

Это то же самое , как ответ Стьюи Гриффин, за исключением я flipтогда , diffа не diffто отрицая результат.

Полное объяснение с соответствующими функциями 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
Примечание. Хотя MATL был выпущен только 12 декабря, после того, как этот вызов был опубликован, я получил ответ 9 декабря, используя предварительный компилятор MATL, который почти идентичен выпущенному компилятору, этот код тот же.
Дэвид

2
Кроме того, это ни в коем случае не является одобрением популярного портативного музыкального устройства Apple: P
Дэвид

1
Я должен был использовать oдля datenumфункции :-D
Луис Мендо

Это было бы удивительно!
Дэвид

1
@ ev3commander Большинство ответов на PPCG такие же, как и другие ответы, особенно в таких случаях, когда достаточно 4 команд.
Дэвид

1

PowerShell v2 +, 50 44 байта

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

Принимает входной аргумент в виде строки, разделяет его на запятую, а затем передает массив через встроенный псевдоним, dateсокращающий для Get-Dateпреобразования наших строк в формат даты и времени .NET. Эти две даты затем сохраняются одновременно в $aи $b. Затем мы используем перегруженный оператор вычитания, чтобы вычесть второе из первого и вывести .Daysего.

Гольф 6 байтов благодаря TessellatingHeckler .

Технически неконкурентоспособен, так как не имеет онлайн-переводчика, поскольку реализация FOSS PowerShell, Pash , находится вокруг PowerShell v0.5. Он еще не поддерживает, -splitне говоря уже о сложной функциональности даты .NET.


1

Excel, 25 байт

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

Excel автоматически обрабатывает строки как даты.


0

Джольф , 33 байта

Работает только в Chrome. Неконкурентоспособен, так как языковые обновления ставят вопрос задним числом. Я добавлю более подробное объяснение позже.

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

«Объяснение»

$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

Как насчет того, чтобы поместить в заголовок слово «неконкурентный»?
ev3commander

0

MATLAB, 59 байт

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

Очень простой подход: ввод должен быть задан в виде строки из командного окна. Затем входная строка разделяется, и количество дней между датами (и ничего больше) вычисляется из чисел серийных дат. Я вполне уверен, что есть способ избежать необходимости дважды вызывать datenum ...


0

Python 2, 109 113 байтов

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 байт

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

Протестировано с SQL Server 2008R2. $ (I) заменяется вводом в качестве аргумента командной строки.

Образец прогона:

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

0

Mathematica, 61 байт

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

Основное вычитание даты.


0

Perl, 91 86 + 2 для флагов np, 88 байт

используйте Date :: Calc qw (Delta_Days); ($ a, $ b) = split (/, /); $ _ = Delta_Days (split (/ - /, $ b), split (/ - /, $ a))

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

пример

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

0

JQ, 50 байт

(49 символов кода + 1 символ опции командной строки)

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

Образец прогона:

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

Он-лайн тест (передача -Rчерез URL не поддерживается - поэтому ввод передается в виде строки "2015-12-3,2013-12-3".)


0

Mathematica, 56 байт

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

Большинство (все?) Функций даты будут пытаться автоматически разбирать строковые входные данные на даты.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.