Самый короткий скрипт, который дает время, прошедшее с отметки времени 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 Whisky с его реализацией Ruby 177 байтов победителем этого контекста!

Адам Барак
источник
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
jpjacobs
источник
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)

user965091
источник
Разве вы не должны использовать жирную стрелку?
гордый haskeller
@ user965091 Пожалуйста, избегайте выдвигать обвинения без каких-либо доказательств с помощью публичных комментариев по постам; если вы считаете, что кто-то использует учетную запись sock, пометьте его сообщение модератором. Я не вижу абсолютно никаких оснований подозревать здесь какое-либо марионетку, и даже если бы она была, такая дискуссия не должна проводиться публично.
Дверная ручка
@ 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);
DaveMorganTexas
источник