Kolejny problem z manipulowaniem datami: P
Zadanie
Napisz program lub funkcję, która oblicza różnicę między dwiema datami podanymi przez użytkownika.
Wejście wyjście
Podobnie jak poprzedni , dane wejściowe to dwa YYYYMMDD
s, oddzielone spacją , przecinkiem
,
lub znakiem minus -
.
Przykład wartości wejściowych:
20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231
Dane wyjściowe to liczba całkowita, która stanowi różnicę między dwiema datami w dniach.
Na przykład: 20110101-20100101
wydajność 365
i 33320229 17000101
wydajność 596124
.
Możesz przetestować wyniki tutaj co tutaj . (Zobacz komentarze rintaun poniżej.) Jeśli dwie daty są takie same, program powinien powrócić 0
, jeśli data jest prawidłowa (patrz punktacja ).
Ograniczenie
Oczywiście nie wolno używać żadnych funkcji / klas / ..., które są związane ze znacznikiem czasu lub datą, i należy używać kalendarza gregoriańskiego .
Wynik
Jeśli twój kod nie zachowuje ograniczenia, to score = -∞
.
Domyślnie bonus
jest to 1.
- Jeśli Twój kod działa niezależnie od kolejności wejść (na przykład,
20100101,20110101
zwrotów365
lub-365
)bonus+=1
. - Jeśli Twój kod może obsługiwać roku 0 ,
bonus+=0.5
. - Jeśli kod rozpozna nieprawidłowy miesiąc (od 1 do 12) / datę (od 1 do 31), polub
20109901
lub34720132
, i wydrukujeE
(i zakończy działanie programu lub zwróci coś w rodzaju0
)bonus+=1
,. - Niezależnie od powyższej zasady, jeśli kod rozpozna nieprawidłowe daty, takie jak
20100230
,20100229
lub20111131
, i drukujeE
(i kończy działanie programu lub zwraca coś takiego0
)bonus+=1
,. - Niezależnie od powyższych dwóch zasad, jeśli kod rozpozna nieprawidłowy ciąg wejściowy, taki jak
20100101|20100202
lub2010010120100202
, i drukujeE
(i kończy działanie programu lub zwraca coś takiego0
)bonus+=1
,.
score = floor(-4.2*code.length/bonus)
. Wygrywa kod z najwyższym wynikiem. Jeśli dwa najlepsze kody mają taki sam wynik, wygrywają kody z najwyższym bonusem. Jeśli dwa najlepsze kody mają zarówno ten sam wynik, jak i bonus, wygrywają kody 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) +1
głosów).
20040229
. : P365*4 + 2 + 2
= 1464. Dzięki za informację!Odpowiedzi:
Perl 5,14, wynik = -162
-163-181-196-214-167-213-234-p
opcjąKod
Oblicza zmodyfikowaną liczbę dni juliańskich dla każdej daty (ignorując korekty związane z epoką, aby zapisać długość kodu) i odejmuje te dwie wartości. (zob. „Dzień Juliana” z Wikipedii ).
/r
opcji zamiany30+($m&1^$m>7)
część podaje długość dowolnego miesiąca oprócz lutego; reszta dostosowuje się do lutego w roku zwykłym lub przestępnymZałożenia
00000101-00010101
powinno dać 366, ponieważ 0 jest całkowitą wielokrotnością 400, a zatem rok 0 jest rokiem przestępnym.źródło
20111300-20119999
Zwroty2717
.PHP, wynik: -539.1
Kod
Nie golfił
Uwaga
Oblicza liczbę dni, iterując każdą prawidłową datę między dwoma podanymi. Jest dość wolny na większych zakresach. Jestem pewien, że nie jest to najlepszy sposób na rozwiązanie tego problemu, ale niecierpliwiłem się i właśnie z tym skończyłem. :)
Wiem też, że „niepoznany” kod wciąż nie jest zbyt czytelny, ale jego całkowite przepisanie wymagałoby zbyt wiele wysiłku.
źródło
Ruby 1.9, Wynik: -175
-186-191-199243250260znakówKod akceptuje wprowadzanie przez standardowe wejście.
Uwagi:
(!x[e]||e*f<1||f>x[e])
Stan obsługuje nieprawidłowe miesiąc / dzień / data premie.33320229 17000101
powoduje596134
.źródło
Python, wynik: -478
rozwiązanie:
Nie mam wersji „bez golfa”, bo tak to napisałem. Nie przetestowałem go poprawnie, więc jeśli znajdziesz błąd - skomentuj.
edit: mam nadzieję, że naprawiłem błąd wskazany w komentarzach i dodano rozpakowanie w postaci [a, b], [c, d] = [[1,2], [3,4]
źródło
E
. (FYI,0>-1>12
,0>6>12
,0>13>12
powracaFalse
.)x<y<z
porównania lub istniejex if y else z
. Próbowałem to naprawić.[x,z][y]
który jest krótszy niżx if y else z
, choć nie zawsze działa, ponieważ w przeciwieństwie do wyrażenia if nie jest leniwy.PHP, wynik: -516
znaki:
685676premia: 5,5
źródło
<?
na początku do uruchomienia, w przeciwnym razie po prostu wypisuje kod.