Bu tarihe kadar ne kadar?


11

Fikir şudur: Şimdi / bugünün tarihinden (işlevin çağrıldığı zamandan) bağımsız değişken olarak verilen bir tarihe kadar geçen süreyi yazdırmak için bir işlev yazın.

Varsayımlar:

  • Giriş tarihi her zaman yarın veya daha sonra, gelecekte olacak.
  • Giriş tarihi asla gelecekte 10 yıldan fazla olmayacaktır.

Kurallar:

  • Çıktı şu biçimde olmalıdır: "[z yıl], [x ay], y gün--Giriş Tarihi-"
  • Çıktı zaman dilimi (gün / ay / yıl) doğru çoğullanmalıdır. yani 1 monthdeğil1 months
  • Giriş istediğiniz tarih biçiminde olabilir (3/15/12 - 15 Mart 2012 - 2012.03.15).

Örnek: Programın 15 Mart 2012'de yürütüldüğü varsayılmaktadır:

  • Giriş tarihi 3/20/12=5 days until 3/20/12
  • NOT4/16/12 = Giriş tarihi =1 month, 1 days until 3/20/12
  • Giriş tarihi 2012.04.20=1 month, 5 days until 2012.04.20
  • NOT2012.04.20 = Giriş tarihi =36 days until 2012.04.20
  • Giriş tarihi 10/31/17=5 years, 7 months, 16 days until 10/31/17
  • Giriş tarihi 3/15/13=1 year until 3/15/13

Bu kod golf, bu yüzden en kısa uzunluk kodu kazanır.

Son başvuru tarihi olması için, şu konuda bir cevap seçeceğim:

23 Mart 2012!

(Bu benim ilk CG sorum, bu yüzden benim tarafımdaki soru hatalarını düzeltmekten mutluluk duyarım!)


3
Alpha 10 karakterleri:: now until <input time> p
Griffin

3
4 karakter @Griffin:now-<input time>
PhiNotPi

1
@PhiNotPi iyi oynadı, iyi efendim.
Griffin

2
"3/16/12 tarihine kadar 1 gün" demek doğru olur mu?
MrZander

1
Cevap olarak sıçrayan yeras ile nasıl çalışılır? 10 yıl sonra 2 gün hata olacak. Ay ne kadar sürer?
Mart'ta Hauleth

Yanıtlar:


3

R, 99 karakter

Bir tür hile olduğunu biliyorum, ama R tamamen paketleri hakkında ve lubridate bu tür görevler için çok uygun!

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

Kullanımı:

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 karakter

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

Kullanımı:

p("11/03/2006");

Tarihleri ​​bir dd/mm/yyyyformatta alır. Griffin'in ay uzunluğu hesaplamasını kullandım ( yine ), ancak önceliğin düzgün çalışması için ekstra parantez yapıştırmam gerekiyordu. Ayrıca, okumayı biraz daha kolay hale getirmek için bazı satır araları bıraktım.


1

Yakut (213)

herhangi bir biçimde tarih Date.parsekabul eder. Sadece denedimyyyy-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

haftalar da almak için şunu ekleyin:

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

ve [0,'week'],(ay ve gün arasında). o zaman günler hep olacak< 7


hangi yakut sürümünü kullanıyorsunuz .... Kodunuzu ruby1.9.2p0 üzerinde çalıştırmayı denedim, ama bana hata veriyor uninitialized constant Object::Date (NameError)... Sanırım Rails Datesınıfını kullanıyorsunuz
Rohit

@Rohit 1.9.3, Rails malzeme kullanmamak. Tarih rdoc
jsvnm

Dokümanı daha önce görmüştüm .. ama aldığım hata yüzünden kafam karışmıştı ... Hala bu hatayı neden aldığımı anlayamıyorum. Windows 7 64-bit, ruby192p0
Rohit

@rohit 193 ile denemek ister misiniz?
jsvnm

1

VBA: 766631 Karakter

Dize oluşumunu kısaltmaya yardımcı olduğu için mellamokb'a teşekkürler IIf.

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

VBAKesinlikle golf ve diğer bazı diller kod için kendini ödünç vermediğini biliyorum , ama ben iyi (uzman değil) de. :-)

Bu benim için eğlenceli bir egzersiz oldu!


1
Tamamen VBA'nın hatası değil, mantığı kodunuzda birleştirmenin bazı iyi yolları var :) Örneğin, If y > 0 Then a = y & " year,":If y > 1 Then a = y & " years,"birlikte kombine edilebilira = y & " year" & Left("s", y - 1) & ","
mellamokb

@mellamokb Çok iyi. Buna bir göz atacağım ve yeniden göndereceğim!
Mart'ta Gaffi

Ben yani bazı test durumlarda, bir sorun vardı 1 year, 1 month, 1 day. Cevapta bunu düzelttim. Aslında daha kısa kod için yapılmış!
Mart'ta Gaffi

Ve güncellemeyi gönderdikten sonra, 20 karakter daha tasarruf If v < w Then d = w - v:If v = w Then d = 0etmek If v <= w Then d = w - viçin değişebileceğimi görüyorum . Gönderimde daha önemli bir değişiklik olursa cevabı güncelleyeceğim.
Mart'ta Gaffi

Bunu dizilerle daha iyi yapabileceğimi hayal ediyorum ... Başka bir göz atacağım ve muhtemelen başka bir cevap ekleyeceğim ...
Gaffi

1

JavaScript (ES6), 125 bayt

Yana Paolo tarafından cevap harici kütüphane kullanılmış, ben de aynı şeyi edecektir. Node.js tamamen NPM paketleriyle ilgilidir ve moment + HumanizeDuration bu görev için çok uygundur!

Düğüm ortamları

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

Tarayıcı ortamı

Kütüphaneler genel değişkenler bildirdiklerinden, aslında biraz daha kısadır (102 bayt). Üçüncü taraf JavaScript'e yüklemek için gereken komut dosyası etiketlerini eklemem gerekip gerekmediği açık değil, bu yüzden Düğüm'ü resmi olarak sayacağım.

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

CoffeeScript, ayrıca 125 bayt

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

1

PHP, 151 karakter

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

Çoğulları eksik ve doğru saymaz, çünkü format () ayları günlerden çıkarmaz ... PHP ile de benzer bir çözüm vardı.
powtac

Bu benim PHP çözüm, ama yine de daha önce belirtilen hata eksik: echo date_diff(new DateTime(),new DateTime($argv[1]))->format('%yyears, %mmonths, %a days');Komut satırında çağrıldığında 92 karakter uzunluğunda.
powtac
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.