Bugün (veya diğer tarihler) gün nedir?


12

Görev

Kullanıcının girdiği bir tarihin hafta-gün adını hesaplayan bir program veya işlev yazın.

Giriş çıkış

Girdi bir dizedir YYYYMMDD.

Giriş değerlerine örnek:

17 Haziran 2011
19040229: 29 Şubat 1904
06661225: 25 Aralık 666
00000101: 1 Ocak 0
99991231: 31 Aralık 9999

Tüm girişlerin geçerli olduğunu varsayabilirsiniz. Sıfır yılın geçerli olduğunu unutmayın .

Çıktı 0ve arasında bir tamsayıdır 6. Her tamsayı bir hafta-gün adını temsil eder. Hangi tam sayının hafta içi bir adı temsil ettiğini özgürce belirleyebilirsiniz, bunun gibi

0: Pazartesi
1: Salı
2: Çarşamba
...
6: Pazar

(sırayla) veya bu

0: Pazartesi
1: Çarşamba
2: Pazar
...
6: Cumartesi

(sırayla değil).

Test Durumları

Hafta İçi Günlük Çıktı (Bu örnekte [0..6 -> Pazartesi..Günlük] kullanılmıştır.)

20110617 4 Cuma
19500101 Pazar 6
22220202 Cumartesi 5
19000228 2 Çarşamba
19000301 Perşembe 3
19450815 Çarşamba 2
19040229 Pazartesi 0
19040301 Salı 1
17760704 3 Perşembe
20000228 Pazartesi 0
20000229 Salı 1
20000301 Çarşamba 2
20121223 6 Pazar
00000401 Cumartesi 5
66660606 Çarşamba 2
59161021 Cumartesi 5

kısıtlama

Sen olmamalıdır kullanmak herhangi işlev / sınıfın tür / ... gibi zaman damgası veya tarih, ilgili olduğu Datesınıf Java/ JavaScript/ ActionScriptveya getdateişlev PHP.

Şu anda birçok kişi tarafından kullanılan Gregoryen takvimi kullanmalısınız .

Tabii ki, en kısa kod kazanır. İki kodun uzunluğu aynı ise, en yüksek oyu alan kod kazanır.

(Teslim tarihi: 5'ten fazla kod varsa (veya eşittir) +1.


Bugün? Neden, Noel Günü!
Joey Adams

3
Bash (6 karakter) yazılmış iyimser çözeltisi: echo 4.
doğruluk

1
@trutheality Hayır, bunu kastetmedim .. İstediğim, sadece bugünün haftasını yazdırmakla kalmayıp birisinin yazdığı bir tarihin haftanın gününü yazdıran / döndüren bir kod.
JiminP

A, biliyorum. Bu da bunu yapıyor.
doğruluk

Zamanın en az% 14'ü doğru!
Draco18s artık SE

Yanıtlar:


2

Ruby, 95 92 karakter

0 ile düz basit yakut uygulaması: Pazartesi, ...

p ((y=(d=gets.to_i)/(k=100)/k-((m=d/k%k)<3?1:0))+y/4-y/k+y/400+"squsptrotqro"[-m].ord+d%k)%7

4

PHP - 101 97 103 125 karakter

  • Sakamoto Algoritması
  • 0 = Pazar

kod

<?php fscanf(STDIN,"%4d%2d%2d",$y,$m,$d);@$a=a032503514624;$y-=$m<3;$z=$y+1;echo($y+$y/4%$z-$y/100%$z+$y/400%$z+$a[$m]+$d)%7;

Not

Ne yazık ki, PHP'nin dinamik, zayıf yazımı nedeniyle, Sakamoto algoritması her bölme işlemini açıkça döşemeden düzgün çalışmıyor.


Lütfen tekrar test edebilir misiniz? Birkaç yıl bana farklı sonuçlar veriyor (örneğin testcase 17760704, çarşamba yerine salı günü verir).
Howard

@ Bu çok garip; 17760704 için, Çarşamba gününü alıyorum. Yine de hesaplayamadığım başka tutarsızlıklar görüyorum, örneğin 19040229 Salı günü geri dönüyor. Buna neyin sebep olabileceğinden emin değilim. Algoritmayı tekrar genişlettiğimde aynı sonuçları alıyorum y+y/4-y/100+y/400.
rintaun

497 * y / 400 ile olduğunu görebiliyorum: y=4bu durumda doğru 5 yerine 4 döndürür y+y/4+y/100+y/400(sadece ilk iki terimin oyuna girdiği yer). Javascript cevap verdi. Ints yerine çiftler oluşturuluyor mu? (
PHP'm

@DocMax: İfadeyi genişletilmiş bırakmak aynı sonuca sahiptir (497y / 400 eşdeğer olmalıdır: y / 100 çıkarılır ve y / 400 yine de eklenir). Ben PHP sadece yuvarlama yerine ondalık sonra her şeyi kesiyor tahmin ediyorum. Bunu modülodan önce yuvarlayarak test ettim. Bu, iki anomaliyi düzeltir, ancak 19040229 yine de aynı sonucu döndürür. Başka fikir var mı?
rintaun

@rintaun yuvarlama olduğunu sanmıyorum. Temelde farklıdırlar. Yukarıdaki örneği alın (y = 4): 497 * 4/400 = 1988/400 = 4 ancak diğer yandan 4 + 4 / 4-4 / 100 + 4/400 = 4 + 1-0 + 0 = 5 . / 100 ve / 400 terimleri hesaplamalarınızda 2000'e ulaşılamayacak kadar çok ağırlık alır.
Howard

2

C - 129

main(y,m,d,s)
{
    scanf("%04d%02d%02d",&y,&m,&d);
    y-=s=86400;
    d+=y+"-addgbegcfadf"[m];
    m>2?y++:0;
    putchar(48+(d+y/4-y/100+y/400+s+s)%7);
}

Bu, en azından sistemimde bölünmenin sıfıra nasıl yuvarlandığını kötüye kullanır (Linux x86).

Sihirli sabit, 86400iki amaca hizmet eder:

  • Haftanın gününü etkilemeden negatif yapmak için yıldan çıkarın. Bu, bölümlerin aşağı yerine yukarı yuvarlanmasını sağlar.
  • Gün numarasını, Pazartesi günü 0 olacak şekilde kaydırın.

Aynı zamanda bir gün içindeki saniye sayısı da olur.


y+=m>2;Bunun yerine kullanın m>2?y++:0;ve birkaç bayt kapalı tıraş edin.
Daha net

2

Javascript, 126123 karakter

Sakamoto'nun algoritmasını 0 = Pazar ile kullanma:

prompt().replace(/(....)(..)(..)/,function(_,y,m,d){y-=m<3;alert((+d+y-~(y/4)+~(y/100)-~(y/400)+ +".621462403513"[+m])%7)})

Bölümlerin çökebileceğinden şüpheleniyorum, ama şimdi görmüyorum.

Düzenleme: Bölümleri geliştirildi ( ~~ne zaman yapabileceğinize gerek yok ~).



0

Perl - 110 bayt

İşte perl -p source.pl VEYA perl -pe 'here-is-code' ile çalıştırılacak bir çözüm.

s/((..)(..))(..)(..)/(1+3*$1+$2-2*($1%4+$2%4)-(2<$4?$4+(1&$4&&4-(8&$4)):(2^$4)+(!($3%4)-!-$3+!($2%4)))+$5)%7/e

Test kutularını stdin'e kopyalayıp yapıştırmanız yeterlidir.

Değişkenler, dize sabitleri ve bölümleri olmayan tek kod bu gibi görünüyor.


0

JavaScript (ES6), 73 bayt (Rakip değil)

d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)

Dene

f=
d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)
o.innerText=f(i.value="59161021")
oninput=_=>i.value.length==8&&(o.innerText=f(i.value))
<input id=i type=number><pre id=o>


Neden rekabet etmiyor?
programcı5000

@ programmer5000, zorluğun yayınlandığı tarihi kontrol edin;)
Shaggy
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.