นานแค่ไหนจนถึงวันนี้


11

แนวคิดคือ: เขียนฟังก์ชั่นเพื่อพิมพ์ระยะเวลาจากวันนี้ / วันนี้ (ณ เวลาที่เรียกใช้ฟังก์ชัน) จนกระทั่งวันที่กำหนดเป็นอาร์กิวเมนต์

สมมติฐาน:

  • วันที่ป้อนจะเป็นวันพรุ่งนี้หรือหลังจากนั้นในอนาคต
  • วันที่ป้อนจะไม่เกิน 10 ปีในอนาคต

กฎ:

  • ผลลัพธ์จะต้องอยู่ในรูปแบบนี้: "[z ปี (s)], [x เดือน (s)], y วัน (s) จนถึง -Input Date-"
  • กรอบเวลาส่งออก (วัน / เดือน / ปี) จะต้องได้รับการแก้ไขอย่างถูกต้อง เช่น1 monthไม่1 months
  • ข้อมูลที่ป้อนสามารถอยู่ในรูปแบบวันที่ใดก็ได้ที่คุณต้องการ (3/15/12 - 15 มีนาคม 2012 - 2012.03.15)

ตัวอย่าง: สมมติว่าโปรแกรมทำงานในวันที่ 15 มีนาคม 2012:

  • วันที่ป้อนของ3/20/12=5 days until 3/20/12
  • ไม่ได้ป้อนวันที่4/16/12=1 month, 1 days until 3/20/12
  • วันที่ป้อนของ2012.04.20=1 month, 5 days until 2012.04.20
  • ไม่ได้ป้อนวันที่2012.04.20=36 days until 2012.04.20
  • วันที่ป้อนของ10/31/17=5 years, 7 months, 16 days until 10/31/17
  • วันที่ป้อนของ3/15/13=1 year until 3/15/13

นี่คือรหัสกอล์ฟดังนั้นรหัสความยาวที่สั้นที่สุดจึงชนะ

ฉันคิดว่าเพื่อให้มีกำหนดเวลาฉันจะเลือกคำตอบใน:

23 มีนาคม 2012!

(นี่คือคำถาม CG แรกของฉันดังนั้นฉันยินดีที่จะแก้ไขข้อผิดพลาดในส่วนของฉัน!)


3
Wolfram | Alpha 10 chars now until <input time> :: p
Griffin

3
@Griffin 4 ตัวอักษร:now-<input time>
PhiNotPi

1
@PhiNotPi เล่นได้ดีครับ
Griffin

2
ตกลงหรือไม่ที่จะพูดว่า "1 วันจนถึง 3/16/12"
MrZander

1
วิธีการทำงานร่วมกับ yeras leap ในคำตอบ? ใน 10 ปีจะมีข้อผิดพลาด 2 วัน เดือนนานเท่าไหร่
Hauleth

คำตอบ:


3

R, 99 ตัวอักษร

ฉันรู้ว่ามันเป็นการโกง แต่ R คือทั้งหมดที่เกี่ยวกับแพ็คเกจและlubridateสะดวกมากสำหรับงานประเภทนี้!

f=function(x){library(lubridate);cat(show(as.period(interval(mdy("3/15/2012"),mdy(x)))),"until",x)}

การใช้งาน:

f("10/31/2017")
[1] 5 years, 7 months and 16 days 
5 years, 7 months and 16 days  until 10/31/2017

1

PHP, 315 ตัวอักษร

function p($z)
{
list($d,$m,$y)=explode("/",$z);
$d=$d-date("d");
$n=$m-1;
$m=$m-date("m")-($d<0);
$d=$d+($d<0)*($n>7^$n&1)+27+($n-2?3:($y%4?1:($y%100?2:($y%400?1:2))));
$y=$y-date("Y")-($m<0);
$s="s ";
echo ($y?$y." year".$s[$y<2]:"")." ".($m?$m." month".$s[$m<2]:"")." ".($d?$d." day".$s[$d<2]:"")." until ".$z;
}

การใช้งาน:

p("11/03/2006");

ใช้วันที่ในdd/mm/yyyyรูปแบบ ฉันใช้การคำนวณความยาวเดือนของกริฟฟิน ( อีกครั้ง ) แม้ว่าฉันจะต้องติดวงเล็บเสริมในนั้นเพื่อให้การทำงานมาก่อนถูกต้อง ฉันยังต้องพักบรรทัดไว้เพื่อให้อ่านง่ายขึ้นเล็กน้อย


1

ทับทิม (213)

ใช้วันที่ในรูปแบบใดก็ได้ที่Date.parseยอมรับ พยายามเพียงกับyyyy-mm-dd

def u s
t=Date.today
f=Date.parse s
[[0,'year'],[0,'month'],[0,'day']].map{|c,n| while t<f 
c+=1
t=t.send"next_#{n}"
end
c,t=c-1,t.send("prev_#{n}")if t>f
[c,n+(c>1??s:'')]*' 'if c>0}.compact*', '+' until '+s
end

หากต้องการรับสัปดาห์เพิ่มด้วย:

['prev_','next_'].each{|n|Date.send(:define_method,n+'week'){send n+'day',7}}

และ[0,'week'],(ระหว่างเดือนและวัน) วันนั้นจะเป็น< 7


คุณใช้ทับทิมรุ่นไหน .... ฉันพยายามรันโค้ดของคุณบน ruby1.9.2p0 แต่มันทำให้ฉันมีข้อผิดพลาดuninitialized constant Object::Date (NameError)... ฉันคิดว่าคุณกำลังใช้DateคลาสRails
Rohit

@Rohit 1.9.3 ไม่ได้ใช้สิ่งที่ Rails วันที่ rdoc
jsvnm

ฉันเห็นเอกสารก่อนหน้านี้ .. แต่สับสนในข้อผิดพลาดที่ฉันได้รับ ... ฉันยังไม่สามารถหาสาเหตุที่ฉันได้รับข้อผิดพลาดนี้ได้ ฉันอยู่บน windows 7 64-bit, ruby192p0
Rohit

@rohit ลองกับ 193?
jsvnm

1

VBA: 766 631 ตัวอักษร

ขอขอบคุณที่mellamokbIIfสำหรับการช่วยให้ร่นขึ้นสร้างสตริงและ

Function k(i)
e=" month"
g="s"
n=Now()
r=Month(n)
s=Month(i)
t=DateSerial(Year(i),s,1)
u=DateSerial(Year(i),s-1,1)
v=Day(n)
w=Day(i)
x=DateSerial(Year(n),r,1)
d=t-u-v+w
For y=0 To 10
If Year(DateAdd("yyyy",-1*y,i))=Year(n) Then Exit For
Next
y=IIf(s=1,y-1,y)
z=s-r
z=IIf(z<0,z+12,z)
For m=0 To z
If Month(DateAdd("m",-1*m,i))=r Then Exit For
Next
d=IIf(v<=w,w-v,d)
m=IIf(v>w,m-1,m)
If y Then a=y & " year" & Left(g,y-1)
a=IIf((m Or d) And y,a & ",",a)
If m Then b=IIf(d,m & e & Left(g,m-1) & ",",m & e & Left(g,m-1))
If d Then c=IIf(d>1,d & " days",d & " day")
k=Trim(Trim(a & " " & b) & " " & c) & " until " & i & "."
End Function

ฉันรู้ว่าVBAแน่นอนไม่ได้ยืมตัวเองเพื่อรหัสกอล์ฟรวมทั้งภาษาอื่น ๆ แต่มันเป็นสิ่งที่ฉันดี (ไม่ใช่ผู้เชี่ยวชาญ) ที่ :-)

นี่เป็นการออกกำลังกายที่สนุกสำหรับฉัน!


1
มันไม่ใช่ความผิดทั้งหมดของ VBA มีวิธีที่ดีในการรวมตรรกะในรหัสของคุณ :) ตัวอย่างเช่นIf y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"สามารถรวมเข้าด้วยกันเพื่อa = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb ดีมาก ฉันจะดูที่และ repost!
Gaffi

ผมมีปัญหากับบางกรณีทดสอบคือ1 year, ,1 month 1 dayฉันได้แก้ไขสิ่งนี้ในคำตอบ มันทำให้รหัสสั้นลงจริง ๆ !
Gaffi

และหลังการโพสต์การปรับปรุงผมเห็นว่าฉันจะเปลี่ยนIf v < w Then d = w - v:If v = w Then d = 0ไปIf v <= w Then d = w - vสำหรับเงินฝากออมทรัพย์เพิ่มอีก 20 ตัวอักษร ฉันจะอัปเดตคำตอบหากมีการเปลี่ยนแปลงที่สำคัญกว่าในการโพสต์
Gaffi

ฉันคิดว่าฉันสามารถทำสิ่งนี้ได้ดีขึ้นด้วยอาร์เรย์ ... ฉันจะมองอีกครั้งและอาจเพิ่มคำตอบอื่น ...
Gaffi

1

JavaScript (ES6), 125 ไบต์

เนื่องจากคำตอบของเปาโลใช้ห้องสมุดภายนอกฉันจะทำแบบเดียวกัน Node.js เป็นเรื่องเกี่ยวกับแพคเกจ NPM และช่วงเวลา + HumanizeDurationสะดวกมากสำหรับงานนี้!

สภาวะแวดล้อมโหนด

m=require('moment'),f=d=>console.log(require('humanize-duration')(m(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

สภาพแวดล้อมของเบราว์เซอร์

เนื่องจากห้องสมุดประกาศตัวแปรทั่วโลกจริง ๆ แล้วมันค่อนข้างสั้นกว่า (102 ไบต์) ยังไม่ชัดเจนว่าฉันต้องรวมแท็กสคริปต์ที่จำเป็นในการโหลดใน JavaScript ของบุคคลที่สามหรือไม่ดังนั้นฉันจะนับโหนดอย่างเป็นทางการ

f=d=>console.log(humanizeDuration((m=moment)(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d)

CoffeeScript ยัง 125 ไบต์

f=(d)->console.log require('humanize-duration')((m=require 'moment')(d).diff(m()),{units:['y','mo','d'],round:1})+' until '+d

1

PHP, 151 ตัวอักษร

function p($z){$n=date_create(date('Y-m-d'));$d=date_create($z);$i=date_diff($n,$d);print($i->format('%R%y years, %m months, and %a days until '.$z));}

มันหายไปพหูพจน์และไม่นับอย่างถูกต้องเพราะรูปแบบ () ไม่ลบวันนับจากเดือน ... ฉันมีวิธีการแก้ปัญหาที่คล้ายกันกับ PHP เช่นกัน
powtac

นี่เป็นโซลูชัน PHP ของฉัน แต่ยังขาดข้อผิดพลาดที่กล่าวถึงก่อนหน้านี้: echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');มันมี 92 ตัวอักษรยาวเมื่อเรียกบนบรรทัดคำสั่ง
powtac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.