Найкоротший сценарій, який дає час, що минув з часової позначки Unix


9

Що потрібно зробити, щоб виграти цей виклик, - це написати найкоротший сценарій "timeago", який видає кількість десятиліть, років, тижнів, днів, годин, секунд між заданою часовою міткою Unix та часом запуску сценарію.

Ви повинні вказати різницю у часі в "найнижчих термінах", наприклад, 1 weekні 7 days, 9 yearsні 0 decades 9 years. Ви також повинні правильно використовувати множинні форми, наприклад, 1 dayні 1 days.

Ваш сценарій повинен бути точним до плюс-мінус 1 секунди (тому точний метод другого округлення є неважливим).

Time Equivalency Table
1 decade = 10 years
1 year = 31536000 seconds (not technically correct but close enough)
1 week = 7 days
1 day = 24 hours
1 hour = 60 minutes
1 minute = 60 seconds

Вихід повинен мати форму

A decade(s) B year(s) C week(s) D day(s) E hour(s) F minute(s) G second(s)

де A...Gвсі невід’ємні цілі числа і sє тільки для множини.

Примітки

  • Мітка часу завжди буде часом із минулого. Це може бути негативним.
  • Введення та вихід можуть бути будь-якими розумними: stdin / stdout, функція введення та повернення значення тощо.
  • Ви не можете використовувати будь-які інструменти, які вже роблять це. тобто, якщо у вашій мові є timesince(timestamp)вбудована функція, ви можете не використовувати цю функцію.

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

Зважаючи на те, що минуло достатньо часу з останньої відповіді, я оголошую переможцем цього контексту Three If By Whiskey із його 177 байтовою реалізацією Ruby!


2
"У випадку Javascript JQuery заборонено: P Все інше нормально." - Чи дозволено це Zepto ?
Джон Дворак

4
Специфікація якась бідна. Укажіть, будь ласка, точне визначення того, що він повинен робити - прикладу реалізації недостатньо.
Джон Дворак

1
Чи є Timeago новою мовою сценаріїв? Чи є оновлення кожні 30 секунд необов’язковим (як зазначено в одному місці) або вимогою (як зазначено в іншому)? Які механізми вводу / виводу прийнятні? Яке округлення слід використовувати? Зокрема, як округлення взаємодіє із періодами часу зі змінною тривалістю, такими як календарні місяці та роки? Деякі з них можуть означати подальші запитання, залежно від ваших відповідей.
Пітер Тейлор

1
@Abdossam Я знаю, що всі ми здаємося досить метушливими, але це тому, що питання на цьому веб-сайті повинні мати об'єктивні критерії виграшу та чітку специфікацію .
Захоплення Кальвіна

1
Дві пропозиції: 1) Залиште частину HTML. Напевно, ніхто не хоче написати HTML-аналізатор, перш ніж зможе вирішити справжнє завдання часу друку. 2) Дайте зрозуміти, що ви обмежуєтесь "секундами", "хвилинами (хвилинами)", "годиною (ами)" та "днями". Ви можете додати "тиждень (и)", якщо бажаєте. Але місяці і роки не такі чітко визначені (28-31 день / 365 або 366 днів ...). Це має вирішити основні проблеми з цього питання з моєї точки зору.
Фалько

Відповіді:


2

Рубі, 184 177

->n{x=Time.now.to_i-n;d=[3650*y=86400,365*y,7*y,y,3600,60,1];(0..6).map{|i|c=x/d[i];(x%=d[i]*c;"#{c} #{%w[decade year week day hour minute second][i]}#{c<2?'':'s'}")if c>0}*' '}

Тут немає нічого особливо розумного, але я підозрюю, що він все ще дуже близький до оптимального.

Приклад виконання

p ->n{x=Time.now.to_i-n;d=[3650*y=86400,365*y,7*y,y,3600,60,1];(0..6).map{|i|c=x/d[i];(x%=d[i]*c;"#{c} #{%w[decade year week day hour minute second][i]}#{c<2?'':'s'}")if c>0}*' '}[0]
"4 decades 4 years 41 weeks 3 days 14 hours 20 minutes 48 seconds"

2

J, 165

;' '&,@":&.>@((#~([:*&>{."1))@((;:' decades years weeks days hours minutes seconds')(],.([}.~[:-1=])&.>)<"0@(_ 10 52 7 24 60 60&#:)@(-~([:".@}:[:2!:0'date +%s'"_))))

Можливо, може бути більше гольфу. Використовує дату виклику оболонки для отримання поточного часу епохи Unix, оскільки епоха Unix недоступна в J.

Приклад виконання:

;' '&,@":&.>@((#~([:*&>{."1))@((;:' decades years weeks days hours minutes seconds')(],.([}.~[:-1=])&.>)<"0@(_ 10 52 7 24 60 60&#:)@(-~([:".@}:[:2!:0'date +%s'"_)))) 0
4 decades 4 years 41 weeks 3 days 12 hours 54 minutes 1 second

2

Пітон - 183

import time;t=int(time.time()-input());d=86400
for f,u in zip((3650*d,365*d,7*d,d,3600,60,1),'decade year week day hour minute second'.split()):
 if t/f:print`t/f`,u+'s'*(t/f>1),;t%=f

Вихід за мітку часу 999996400 секунд:

3 decades 1 year 37 weeks 46 minutes 39 seconds

1

JavaScript, 392

t=function(c){i=function(){var a=+new Date/1e3-c,b=document;29>a?b.write("just now"):60>a?b.write((a|0)+" seconds ago"):60<a&&120>a?b.write("1 minute ago"):60>a/60?b.write((a/60|0)+" minutes ago"):60<a/60&&120>a/60?b.write("1 hour ago"):24>a/3600?b.write((a/3600|0)+" hours ago"):24<a/3600&&48>a/3600?b.write("1 day ago"):1<=a/86400&&b.write((a/86400|0)+" days ago")};i();setInterval(i,3e4)};

Також незмінений код для допитливих

t = function(timestamp){

i = function() {
var diff = (+new Date/1e3)-(timestamp),
d = document;

    if( (diff) < 29) {

        d.write( 'just now' )
    }
    else if( diff < 60) {

        d.write( ( (diff) |0 ) + ' seconds ago' )
    }
    else if( diff > 60 && diff < 120) {
        d.write(  '1 minute ago' )
    }
    else if( (diff)/60 < 60) {
        d.write( ( (diff)/60 |0 ) + ' minutes ago' )
    }
    else if( (diff)/60 > 60 && (diff)/60 < 120) {
        d.write( '1 hour ago' )
    }
    else if( (diff)/3600 < 24) {
        d.write( ( (diff)/3600 |0 ) + ' hours ago' )
    }
    else if( (diff)/3600 > 24 && (diff)/3600 < 48) {
        d.write( '1 day ago' )
    }
    else if( (diff)/86400 >= 1) {
        d.write( ( (diff)/86400 |0 ) + ' days ago' )
    }
  }

i()

setInterval(i, 3e4)

}

Він оновлюється кожні 30 секунд і обчислює як однину, так і множину.

Для його запуску використовуйте t(unix_timestamp)


Чи не слід використовувати позначення жирної стрілки?
гордий haskeller

@ user965091 Будь ласка, уникайте звинувачення без будь-яких доказів через публічні коментарі щодо незв’язаних публікацій; якщо ви думаєте, що хтось використовує акаунт шкарпетки, позначте їхню посаду для уваги модератора. Я не бачу абсолютно жодних причин підозрювати будь-які сюрпризи, і навіть якби вони були, така дискусія не повинна бути публічною.
Doorknob

@ user965091 Я не бачу, як будь-який коментар тут можна вважати "провокацією". У будь-якому випадку грубість не допускається в мережі Stack Exchange . Будь ласка, намагайтеся залишатися ввічливими до всіх користувачів, незалежно від того, чи підозрюєте ви, що вони порушують правила, або з будь-якої іншої причини.
Дверна ручка

1

Javascript, 287

function p(e,n){return e>2?e+" "+n+"s ":e+" "+n+" "}function t(e){n=new Date/1e3,l=e-n,c=1,m=60,h=60*m,d=24*h,w=7*d,y=365*d,a=10*y,s="",v={a:"Decade",y:"Year",w:"Week",d:"Day",h:"Hour",m:"Minute",c:"Second"};for(i in v)k=v[i],i=window[i],(r=Math.floor(l/i))>0&&(s+=p(r,k)),l%=i;alert(s)}

для запуску використання t(secondsInFuture);


1
Коли я біжу, t(10)я просто порожній alert.
Інго Бюрк

Фу, забув секунди, дякую @ IngoBürk. Щоб було зрозуміло їїt(new Date()/1000 + 10);
Перемога

Використовуйте позначення жирної стрілки ES6, також eval(i)на 2 байти коротше, ніж window[i].
nyuszika7h

0

Javascript, 263

i=[315360000,31536000,604800,86400,3600,60,1];s=['decade','year','week','day','hour','minute','second'];function g(d){return p(parseInt((new Date().getTime()-d)/1000), 0);}function p(d,n){k=d-d%i[n];r=k/i[n];return (r>0?r+' '+s[n]+'(s) ':'')+(n<6?p(d-k,n+1):'');}

для запуску з консолі Javascript, зателефонуйте

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