Unix zaman damgasından bu yana geçen süreyi veren en kısa komut dosyası


9

Bu meydan okumayı kazanmak için yapmanız gereken şey, belirli bir Unix zaman damgası ile komut dosyasının çalıştırıldığı zaman arasında onlarca yıl, yıl, hafta, gün, saat, dakika ve saniye sayısını veren en kısa "timeago" komut dosyasını yazmaktır .

Sen örneğin, "en düşük terimleri" saat farkını vermelidir 1 weekdeğil 7 days, 9 yearsdeğil 0 decades 9 years. Ayrıca örneğin, doğru çoğul formları kullanmanız gerekir 1 daydeğil 1 days.

Komut dosyanız artı veya eksi 1 saniye içinde doğru olmalıdır (bu nedenle tam ikinci yuvarlama yöntemi önemsizdir).

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

Çıktı şu biçimde olmalıdır:

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

burada A...Gnegatif olmayan tamsayılar vardır ve syalnızca çoğullar için vardır.

notlar

  • Zaman damgası her zaman geçmişten bir zaman olacaktır. Olumsuz olabilir.
  • Giriş ve çıkış makul bir şey olabilir: stdin / stdout, işlev giriş ve dönüş değeri, vb.
  • Bunu zaten yapan herhangi bir araç kullanamazsınız. örneğin, dilinizde timesince(timestamp)yerleşik bir işlev varsa, bu işlevi kullanamayabilirsiniz.

Bunu, net olmayan soruları olan yeni kullanıcılar ve mükemmellik isteyen eski kullanıcılar arasındaki biraz saçma savaşı varsaymayı umut etmek için bunu büyük ölçüde düzenledim. (Şimdi çok benzer olabilir ama Korkunç bir soru değildi bu ).

Son cevaptan bu yana yeterli zaman geçtiği göz önüne alındığında , 177 byte Ruby uygulamasıyla Three If By Whiskey bu bağlamın galibi ilan ediyorum !


2
"Javascript JQuery için yasak: P Diğer herşey yolunda." - Peki Zepto'ya izin veriliyor mu?
John Dvorak

4
Spec biraz zayıf. Lütfen ne yapması gerektiği konusunda kesin bir tanım sağlayın - örnek bir uygulama yeterli değildir.
John Dvorak

1
Timeago yeni bir betik dili mi? Her 30 saniyede bir güncelleme (bir yerde belirtildiği gibi) veya bir gereksinim (başka bir yerde belirtildiği gibi) mı? Hangi G / Ç mekanizmaları kabul edilebilir? Hangi yuvarlama kullanılmalıdır? Özellikle yuvarlama, takvim ayları ve yılları gibi değişken uzunluktaki zaman periyotlarıyla nasıl etkileşime girer? Bunlardan bazıları cevaplarınıza bağlı olarak takip soruları anlamına gelebilir.
Peter Taylor

1
@Abdossam Hepimizin oldukça telaşlı göründüğünü biliyorum, ancak bu sitedeki soruların objektif kazanma kriterleri ve net bir spesifikasyona sahip olması gerekiyor .
Calvin'in Hobileri

1
İki öneri: 1) HTML bölümünü dışarıda bırakın. Sanırım kimse baskı zamanlarının gerçek görevini yerine getirmeden önce bir HTML ayrıştırıcısı yazmak istemiyor. 2) "Saniye", "dakika (lar)," saat (ler) "ve" gün (ler) "ile sınırlandırdığınızdan emin olun. İsterseniz "hafta (lar)" ekleyebilirsiniz. Ancak aylar ve yıllar net olarak tanımlanmamıştır (28-31 gün / 365 veya 366 gün ...). Bu, benim görüşüme göre bu soru ile ilgili büyük endişeleri düzeltmelidir.
Falko

Yanıtlar:


2

Yakut, 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}*' '}

Burada özellikle zekice bir şey yok, ama bunun hala optimal seviyeye çok yakın olduğundan şüpheleniyorum.

Örnek çalışma

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'"_))))

Muhtemelen daha fazla golf edilebilir. Unix dönemi J'de kullanılamadığından, geçerli unix dönemini almak için bugüne kadar bir kabuk çağrısı kullanır.

Örnek çalışma:

;' '&,@":&.>@((#~([:*&>{."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

Python - 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

Geçmişte 999996400 saniye zaman damgası çıktısı:

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

Ayrıca meraklıların kodlanmamış kodu

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)

}

Her 30 saniyede bir güncellenir ve hem tekil hem de çoğul hesaplar.

Çalıştırmak için şunu kullanın: t(unix_timestamp)


Şişman ok gösterimi kullanmamalı mısınız?
gururlu haskeller

@ user965091 İlgisiz gönderiler hakkındaki herkese açık yorumlar yoluyla herhangi bir kanıt olmadan suçlamaları atmaktan kaçının; birinin çorap hesabı kullandığını düşünüyorsanız moderatörlerin dikkatini çekmek için bir gönderiyi işaretleyin. Burada herhangi bir çorap üreticisinden şüphelenmek için hiçbir neden görmüyorum ve olsa bile, böyle bir tartışma kamuoyunda yapılmamalıdır.
Kapı tokmağı

@ user965091 Buradaki yorumlardan herhangi birinin "provokasyon" olarak nasıl değerlendirilebileceğini görmüyorum. Her halükarda, Stack Exchange ağında edimsizlik tolere edilmez . Lütfen kuralları ihlal ettiğinden veya başka bir nedenden dolayı şüphelendiğinizden bağımsız olarak tüm kullanıcılara karşı nazik olmaya çalışın .
Kapı tokmağı

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

kullanımı çalıştırmak t(secondsInFuture);


1
Koştuğumda t(10)boş oluyorum alert.
Ingo Bürk

Ugh, saniyeler unuttum, teşekkürler @ IngoBürk. Açık olmak gerekirset(new Date()/1000 + 10);
Zafer

ES6'nın yağ ok gösterimini kullanın, ayrıca eval(i)2 bayt daha kısadır 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 konsolundan çalıştırmak için arayın

g(unixTimestamp);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.