สคริปต์สั้นที่สุดที่ให้เวลาผ่านไปนับตั้งแต่การประทับเวลา Unix


9

สิ่งที่คุณต้องทำเพื่อให้ได้รับความท้าทายนี้คือการเขียนสคริปต์ "timeago" ที่สั้นที่สุดที่แสดงจำนวนทศวรรษปีสัปดาห์สัปดาห์วันชั่วโมงนาทีและวินาทีระหว่างเวลาประทับ Unix ที่กำหนดและเวลาที่สคริปต์ทำงาน

คุณจะต้องให้แตกต่างของเวลาใน "ข้อตกลงต่ำสุด" เช่น1 weekไม่ได้7 days, ไม่ได้9 years 0 decades 9 yearsนอกจากนี้คุณยังจะต้องใช้รูปพหูพจน์ได้อย่างถูกต้องเช่นไม่ได้1 day1 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 ที่มีการใช้ทับทิมขนาด 177 ไบต์ผู้ชนะในบริบทนี้!


2
"ในกรณีของ Javascript JQuery ถูกห้าม: P ทุกอย่างไม่เป็นไร" - Zeptoอนุญาตแล้ว
John Dvorak

4
สเป็คค่อนข้างแย่ โปรดระบุคำจำกัดความที่แน่นอนของสิ่งที่ควรทำ - ตัวอย่างการใช้งานไม่เพียงพอ
John Dvorak

1
Timeago เป็นภาษาสคริปต์ใหม่หรือไม่? มีการอัพเดตตัวเลือกทุก ๆ 30 วินาที (ตามที่ระบุไว้ในที่เดียว) หรือข้อกำหนด (ตามที่ระบุไว้ในที่อื่น) กลไก I / O ใดที่ยอมรับได้? ควรใช้การปัดเศษแบบใด โดยเฉพาะอย่างยิ่งการปัดเศษมีผลกับช่วงเวลาที่มีความยาวผันแปรเช่นเดือนและปีตามปฏิทินอย่างไร บางข้ออาจบ่งบอกถึงการติดตามคำถามขึ้นอยู่กับคำตอบของคุณ
Peter Taylor

1
@Abdossam ฉันรู้ว่าเราทั้งหมดดูเหมือนจุกจิกสวย แต่มันเป็นเพราะคำถามเกี่ยวกับเว็บไซต์นี้ควรจะมีเกณฑ์ชนะวัตถุประสงค์และ สเป็คที่ชัดเจน
งานอดิเรกของ Calvin

1
สองข้อเสนอแนะ: 1) ออกจากส่วน HTML ฉันเดาว่าไม่มีใครต้องการที่จะเขียนโปรแกรมแยกวิเคราะห์ HTML ก่อนที่จะสามารถจัดการงานพิมพ์ที่แท้จริงได้ 2) ระบุให้ชัดเจนว่าคุณ จำกัด "วินาที", "นาที", "ชั่วโมง" และ "วัน" คุณอาจเพิ่ม "สัปดาห์" หากต้องการ แต่เดือนและปีไม่ได้กำหนดไว้อย่างชัดเจน (28-31 วัน / 365 หรือ 366 วัน ... ) การดำเนินการนี้ควรแก้ไขข้อกังวลที่สำคัญกับคำถามนี้ในมุมมองของฉัน
Falko

คำตอบ:


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

อาจจะสามารถเล่นกอล์ฟได้มากขึ้น ใช้ shell call to date เพื่อรับเวลา unix epoch ปัจจุบันเนื่องจาก Unix epoch ไม่สามารถใช้ได้ใน 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

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

เอาต์พุตสำหรับการประทับเวลา 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 โปรดหลีกเลี่ยงการกล่าวโทษโดยไม่มีข้อพิสูจน์ผ่านความคิดเห็นสาธารณะในโพสต์ที่ไม่เกี่ยวข้อง หากคุณคิดว่ามีใครบางคนกำลังใช้บัญชีถุงเท้าให้ตั้งค่าสถานะโพสต์ของพวกเขาเพื่อให้ผู้ดูแลสนใจ ฉันเห็นว่าไม่มีเหตุผลใดที่จะสงสัย sockpuppetry ที่นี่และถึงแม้ว่าจะมีการสนทนาเช่นนี้ก็ไม่ควรมีในที่สาธารณะ
Doorknob

@ user965091 ฉันไม่เห็นว่าความคิดเห็นใด ๆ ที่นี่อาจถือได้ว่าเป็น "การยั่วยุ" ในกรณีใด ๆความรุนแรงจะไม่ทนต่อบนเครือข่ายกองแลกเปลี่ยน โปรดพยายามทำตัวให้สุภาพต่อผู้ใช้ทุกคนไม่ว่าคุณจะสงสัยว่าพวกเขาละเมิดกฎหรือด้วยเหตุผลอื่นใดก็ตาม
ลูกบิดประตู

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
Ingo Bürk

เอ่อลืมวินาทีขอบคุณ @ IngoBürk เพื่อให้ชัดเจนt(new Date()/1000 + 10);
ชัยชนะ

ใช้สัญลักษณ์ลูกศรไขมันของ ES6 และeval(i)สั้นกว่าwindow[i]ด้วยเช่นกัน2 ไบต์
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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.