सबसे छोटी स्क्रिप्ट जो यूनिक्स टाइमस्टैम्प के बाद से समय देती है


9

इस चुनौती को जीतने के लिए आपको जो करने की आवश्यकता है वह है सबसे छोटी "टाइमगो" स्क्रिप्ट को लिखने के लिए जो किसी दिए गए यूनिक्स टाइमस्टैम्प और स्क्रिप्ट के चलने के बीच के दशकों, वर्षों, हफ्तों, दिनों, घंटों, मिनटों और सेकंडों की संख्या को आउटपुट करती है।

आप जैसे, "न्यूनतम मान" में समय अंतर देना चाहिए 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, function input और return value, etc.
  • आप पहले से ही ऐसा करने वाले किसी भी उपकरण का उपयोग नहीं कर सकते हैं। यदि आपकी भाषा में कोई timesince(timestamp)फ़ंक्शन है, तो आप उस फ़ंक्शन का उपयोग नहीं कर सकते हैं।

मैंने स्पष्ट रूप से नए उपयोगकर्ताओं के बीच अस्पष्ट प्रश्नों और पुराने उपयोगकर्ताओं को पूर्णता की आवश्यकता के लिए कुछ मूर्खतापूर्ण लड़ाई को आत्मसात करने की उम्मीद में स्पष्ट करने के लिए इसे संपादित किया है। यह एक भयानक सवाल (हालांकि अब यह भी के समान हो सकती नहीं था इस )।

यह देखते हुए कि अंतिम उत्तर के बाद से पर्याप्त समय बीत चुका है, मैं व्हिस्की को थ्री इफ बाई डिक्लेयर करता हूँ, इसके 177 बाइट्स के साथ रूबी इस संदर्भ के विजेता को लागू करती है!


2
"जावास्क्रिप्ट JQuery के मामले में निषिद्ध है: पी बाकी सब ठीक है।" - Zepto की अनुमति है, तो?
जॉन ड्वोरक

4
कल्पना थोड़े गरीब है। कृपया एक सटीक परिभाषा प्रदान करें कि यह क्या करना चाहिए - एक उदाहरण कार्यान्वयन पर्याप्त नहीं है।
जॉन ड्वोरक

1
क्या तिमियागो कुछ नई स्क्रिप्टिंग भाषा है? क्या हर 30 सेकंड को वैकल्पिक करना (जैसा कि एक स्थान पर बताया गया है) या एक आवश्यकता (जैसा कि दूसरे में बताया गया है) को अपडेट करना है? I / O तंत्र क्या स्वीकार्य हैं? किस गोलाई का उपयोग किया जाना चाहिए? विशेष रूप से, गोलाई कैलेंडर-महीनों और वर्षों जैसे चर-लंबाई समय अवधि के साथ कैसे बातचीत करती है? इनमें से कुछ आपके जवाबों के आधार पर अनुवर्ती प्रश्न पूछ सकते हैं।
पीटर टेलर

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

जे, १६५

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

शायद और अधिक गोल्फ हो सकता है। वर्तमान यूनिक्स युग को प्राप्त करने के लिए एक शेल कॉल का उपयोग करता है, क्योंकि यू में यूनिक्स युग अनुपलब्ध है।

उदाहरण रन:

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

जावास्क्रिप्ट, 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 असंबंधित पोस्ट पर सार्वजनिक टिप्पणियों के माध्यम से किसी भी सबूत के बिना आरोपों को फेंकने से बचें; यदि आपको लगता है कि कोई व्यक्ति एक जुर्राब खाते का उपयोग कर रहा है, तो मध्यस्थ ध्यान के लिए उनकी एक पोस्ट को चिह्नित करें। मुझे लगता है कि यहाँ किसी भी प्रकार के संदेह का कोई कारण नहीं है, और यहां तक ​​कि अगर वहाँ था, तो इस तरह की चर्चा सार्वजनिक रूप से नहीं होनी चाहिए।
दरवाज़े

@ user965091 मैं यह नहीं देखता कि यहाँ किसी भी टिप्पणी को "उकसावे" के रूप में कैसे माना जा सकता है। किसी भी स्थिति में, स्टैक एक्सचेंज नेटवर्क पर अशिष्टता बर्दाश्त नहीं की जाती है । कृपया सभी उपयोगकर्ताओं के लिए विनम्र बने रहने की कोशिश करें , भले ही आपको संदेह हो कि वे नियम तोड़ रहे हैं या किसी अन्य कारण से।
दरवाज़े

1

जावास्क्रिप्ट, 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

जावास्क्रिप्ट, 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):'');}

जावास्क्रिप्ट कंसोल से चलने के लिए, कॉल करें

g(unixTimestamp);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.