Скільки часу до цієї дати?


11

Ідея така: Напишіть функцію для друку відрізку часу від теперішньої / сьогоднішньої дати (у той час, коли функція викликається) до дати, поданої як аргумент.

Припущення:

  • Дата введення завжди буде завтра чи пізніше, у майбутньому.
  • Дата введення ніколи не буде більше 10 років у майбутньому.

Правила:

  • Вихід повинен бути у такому форматі: "[z рік (и)], [х місяць (и)], y день (и) до -введення дати-"
  • Часові рамки виходу (день / місяць / рік) повинні бути множині правильно. тобто 1 monthне1 months
  • Введення даних може бути у будь-якому форматі дати, який ви бажаєте (3/15/12 - 15 березня 2012 - 2012.03.15).

Приклад: Припускаючи, що програма запускається 15 березня 2012 року:

  • Дата введення 3/20/12=5 days until 3/20/12
  • НЕ дата введення 4/16/12=1 month, 1 days until 3/20/12
  • Дата введення 2012.04.20=1 month, 5 days until 2012.04.20
  • НЕ дата введення 2012.04.20=36 days until 2012.04.20
  • Дата введення 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • Дата введення 3/15/13=1 year until 3/15/13

Це кодовий гольф, тому найкоротший код виграє.

Я маю на увазі, що для закінчення строку я виберу відповідь на те:

23 березня 2012 року!

(Це моє перше CG питання, тому я буду радий виправити будь-які помилки з мого боку!)


3
Wolfram | Альфа 10 символів:: now until <input time> p
Гриффін

3
@Griffin 4 ч .:now-<input time>
PhiNotPi

1
@PhiNotPi добре зіграний, добрий сер.
Гриффін

2
Чи добре сказати "1 день до 16.03.12"?
MrZander

1
Як працювати зі стрибковими єрами у відповідь? Через 10 років буде 2 дні помилка. Скільки місяця?
Hauleth

Відповіді:


3

R, 99 символів

Я знаю, що це свого роду обман, але R - це все про його пакети, і мастило так зручно для подібних завдань!

f=function(x){library(lubridate);cat(show(as.period(interval(mdy("3/15/2012"),mdy(x)))),"until",x)}

Використання:

f("10/31/2017")
[1] 5 years, 7 months and 16 days 
5 years, 7 months and 16 days  until 10/31/2017

1

PHP, 315 символів

function p($z)
{
list($d,$m,$y)=explode("/",$z);
$d=$d-date("d");
$n=$m-1;
$m=$m-date("m")-($d<0);
$d=$d+($d<0)*($n>7^$n&1)+27+($n-2?3:($y%4?1:($y%100?2:($y%400?1:2))));
$y=$y-date("Y")-($m<0);
$s="s ";
echo ($y?$y." year".$s[$y<2]:"")." ".($m?$m." month".$s[$m<2]:"")." ".($d?$d." day".$s[$d<2]:"")." until ".$z;
}

Використання:

p("11/03/2006");

Дати приймає у dd/mm/yyyyформаті. Я використовував підрахунок довжини місяця Гріффіна ( знову ), хоча мені довелося вставити додаткові дужки в нього, щоб зробити пріоритет належним чином. Я також залишив кілька перерв рядків, щоб зробити їх легше читати.


1

Рубін (213)

приймає дати в будь-якому форматі, Date.parseприймає. Пробував просто зyyyy-mm-dd

def u s
t=Date.today
f=Date.parse s
[[0,'year'],[0,'month'],[0,'day']].map{|c,n| while t<f 
c+=1
t=t.send"next_#{n}"
end
c,t=c-1,t.send("prev_#{n}")if t>f
[c,n+(c>1??s:'')]*' 'if c>0}.compact*', '+' until '+s
end

щоб також отримати тижні, додайте:

['prev_','next_'].each{|n|Date.send(:define_method,n+'week'){send n+'day',7}}

і [0,'week'],(між місяцем і днем). дні тоді завжди будуть< 7


яку рубінову версію ви використовуєте .... Я намагався запустити ваш код на ruby1.9.2p0, але це дає мені помилку uninitialized constant Object::Date (NameError)... Я думаю, ви використовуєте Dateклас Rails
Rohit

@Rohit 1.9.3, не використовуючи матеріали Rails. Дата rdoc
jsvnm

Я бачив документа раніше .. але був розгублений у зв'язку з отриманою помилкою ... Я все ще не можу зрозуміти, чому я отримую цю помилку. Я на Windows 7 64-розрядний, ruby192p0
Rohit

@rohit спробувати з 193?
jsvnm

1

VBA: 766 631 знаків

Завдяки mellamokb за допомогу скоротити створення рядків і IIf.

Function k(i)
e=" month"
g="s"
n=Now()
r=Month(n)
s=Month(i)
t=DateSerial(Year(i),s,1)
u=DateSerial(Year(i),s-1,1)
v=Day(n)
w=Day(i)
x=DateSerial(Year(n),r,1)
d=t-u-v+w
For y=0 To 10
If Year(DateAdd("yyyy",-1*y,i))=Year(n) Then Exit For
Next
y=IIf(s=1,y-1,y)
z=s-r
z=IIf(z<0,z+12,z)
For m=0 To z
If Month(DateAdd("m",-1*m,i))=r Then Exit For
Next
d=IIf(v<=w,w-v,d)
m=IIf(v>w,m-1,m)
If y Then a=y & " year" & Left(g,y-1)
a=IIf((m Or d) And y,a & ",",a)
If m Then b=IIf(d,m & e & Left(g,m-1) & ",",m & e & Left(g,m-1))
If d Then c=IIf(d>1,d & " days",d & " day")
k=Trim(Trim(a & " " & b) & " " & c) & " until " & i & "."
End Function

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

Це було для мене веселою вправою!


1
Це не зовсім вина VBA, є кілька хороших способів поєднати логіку у своєму коді :) Наприклад, If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"можна поєднати їх разом доa = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb Дуже добре. Я погляну на це і репостую!
Гаффі

У мене була проблема з деякими тестовими, а саме 1 year, 1 month, 1 day. Я виправив це у відповіді. Це фактично зроблено для коротшого коду!
Гаффі

І після публікації оновлення я бачу, що я можу змінитись If v < w Then d = w - v:If v = w Then d = 0на If v <= w Then d = w - vекономію додаткових 20 символів. Я оновлю відповідь, якщо у мене будуть більш значні зміни в публікації.
Гаффі

Я думаю, що я можу це зробити краще з масивами ... Погляну ще й, можливо, додам ще одну відповідь ...
Gaffi

1

JavaScript (ES6), 125 байт

Оскільки у відповіді Паоло використовується зовнішня бібліотека, я буду робити те саме. Node.js - це все про NPM-пакети і момент + HumanizeDuration настільки зручний для цього завдання!

Середовища вузлів

m=require('moment'),f=d=>console.log(require('humanize-duration')(m(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

Середовище браузера

Оскільки бібліотеки оголошують глобальні змінні, це насправді трохи коротше (102 байти). Не ясно, чи потрібно мені включати теги скриптів, необхідні для завантаження в сторонній JavaScript, тому я офіційно буду рахувати Node.

f=d=>console.log(humanizeDuration((m=moment)(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

CoffeeScript, також 125 байт

f=(d)->console.log require('humanize-duration')((m=require 'moment')(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d

1

PHP, 151 символів

function p($z){$n=date_create(date('Y-m-d'));$d=date_create($z);$i=date_diff($n,$d);print($i->format('%R%y years, %m months, and %a days until '.$z));}

У ньому відсутні множини і не підраховуються правильно, оскільки format () не віднімає дні від місяців ... У мене було подібне рішення і з PHP.
powtac

Це моє рішення PHP, але все ще бракує згаданої раніше помилки: echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');його довжина 92 символи, коли викликається в командному рядку.
powtac
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.