Jaki jest dzisiaj dzień (lub inne daty)?


12

Zadanie

Napisz program lub funkcję, która oblicza nazwę dnia tygodnia podaną przez użytkownika.

Wejście wyjście

Wejściowy jest ciągiem YYYYMMDD.

Przykład wartości wejściowych:

20110617: 17 czerwca 2011 r
19040229: 29 lutego 1904 r
06661225: 25 grudnia 666
00000101: 1 stycznia 0
99991231: 31 grudnia 9999

Możesz założyć, że wszystkie dane wejściowe są prawidłowe. Pamiętaj, że rok zero jest ważny.

Dane wyjściowe to liczba całkowita pomiędzy 0i 6. Każda liczba całkowita reprezentuje nazwę dnia tygodnia. Możesz swobodnie decydować, która liczba całkowita reprezentuje nazwę dnia tygodnia, taką jak ta

0: poniedziałek
1: wtorek
2: środa
...
6: niedziela

(w kolejności) lub ten

0: poniedziałek
1: środa
2: niedziela
...
6: sobota

(nie w porządku).

Przypadki testowe

Dane wyjściowe z dnia tygodnia (w tym przykładzie użyto [0..6 -> poniedziałek.. niedziela).)

20110617 piątek 4
19500101 niedziela 6
22220202 Sobota 5
19000228 Środa 2
19000301 Czwartek 3
19450815 Środa 2
19040229 Poniedziałek 0
19040301 Wtorek 1
17760704 Czwartek 3
20000228 poniedziałek 0
20000229 Wtorek 1
20000301 Środa 2
20121223 niedziela 6
00000401 Sobota 5
66660606 Środa 2
59161021 Sobota 5

Ograniczenie

Nie wolno używać żadnych funkcji / klas / ..., które są związane ze znacznikiem czasu lub datą, takich jak Dateklasa w Java/ JavaScript/ ActionScriptlub getdatefunkcja w PHP.

Powinieneś używać kalendarza gregoriańskiego , z którego korzysta obecnie wiele osób.

Oczywiście, najkrótszy kod wygrywa. Jeśli dwa kody mają tę samą długość, wygrywa kod z najwyższą liczbą głosów.

(Due: Gdy jest więcej niż 5 kodów, które mają więcej niż (lub równe) +1głosów).


Dzisiaj? Boże Narodzenie!
Joey Adams,

3
Optymistyczne rozwiązanie napisany w bash (6 znaków): echo 4.
trutheality

1
@trutheality Nie, nie miałem tego na myśli ... Chciałem kodu, który drukuje / zwraca dzień tygodnia, w którym ktoś wpisał datę, a nie tylko drukuje dzień tygodnia.
JiminP

Oh, wiem. Właśnie to robi.
trutheality

Ma rację co najmniej 14% czasu!
Draco18s nie ufa już SE

Odpowiedzi:


2

Ruby, 95 92 znaków

Prosta implementacja ruby ​​z 0: poniedziałek, ...

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 znaków

  • Algorytm Sakamoto
  • 0 = niedziela

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;

Uwaga

Niestety, ze względu na dynamiczne, słabe pisanie w PHP, algorytm Sakamoto nie działa poprawnie bez wyraźnego podziału każdej operacji dzielenia.


Czy możesz przetestować ponownie? Od kilku lat daje mi inne wyniki (np. Wyniki testu 17760704 dają wtorek zamiast środy).
Howard

@Jak to bardzo dziwne; za 17760704 dostaję środę. Dostaję jednak inne niespójności, których nie mogę wyjaśnić, np. 19040229 zwraca wtorek. Nie jestem pewien, co może być tego przyczyną. Otrzymuję te same wyniki, gdy ponownie rozwinę algorytm y+y/4-y/100+y/400.
rintaun

Widzę, jak to się dzieje z 497 * y / 400: y=4w takim przypadku zwraca 4, zamiast prawidłowego 5 z y+y/4+y/100+y/400(gdzie tylko dwa pierwsze warunki wchodzą w grę). Właśnie to nęka moją odpowiedź JavaScript. Czy to możliwe, że tworzone są podwójne zamiast ints? (Mój PHP jest zbyt słaby, aby wiedzieć.)
DocMax

@DocMax: Pozostawienie rozwiniętego wyrażenia daje ten sam wynik (497y / 400 powinno być równoważne: y / 100 jest odejmowane i niezależnie dodaje się y / 400). Zgaduję, że PHP po prostu odcina wszystko po przecinku zamiast zaokrąglać. Przetestowałem to zaokrąglając przed modułem. To naprawia dwie anomalie, ale 19040229 nadal zwraca ten sam wynik. Jakieś inne pomysły?
rintaun

@rintaun nie sądzę, że to zaokrąglenie. Są zasadniczo różne. Weź przykład z góry (y = 4): 497 * 4/400 = 1988/400 = 4, ale z drugiej strony 4 + 4 / 4-4 / 100 + 4/400 = 4 + 1-0 + 0 = 5 . Terminy / 100 i / 400 zyskują zbyt dużą wagę w obliczeniach, tak że 2000 nie może zostać osiągnięte.
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);
}

To narusza sposób, w jaki podział zaokrągla się do zera, przynajmniej w moim systemie (Linux x86).

Stała magiczna 86400służy dwóm celom:

  • Odejmij od roku, aby wynik był ujemny, bez wpływu na dzień tygodnia. To sprawia, że ​​podziały będą zaokrąglać w górę zamiast w dół.
  • Zmień numer dnia, aby poniedziałek wynosił 0.

Zdarza się również, że jest to liczba sekund w ciągu dnia.


Użyj y+=m>2;zamiast m>2?y++:0;i zgol kilka bajtów.
Jaśniejsze

2

JavaScript, 126 123 znaków

Używanie algorytmu Sakamoto z 0 = niedziela:

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

Podejrzewam, że podziały mogą się zawalić, ale teraz tego nie widzę.

Edycja: Poprawiono podziały (nie trzeba, ~~kiedy możesz po prostu ~).


2

Python 2 , 83 116 113 109 bajtów

Implementuje algorytm Sakamoto . Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

Edycja: Powinienem to naprawić przed wiekami. -6 bajtów z sugestii Jonathana Allana +2 bajty do faktycznego naprawienia kodu.

def w(s):m=int(s[4:6]);y,d=int(s[:4])-(m<3),int(s[6:]);return(y+y/4-y/100+y/400+int('032503514624'[m-1])+d)%7

Dane wejściowe powinny być pojedynczymi ciągami.
msh210,

int('032503514624'[m-1])ratuje 6
Jonathan Allan,

0

Perl - 110 bajtów

Oto rozwiązanie, które można uruchomić z perl -p source.pl LUB perl -pe 'here-is-code'.

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

Po prostu skopiuj i wklej przypadki testowe do standardowego wejścia.

Wydaje się, że jest to jedyny kod bez zmiennych, stałych ciągów i podziałów.


0

JavaScript (ES6), 73 bajty (niekonkurujące)

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

Spróbuj

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>


Dlaczego nie konkurować?
programista

@ programmer5000, sprawdź datę wysłania wyzwania;)
Shaggy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.