Skrip terpendek yang memberikan waktu berlalu sejak cap waktu Unix

9

Apa yang perlu Anda lakukan untuk memenangkan tantangan ini adalah menulis skrip "timeago" terpendek yang menampilkan jumlah dekade, tahun, minggu, hari, jam, menit, dan detik antara cap waktu Unix yang diberikan dan waktu skrip dijalankan.

Anda harus memberikan perbedaan waktu dalam "istilah terendah", mis. 1 weekTidak 7 days, 9 yearstidak 0 decades 9 years. Anda juga harus menggunakan bentuk jamak dengan benar, misalnya 1 daytidak 1 days.

Skrip Anda harus akurat dalam plus atau minus 1 detik (sehingga metode pembulatan kedua yang tepat tidak penting).

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

Outputnya harus dalam bentuk

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

di mana A...Gsemua bilangan bulat non-negatif dan shanya ada untuk bentuk jamak.

Catatan

  • Stempel waktu akan selalu berupa waktu dari masa lalu. Mungkin negatif.
  • Input dan output mungkin masuk akal: stdin / stdout, input fungsi dan nilai pengembalian, dll.
  • Anda tidak boleh menggunakan alat apa pun yang sudah melakukan ini. yaitu jika bahasa Anda memiliki timesince(timestamp)fungsi bawaan, Anda mungkin tidak menggunakan fungsi itu.

Saya telah sangat mengedit ini untuk membuatnya lebih jelas dengan harapan untuk meredakan pertempuran yang agak konyol antara pengguna baru dengan pertanyaan tidak jelas dan pengguna lama yang membutuhkan kesempurnaan. Itu bukan pertanyaan yang mengerikan (meskipun sekarang mungkin terlalu mirip dengan ini ).

Mengingat waktu yang cukup terlewati sejak jawaban terakhir, saya menyatakan Three If By Whiskey dengan 177 byte implementasi Ruby pemenang konteks ini!

Adam Barak
sumber
2
"Dalam kasus Javascript JQuery dilarang: P Segala sesuatu yang lain ok." - Apakah Zepto diizinkan?
John Dvorak
4
Speknya agak buruk. Harap berikan definisi yang tepat tentang apa yang seharusnya dilakukan - contoh implementasi tidak cukup.
John Dvorak
1
Apakah Timeago beberapa bahasa scripting baru? Apakah memperbarui setiap 30 detik opsional (sebagaimana dinyatakan di satu tempat) atau persyaratan (sebagaimana dinyatakan di tempat lain)? Mekanisme I / O apa yang dapat diterima? Pembulatan apa yang harus digunakan? Secara khusus, bagaimana pembulatan berinteraksi dengan periode waktu panjang variabel seperti bulan dan tahun kalender? Beberapa di antaranya mungkin menyiratkan pertanyaan tindak lanjut tergantung pada jawaban Anda.
Peter Taylor
1
@Abdossam Saya tahu kita semua tampak sangat cerewet tapi itu karena pertanyaan di situs ini seharusnya memiliki kriteria kemenangan yang objektif dan spesifikasi yang jelas .
Calvin Hobbies
1
Dua saran: 1) Tinggalkan bagian HTML. Saya kira tidak ada yang mau menulis parser HTML sebelum dapat menangani tugas sebenarnya dari waktu pencetakan. 2) Jelaskan bahwa Anda membatasi "detik", "menit", "jam" dan "hari". Anda dapat menambahkan "minggu" jika diinginkan. Tetapi bulan dan tahun tidak begitu jelas (28-31 hari / 365 atau 366 hari ...). Ini harus memperbaiki masalah utama dengan pertanyaan ini menurut saya.
Falko

Jawaban:

2

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

Tidak ada yang pintar di sini, tapi saya kira itu masih sangat dekat dengan optimal.

Contoh dijalankan

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"
Three If By Whiskey
sumber
2

J, 165

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

Mungkin bisa bermain golf lebih banyak. Menggunakan panggilan shell to date untuk mendapatkan waktu unix zaman saat ini, karena zaman Unix tidak tersedia di J.

Contoh dijalankan:

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

Output untuk cap waktu 999996400 detik di masa lalu:

3 decades 1 year 37 weeks 46 minutes 39 seconds
Falko
sumber
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)};

Juga kode unminified untuk yang ingin tahu

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)

}

Ini memperbarui setiap 30 detik dan menghitung tunggal dan jamak.

Untuk menjalankannya gunakan t(unix_timestamp)

pengguna965091
sumber
Bukankah Anda seharusnya menggunakan notasi panah gemuk?
haskeller bangga
@ user965091 Harap menghindari tuduhan tanpa bukti melalui komentar publik pada posting yang tidak terkait; jika Anda berpikir seseorang menggunakan akun kaus kaki, beri tanda pada pos mereka untuk perhatian moderator. Saya sama sekali tidak melihat alasan untuk mencurigai adanya sockpuppetry di sini, dan bahkan jika ada, diskusi seperti itu tidak boleh dilakukan di depan umum.
Gagang Pintu
@ user965091 Saya tidak melihat bagaimana komentar di sini dapat dianggap "provokasi." Dalam kasus apa pun, kekasaran tidak ditoleransi pada jaringan Stack Exchange . Cobalah untuk tetap sopan kepada semua pengguna, terlepas dari apakah Anda curiga mereka melanggar aturan atau karena alasan lain.
Gagang Pintu
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)}

untuk menjalankan penggunaan t(secondsInFuture);

Kemenangan
sumber
1
Ketika saya menjalankan t(10)saya hanya mendapatkan yang kosong alert.
Ingo Bürk
Ugh, lupakan yang kedua, terima kasih @ IngoBürk. Untuk menjadi jelast(new Date()/1000 + 10);
Victory
Gunakan notasi panah lemak ES6, juga eval(i)2 byte lebih pendek dari 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):'');}

untuk menjalankan dari konsol Javascript, panggil

g(unixTimestamp);
DaveMorganTexas
sumber