Як давно це було?


9

Як давно це було?

Правила

  • Кожне подання повинно бути повноцінною програмою.
  • Програма повинна приймати дані у вигляді двох дат, розділених комами YYYY-MM-DD, та друкувати кількість днів, що минули після другої дати, до STDOUT так, як ніби сьогодні була перша дата (якщо друга дата буде надалі, виведіть a від’ємне число) плюс необов'язковий кінцевий новий рядок, і більше нічого. Припустимо, що обидві дати є в григоріанському календарі.
  • Програма не повинна нічого писати на 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

Знімок

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як таблиця лідерів та б) як список переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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 дати JDK, а натомість JodaTime, хоча технічно це зовнішня бібліотека).
Руслан

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

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або $( )збитою, в основному тому, що для підрозділу перед діленням немає дужок.

Введення через 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]))

Безголівки:

# 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.
Marth

Ви можете вийняти 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 байт із пропозицією манатурки.

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

Перевірте це в Інтернеті

Безумовно

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 Не впевнений, чи дозволено це.
Васу Адарі

Правило полягає в тому, що мінімальна необхідність, необхідна для передачі коду (у випадку з Ruby -e), безкоштовна, все інше повинно бути включено до підрахунку. Існують різні думки щодо того, що саме таке все інше. Наприклад, деякі учасники включають символ простору роздільника параметрів і лапки навколо значень параметрів. На мій погляд, слід враховувати лише те, що насправді передається інтерпретатору, зайвих символів, необхідних для синтаксису оболонки, немає. Але не можу згадати жодного голосу, піднятого для заборони використання параметрів.
манатство

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
Як я можу забути про відмінності ... Можна також просто видалити моє подання, оскільки воно по суті те саме, але натомість з двома дзвінками до датену.
slvrbld

1
Великий вибір формату введення!
Луїс Мендо

2

Javascript ES6, 63 байти

Випробуваний на хромі.

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

кома відокремлена від запитання
ev3commander

@ ev3commander Так, я це просто виправив.
SuperJedi224

2
@ SuperJedi224 Так. Firefox дає недійсну дату , в той час як хром радісно протікає.
Conor O'Brien

5
Я би наголосити на цьому 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 байт

Виявлено, що класичний підхід коротший, ніж OOP:

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

Читає рядок, відокремлений комами STDIN.


Прямий шлях OOP ( 77 байт ):

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

Правки

  • Збережено 13 байт за допомогою, strtotimeа не DateTime.
  • Збережено 1 байт , зберігаючи strtotimeв змінній. Завдяки Blackhole .

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


1

psql, 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

Це те саме, що відповідь StewieGriffin, за винятком того, що я використовував 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 datetime. Ці дві дати потім зберігаються одночасно у $aта $b. Потім ми використовуємо оператор перевантаженого віднімання, щоб відняти другий від першого і вивести .Daysйого.

Golfed 6 байт завдяки TessellatingHeckler .

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


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

Дуже простий підхід: введення потрібно подавати як рядок із вікна команди. Потім вхідний рядок розділяється і кількість днів між датами (і нічого іншого) обчислюється з номерів серійних дат. Я впевнений, що є спосіб уникнути необхідності виклику датену двічі, хоча ...


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

Математика, 61 байт

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

Основне віднімання дати.


0

Perl, 91 86 + 2 для np-прапорів, 88 байт

використовувати дату :: Calc qw (Delta_Days); ($ a, $ b) = спліт (/, /); $ _ = Delta_Days (спліт (/ - /, $ b), спліт (/ - /, $ а))

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

On-line тест (проходження -Rчерез URL-адресу не підтримується, тому введення передано як рядок "2015-12-3,2013-12-3".)


0

Математика, 56 байт

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

Більшість функцій (усіх?) Дат намагаються автоматично проаналізувати введення рядків на дати.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.