Data może być reprezentowana przez liczbę całkowitą bez znaku jako taką: RRRRMMDD. To, co musisz zrobić, to napisać najkrótszy program lub funkcję, która obliczy ostatnią datę, której numer był podzielny przez podaną liczbę n
(w tym dzisiejszą datę), a następnie zwróci tę datę w formacie pokazanym powyżej. Jeśli nigdy nie było daty (od 00000101 do dziś włącznie) podzielnej przez podaną liczbę całkowitą, powinieneś zwrócić -1.
Przykłady
Current Date Input Output
30 July, 2014 4 20140728
30 July, 2014 7 20140729
28 July, 2014 4 20140728
28 July, 2014 7 20140722
28 July, 5 90000 -1
Wkład
Możesz czytać ze STDIN lub brać argument funkcji, a nawet oczekiwać, że dane wejściowe zostaną zapisane w zmiennej. Dane wejściowe będą liczbą całkowitą bez znaku.
Wydajność
Napisz do STDOUT lub zwróć (lub zapisz w zmiennej) liczbę całkowitą reprezentującą datę w formacie RRRRMMDD.
Ograniczenia
Możesz użyć dowolnej standardowej biblioteki, którą oferuje Twój język. Obowiązują standardowe luki .
Warunki wygranej
To jest golf golfowy , więc wygrywa najmniejszy program (w bajtach). W przypadku remisu wygrywa odpowiedź z największą liczbą głosów.
Odpowiedzi:
Mathematica,
9360 bajtówOczekuje, że dane wejściowe zostaną zapisane
n
.Zauważ, że linia pionowa
∣
jest znakiem Unicode dla „dzielenia”, które policzyłem jako 3 bajty (UTF-8).Edycja: Znaleziono dobrą sztuczkę, aby uniknąć nadęty
DateString
i format specyfikacji :).Edycja: Całkowicie zapomniałem o
-1
wymaganiu. Naprawiono teraz.Oto wyjaśnienie
Zauważ, że użyłem
|
zamiast∣
w objaśnieniu, ponieważ Unicode jeden miesza się z monospacingiem.źródło
Python 2 - 150
Dzięki @ chill0r za sugestię usunięcia dni =, a Jason S za wskazówkę, że blok try może zostać zredukowany do jednej linii.
źródło
days=
int-=d.timedelta(days=1)
. Działa to również dobrze (przynajmniej w python3)int(t.strftime("%Y%m%d"))
i upuśćre
, (2) użyj jednowierszowego,try
ponieważt-=d.timedelta(1)
musi być tylko w nim.strftime
na starszych datach działa w python3, zaznaczone i dostaję błąd w python2C # 136
W zmienionych specyfikacjach funkcja, która przyjmuje wartość całkowitą bez znaku i zwraca wartość całkowitą.
152 znaki ze zmiennym wejściem / wyjściem
Korzystając z luźnych wymagań wejścia / wyjścia, dane wejściowe należy przechowywać w zmiennej
n
(obecnie zliczają wszystkie znaki z wyjątkiem literału liczby całkowitej), a dane wyjściowe są dostarczane ze zmiennąs
.204 znaki z STDIN / STDOUT:
źródło
T-SQL (2012) - 148
Zakłada się, że istnieje wolna zmienna @n o wartości n.
źródło
Golflua
9086Nie golfowa wersja Lua byłaby,
źródło
MATLAB: 61
Zakłada, że dzielnik jest zapisany
n
. Wynik zostanie zapisany w zmiennej o nazwieans
.Skomentowana wersja:
Wygeneruje błąd, jeśli nie zostanie znaleziony żaden wynik, ale mimo to odpowiedź jest nadal dostępna w zmiennej
Można uniknąć błędu kosztem 2 dodatkowych znaków:
źródło
PHP (92 = 85 + 7)
Oczekuje, że dane wejściowe zostaną zapisane
$n
.Właśnie przypomniałem sobie, dlaczego nie lubię PHP =)
EDYCJA: Teraz zaimplementowano również -1 specyfikacji.
źródło
JavaScript (ES6) 115
Oczekuje liczby w zmiennej n, wynik zapisany w zmiennej r. Każdy dzień jest sprawdzany, poczynając od bieżącej daty i malejącej - musi być lepszy sposób.
Ponadto, używając standardowych funkcji daty javascript, wszystkie daty są gregoriańskie aż do roku 1 (lata przestępne są odpowiednio niepoprawne przed reformą gregoriańską).
źródło
C # - 144 (Lub 124 w LINQPad) + 1 za każdą cyfrę w
n
Oczekuje to, że dane wejściowe znajdą się w zmiennej
n
. Pod koniec wykonywania pożądana wartość będzie w zmiennejr
. Jest00010101
to jednak pierwsza data, ponieważ data00000101
nie istnieje. Sugestie dotyczące ulepszeń są zawsze mile widziane.Wersja LINQPad:
źródło
Groovy -
301300 znakówBardzo prosty (i wolny), bez żadnych sztuczek, aby ukryć fakt, że używa Joda Time.
Gra w golfa:
Przykładowy przebieg (30.07.2014):
Nie golfowany:
źródło
R,
146139Powodzenia z randką, która nie działa.
microbenchmark
informuje, że cofnięcie o 15 dni zajmuje około pół sekundy. Na dzień 31 lipca 2014 r. Wyplucie zajmie około 20 milionów sekund (~ 23 dni)-1
, przynajmniej zgodnie z kopertą z tyłu.edycja : niektóre skróty w komentarzach
źródło
!d
jest krótszy niżd==F
i!z%%n
niżz%%n==0
. Również przekształcenieas.numeric(gsub("-","",...)
w funkcję powinno również zmniejszyć liczbę znaków. Dobra robota!as.real
często jest dobrą, krótszą alternatywą dlaas.numeric
.as.real
działa od wersji 3.0.0. Ale wciąż mamyas.double
jedną postać krótszą.paste0
w moim.Rprofile
naturalnie :)Matlab 104
Nie golfowany:
EDYCJA: Udało mi się trochę zoptymalizować, ale @DennisJaheruddin ma tutaj prawdziwe rozwiązanie
źródło
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 bajtów, generatoryDzięki @ nyuszika7h za
import*
sugestięźródło
Rubinowy 103
Wkład
Oczekuje, że wartość dzielnika będzie występować w zmiennej
n
.Wydajność
Zwracana wartość
f
funkcjiPrzykład online: http://ideone.com/LoYxG4
źródło
Java: 373 znaków
To jest port Groovy odpowiedzi i używa Joda Time.
Gra w golfa:
Przykładowe przebiegi (z joda-time-2.4.jar na ścieżce klasy:
Nie golfowany:
źródło
java.time.*
w najnowszej wersji Java.Bash + coreutils (8,21), 67 bajtów
seq
generuje liczby całkowite od 1 do 9 9 , po jednej na linię i formatuje ją jako-<x>day
date -f
co interpretuje każdy wiersz i wyświetla datę sformatowaną wdc
wyrażeniu, takim jak[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p
(dodano spacje dla czytelności)[pq]
zdefiniuj makro, aby wydrukować górę stosu, a następnie wyjdźsp
zapisz makro w rejestrze p[pq]
zdefiniuj makro do wypchnięcia -1, wydrukuj górę stosu, a następnie zakończsq
zapisz makro w rejestrze q20140728
liczba całkowita osadzonad
zduplikowany początek stosuA1
push 101 (00000101)=q
wyskakuj z górnych 2 wartości stosu: porównaj datę i wartość 101 i wywołaj makro,q
jeśli jest równe7
push divider%
pop dzielnik i dzielnik, dziel i pchaj resztę0
naciśnij 0=p
wyskakuj z górnych 2 wartości stosu: porównaj resztę i 0, i wywołaj makrop
jeśli jest równed
zduplikowany początek stosup
nazywa się: drukuje datę całkowitą i zamknięciadc
całkowitemudc
wyrażenia są przesyłane potokowo dodc
oceny. Podc
wydrukowaniu właściwej wartości i zakończeniu, reszta rurociągu zostaje zerwanaWydajność:
Ponieważ program generuje liczby całkowite od 1 do 9 9 , będzie obowiązywał do nieco ponad miliona lat w przyszłości. Mam nadzieję, że to ograniczenie jest dopuszczalne ;-)
Dzięki @ WumpusQ.Wumbley za skrócenie zwrotu -1.
źródło
|grep .||echo -1
na końcu potoku lub użyj zsh, gdzie możesz zagnieżdżać rozszerzenia takie jakecho ${$(cmd):-1}
(to będzie kosztować cię odwrotnym ukośnikiem w innym miejscu ...)sizeof time_t
problemem, ponieważ granica, w której się łamie, wynosi 2 ** 31 sekund przed 1/1/1970. Moja starsza instalacja jest również żałośnie 32-bitowaPYTHON: 134 bajty
Nie będę w stanie pokonać obecnego lidera i nie jest to o wiele lepsze niż najlepsza odpowiedź w języku Python, ale postanowiłem opublikować moje najlepsze rozwiązanie w języku Python.
Nie golfowany:
źródło
from datetime import*
zamiastimport datetime as d
,timedelta(1)
zamiastd.timedelta(1)
iyield
zamiastreturn
.JavaScript (ES5) - 94
Oczekuje danych wejściowych w zmiennej
x
i umieszcza dane wyjściowe wo
.źródło
k4
(84)(73)To tylko wstępne cięcie z pierwszym algorytmem, który przyszedł mi do głowy; Jestem pewien, że lepsza jest wydajność i długość.
Ta wersja koduje część „dzisiaj” (to jest
.z.D
); zmień go na literał daty (yyyy.mm.dd
) lub liczbę całkowitą w systemie daty q (dni od 1 stycznia 2000 r.), aby uruchomić przypadki testowe. (q nie analizuje literałów daty wcześniej niż na początku XVIII wieku, więc w przypadku dat wcześniejszych należy ustalić wartość i bezpośrednio użyć odpowiedniej liczby całkowitej. 1 stycznia „AD 0” ze specyfikacji zmienia się out to be-730457
, który jest używany w kodzie funkcji. 28 lipca AD 5 z ostatniego przypadku testowego okazuje się być-728450
.)Podane przypadki testowe:
edytować:
Jest to inne podejście, w którym jeden z operatorów konwergencji obniża datę, dopóki nie znajdzie podzielnego lub nie przekroczy granicy 1/1/0000. Nieco inaczej zmienia też konwersję z daty na liczbę całkowitą.
Przypadki testowe, tym razem naraz:
źródło
VBA 343 bajtów (moduł)
źródło
Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub
przypadku 139 BytesPowerShell - 76
Zależy to od liczby przechowywanej w zmiennej
$n
.źródło