Kiedy ostatni raz data była podzielna przez n?

24

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 , więc wygrywa najmniejszy program (w bajtach). W przypadku remisu wygrywa odpowiedź z największą liczbą głosów.

overactor
źródło
4
Data 00000101 nie istnieje. Rok zaczyna się od 1. en.wikipedia.org/wiki/0_%28year%29
edc65
1
@ edc65 czy możemy udawać, że istnieje?
overactor
3
Co z 29 lutego? Czy musimy stosować zasady dotyczące pełnego roku przestępnego, aby sprawdzić prawidłowe daty? en.wikipedia.org/wiki/Leap_year
Digital Trauma
6
Co z dniami straconymi z powodu zmiany kalendarza juliańsko-gregoriańskiego? A może chodzimy po gregoriańsku przez całą drogę? en.wikipedia.org/wiki/Gregorian_calendar
Cyfrowa trauma
1
Twoje dane wejściowe / wyjściowe są raczej luźne. Na przykład, czy „oczekiwać, że dane wejściowe będą przechowywane w zmiennej”, należy policzyć deklarację zmiennej w języku takim jak C? Mówisz „napisz program”, ale mówisz „weź argument funkcji” - czy to oznacza, że ​​możemy napisać tylko funkcję, a nie pełny program?
Bob

Odpowiedzi:

16

Mathematica, 93 60 bajtów

For[i=0,(r=DatePlus@i--~FromDigits~100)>0&&!n∣r,];r~Max~-1

Oczekuje, ż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 DateStringi format specyfikacji :).

Edycja: Całkowicie zapomniałem o -1wymaganiu. Naprawiono teraz.

Oto wyjaśnienie

For[i=0,            i--                        ,];         (* i is the number of days AFTER
                                                              today. Hence, we decrement 
                                                              it. *)
For[i=0,   DatePlus@i--                        ,];         (* If no reference date is
                                                              provided, DatePlus will add
                                                              the given number of days to
                                                              today's date. The result is a 
                                                              list of 3 integers, luckily 
                                                              in order {year,month,day} *)
For[i=0,   DatePlus@i--~FromDigits~100         ,];         (* Interpret these as the digits
                                                              of a base 100 number. The 
                                                              beauty is that FromDigits
                                                              doesn't care about digits 
                                                              greater than the base and 
                                                              just carries them over. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)        ,];         (* Store the number in r. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)>0      ,];         (* Make sure it's positive. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)>0&&!n|r,];         (* And keep going while n does 
                                                              not divide r. *)
For[i=0,(r=DatePlus@i--~FromDigits~100)>0&&!n|r,];r~Max~-1 (* Clamp result to -1. *)

Zauważ, że użyłem |zamiast w objaśnieniu, ponieważ Unicode jeden miesza się z monospacingiem.

Martin Ender
źródło
+ 1.Czy masz link wskazujący, że powinieneś liczyć znaki Unicode jako 3 bajty?
Dr Belisarius
2
@belisarius OP stwierdził, że ten kod golfa jest liczony w bajtach, a nie w znakach (jest to również domyślna wartość podana w tagu wiki).
Martin Ender
Nigdy nie musiałem czytać na końcu wiki :) Dzięki!
Dr Belisarius
6

Python 2 - 150

import datetime as d,re
def f(n):
 t=d.date.today()
 while t:
    c=int(re.sub("-","",str(t)))
    if c%n<1:return c
    try:t-=d.timedelta(1)
    except:return-1

Dzięki @ chill0r za sugestię usunięcia dni =, a Jason S za wskazówkę, że blok try może zostać zredukowany do jednej linii.

Vectorized
źródło
Tak. To standardowa procedura operacyjna;). Po wklejeniu karty są przekształcane w spacje.
Wektoryzacja
Można usunąć days=in t-=d.timedelta(days=1). Działa to również dobrze (przynajmniej w python3)
chill0r
@bitpwner ah widzę, nieważne wtedy.
Martin Ender
1
Możesz zaoszczędzić więcej: (1) użyj int(t.strftime("%Y%m%d"))i upuść re, (2) użyj jednowierszowego, tryponieważ t-=d.timedelta(1)musi być tylko w nim.
Jason S
1
@bitpwner strftimena starszych datach działa w python3, zaznaczone i dostaję błąd w python2
Jason S
5

C # 136

W zmienionych specyfikacjach funkcja, która przyjmuje wartość całkowitą bez znaku i zwraca wartość całkowitą.

int F(uint n){var d=System.DateTime.Now;int i;try{while((i=int.Parse(d.ToString("yyyMMdd")))%n>0)d=d.AddDays(-1);}catch{i=-1;}return i;}

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.

class P{static void Main(){var n=4;var d=System.DateTime.Now;string s;try{while(int.Parse(s=d.ToString("yyyMMdd"))%n>0)d=d.AddDays(-1);}catch{s="-1";}}}

204 znaki z STDIN / STDOUT:

using System;class P{static void Main(){int n=int.Parse(Console.ReadLine());var d=DateTime.Now;string s;try{while(int.Parse(s=d.ToString("yyyMMdd"))%n>0)d=d.AddDays(-1);}catch{s="-1";}Console.Write(s);}}
Kok
źródło
1
Naprawdę, głosowanie negatywne? Czy to nie rozwiązuje problemu poprawnie? Proszę wytłumacz. Jeśli ktoś myśli, że zduplikowałem drugą odpowiedź w języku C #, napisałem to około godzinę przed drugą, a nawet rozważałem użycie C # 6.0 do wyrażeń deklaracji. Zostałem trochę odsunięty na bok, co spowodowało, że odpowiedź została wysłana późno. Nawet wtedy jest to raczej powolny powód do głosowania.
Bob
4

T-SQL (2012) - 148

Zakłada się, że istnieje wolna zmienna @n o wartości n.

declare @ date=getdate()while convert(char,@,112)%@n>0 and'00010101'<@ set @=dateadd(d,-1,@)print iif(convert(char,@,112)%@n=0,convert(char,@),'-1')
Michael B.
źródło
4

Golflua 90 86

n=I.r()d="%Y%m%d"i=O.d(d)+0j=0@i>0?i%n==0w(i)O.q()$j=j+1i=O.d(d,O.t()-j*86400)+0$w(-1)

Nie golfowa wersja Lua byłaby,

n = io.read()
d = "%Y%m%d"
i = os.date(d)+0   -- implicitly casts os.date(d) to int
j = 0
while i>0 do
   if i % n == 0 then
      print(i)
      os.exit()
   end
   j = j+1
   i = os.date(d,os.time()-j*86400)+0
end
print(-1)
Kyle Kanos
źródło
2
Testowano tutaj n = 20140699 wyników 20140699
William Barbosa
@WilliamBarbosa: Naprawiono; 20140699 zwraca -1.
Kyle Kanos
4

MATLAB: 61

-1,s=str2num(datestr(1:now,'YYYYmmDD')),d=s(~mod(s,n)),d(end)

Zakłada, że ​​dzielnik jest zapisany n. Wynik zostanie zapisany w zmiennej o nazwie ans.


Skomentowana wersja:

-1                                     % Store -1 in ans in case we don't find anything
s=str2num(datestr(1:now,'YYYYmmDD'))   % Make a list of date numbers
d=s(~mod(s,n)),                        % Select only those who are dividable and prepend -1
d(end)                                 % Store last found value in ans, if anything is found

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:

s=str2num(datestr(1:now,'YYYYmmDD')),d=[-1;s(~mod(s,n))],d(end)
Dennis Jaheruddin
źródło
@ MartinBüttner Hmm, rozwiązałem ten problem, ale teraz rozwiązanie jest powiązane tylko z minimalnymi znakami. Czy widzisz jakieś ulepszenia?
Dennis Jaheruddin
1
Nie, nie z mojej głowy. Ale moja motywacja, aby pomóc ci mnie pokonać, jest nieco ograniczona. ;)
Martin Ender
4

PHP (92 = 85 + 7)

Oczekuje, że dane wejściowe zostaną zapisane $n.

for($d=date("Ymd");!($d%$n==0&checkdate($d/100%100,$d%100,substr($d,0,4))|$d<0);$d--);echo$d

Właśnie przypomniałem sobie, dlaczego nie lubię PHP =)

EDYCJA: Teraz zaimplementowano również -1 specyfikacji.

wada
źródło
Nie, po prostu to sprawdziłem, $ d będzie o jeden za niski, gdy echo. Co rozumiesz przez „masz kuźnię”? (Przepraszamy, brak angielskiego ojczystego =)
flawr
Och, nie widziałem tej specyfikacji, oczywiście trzeba ją dodać, dzięki!
flawr
3

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ą).

for(z=new Date,t=n+1;t>n&&t%n;)
  d=z.getDate(),
  t=z.getFullYear()*1e4+(z.getMonth()+1)*100+d,
  z.setDate(d-1);
r=t>n?t:-1
edc65
źródło
3

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 zmiennej r. Jest 00010101to jednak pierwsza data, ponieważ data 00000101nie istnieje. Sugestie dotyczące ulepszeń są zawsze mile widziane.

class P{static void Main(){int n=7,r;var d=System.DateTime.Now;try{for(;(r=int.Parse(d.ToString("yyyMMdd")))%n>0;d=d.AddDays(-1));}catch{r=-1;}}}

Wersja LINQPad:

int n=7,r;var d=System.DateTime.Now;try{for(;(r=int.Parse(d.ToString("yyyMMdd")))%n>0;d=d.AddDays(-1));}catch{r=-1;}r.Dump();
William Barbosa
źródło
3

Groovy - 301 300 znaków

Bardzo prosty (i wolny), bez żadnych sztuczek, aby ukryć fakt, że używa Joda Time.

Gra w golfa:

@Grab(group='joda-time', module='joda-time', version='2.3')
import org.joda.time.*
import org.joda.time.format.*
f={DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(it)) as int}
n=args[0] as int;b=0;x=-1;c=0
while(!b){if(f(c++)%n==0){x=f(--c);b=1};if(f(0)-c<=101){b=1}}
println x

Przykładowy przebieg (30.07.2014):

$ groovy D.groovy  7
20140729
$ groovy D.groovy  16
20140720
$ groovy D.groovy  90000
-1

Nie golfowany:

@Grab(group='joda-time', module='joda-time', version='2.3')

import org.joda.time.*
import org.joda.time.format.*

f = { DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(it)) as int }

n = args[0] as int
b = 0 
x = -1
c = 0

while (!b) {
    if(f(c++)%n==0) { x=f(--c); b=1}
    if(f(0)-c<=101){b=1}
}

println x
Michael Easter
źródło
3

R, 146 139

D=function(n){
z=as.double(gsub("-","",y<-Sys.Date()))
d=F
while(z>100&!d){
y=y-1 
z=as.double(gsub("-","",y))
d=!z%%n}
ifelse(z>100,z,-1)}

Powodzenia z randką, która nie działa. microbenchmarkinformuje, ż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

Shadowtalker
źródło
!djest krótszy niż d==Fi !z%%nniż z%%n==0. Również przekształcenie as.numeric(gsub("-","",...)w funkcję powinno również zmniejszyć liczbę znaków. Dobra robota!
plannapus
Aha i as.realczęsto jest dobrą, krótszą alternatywą dla as.numeric.
plannapus
Niestety nie as.realdziała od wersji 3.0.0. Ale wciąż mamy as.doublejedną postać krótszą.
shadowtalker
Och, nie wiedziałem tego, ponieważ wciąż używam R 2.14
plannapus
1
Nie pracuję na komputerze, na którym mam uprawnienia administracyjne, więc to tak naprawdę nie zależy ode mnie. Ale ja już mam paste0w moim .Rprofilenaturalnie :)
plannapus
3

Matlab 104

function d=f(v);for d=fix(now):-1:1 d=str2num(datestr(d,'YYYYmmDD'));if~mod(d,v)return;end;end;d=-1;end

Nie golfowany:

function d = f(v)
   for d=fix(now):-1:1
       d = str2num(datestr(d,'YYYYmmDD'));
       if ~mod(d,v)
          return; 
       end
   end
   d = -1;
end

EDYCJA: Udało mi się trochę zoptymalizować, ale @DennisJaheruddin ma tutaj prawdziwe rozwiązanie

Scott
źródło
To może być jeszcze trochę golfa, zaktualizuję to.
Dennis Jaheruddin
@DennisJaheruddin Odrzuciłem twoją edycję na podstawie tego meta postu . Proszę zasugerować swoje ulepszenia w komentarzu, aby PO mógł je przejrzeć przed zmodyfikowaniem swojej odpowiedzi.
Martin Ender
Zauważ, że możesz zapisywać znaki na różne sposoby: użyj skryptu zamiast funkcji, pozwól przypisać rzeczy do ans, wykonaj pętlę od niskiego do wysokiego i pozwól, aby każdy wynik nadpisał poprzedni, abyś nie musiał przerywać pętli . - Oczywiście wektoryzacja również może pomóc, patrz moja odpowiedź .
Dennis Jaheruddin
Oto krótsza wersja 67 znaków w oparciu o pętlę:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin
@ MartinBüttner Dzięki za komentarz. Wystąpił błąd, jak powiedziałeś. Teraz powinno być dobrze.
Scott
3

Python 3 - 151 148 bajtów, generatory

from datetime import*
t=date.today()
f=lambda n:next((y for y in(int((t-timedelta(o)).strftime("%Y%m%d"))for o in range(t.toordinal()))if y%n<1),-1)

Dzięki @ nyuszika7h za import*sugestię

Jason S.
źródło
2

Rubinowy 103

require'date'
f=->{d=Date.today 
(s=d.strftime('%Y%m%d').to_i
return s if s%n<1
d-=1)while d.year>0
-1}

Wkład

Oczekuje, że wartość dzielnika będzie występować w zmiennej n.

Wydajność

Zwracana wartość ffunkcji

Przykład online: http://ideone.com/LoYxG4

Cristian Lupascu
źródło
2

Java: 373 znaków

To jest port Groovy odpowiedzi i używa Joda Time.

Gra w golfa:

import org.joda.time.*;
import org.joda.time.format.*;
public class D {
static int f(int i){return Integer.parseInt(DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(i)));}
public static void main(String[] args){
int n=Integer.parseInt(args[0]);int b=0,c=0,x=-1;
while(b!=1){if(f(c++)%n==0){x=f(--c);b=1;};if(f(0)-c<=101){b=1;}}
System.out.println(x);}}

Przykładowe przebiegi (z joda-time-2.4.jar na ścieżce klasy:

$ java D 7
20140729
$ java D 4
20140728
$ java D 16
20140720
$ java D 90000
-1

Nie golfowany:

import org.joda.time.*;
import org.joda.time.format.*;

public class D {
    static int f(int i) {
        return Integer.parseInt(DateTimeFormat.forPattern("yyyyMMdd").print(new LocalDate().minusDays(i)));
    }

    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        int b = 0,c = 0,x = -1;

        while(b!=1) {
            if(f(c++)%n==0) { x=f(--c);b=1; }
            if(f(0)-c<=101) { b=1; }
        }

        System.out.println(x);
    }
}
Michael Easter
źródło
3
Jest również java.time.*w najnowszej wersji Java.
ntoskrnl
2

Bash + coreutils (8,21), 67 bajtów

seq -f-%gday $[9**9]|date -f- +[pq]sp[_1pq]sq%Y%m%ddA1=qd$1%%0=p|dc
  • seqgeneruje liczby całkowite od 1 do 9 9 , po jednej na linię i formatuje ją jako-<x>day
  • potokuj to, date -fco interpretuje każdy wiersz i wyświetla datę sformatowaną w dcwyraż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ńcz
    • sq zapisz makro w rejestrze q
    • 20140728 liczba całkowita osadzona
    • d zduplikowany początek stosu
    • A1 push 101 (00000101)
    • =qwyskakuj z górnych 2 wartości stosu: porównaj datę i wartość 101 i wywołaj makro, qjeśli jest równe
    • 7 push divider
    • % pop dzielnik i dzielnik, dziel i pchaj resztę
    • 0 naciśnij 0
    • =pwyskakuj z górnych 2 wartości stosu: porównaj resztę i 0, i wywołaj makro pjeśli jest równe
    • d zduplikowany początek stosu
    • makro pnazywa się: drukuje datę całkowitą i zamknięcia dccałkowitemu
  • dcwyrażenia są przesyłane potokowo do dcoceny. Po dcwydrukowaniu właściwej wartości i zakończeniu, reszta rurociągu zostaje zerwana

Wydajność:

$ ./lastdivdate.sh 4
20140728
$ ./lastdivdate.sh 7
20140729
$ ./lastdivdate.sh 123456
17901120
$ ./lastdivdate.sh 77777
19910912
$ ./lastdivdate.sh 7777777
-1
$ 

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.

Cyfrowa trauma
źródło
@ MartinBüttner Curses! Teraz robi to z 19 bajtową karą :)
Cyfrowa trauma
Krótsze sposoby konwertowania pustych danych wyjściowych na -1: dodaj |grep .||echo -1na końcu potoku lub użyj zsh, gdzie możesz zagnieżdżać rozszerzenia takie jak echo ${$(cmd):-1}(to będzie kosztować cię odwrotnym ukośnikiem w innym miejscu ...)
@ WumpusQ.Wumbley Dlaczego o tym nie pomyślałem? Dzięki!
Digital Trauma
1
Nawiasem mówiąc, wydaje się to być wrażliwe na wersję coreutils. Mój (8.15) odmawia powrotu przed rokiem 1901 ze specyfikacją „dni temu”.
1
W rzeczywistości wydaje się to być sizeof time_tproblemem, 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-bitowa
2

PYTHON: 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.

from datetime import*
def y(a,n):
 s=a.strftime("%Y%m%d")
 if int(s)%n==0:yield s
 try:x=y(a-timedelta(1),n)
 except:yield -1
 yield x

Nie golfowany:

from datetime import *
def y(a, n):
    s=int(a.strftime("%Y%m%d"))
    if s%n==0:
        yield s
    try:
        x=y(a-timedelta(1), n)
    except:
        yield -1
    yield x
RageCage
źródło
To właściwie 138 bajtów. Możesz zapisać 4 bajty, używając from datetime import*zamiast import datetime as d, timedelta(1)zamiast d.timedelta(1)i yieldzamiast return.
nyuszika7h
Używam losowego internetowego licznika bajtów, czy jest lepsza opcja?
RageCage
Co sprawia, że ​​ten różni się od tego? bytecount.bluebus112.com
RageCage
Ten nie liczy nowych linii, plus liczy znaki , a nie bajty. W przypadku tekstu ASCII oba są takie same, więc nie ma tutaj znaczenia. W golfowym kodzie zazwyczaj liczysz znaki, chyba że OP mówi inaczej. (Również ten, który
podłączyłem,
2

JavaScript (ES5) - 94

Oczekuje danych wejściowych w zmiennej xi umieszcza dane wyjściowe w o.

for(i=Date.now();i>-7e13&&(o=(new Date(i)).toISOString().replace(/-|T.*/g,''))%x;i-=864e5)o=-1
Ben
źródło
2

k4 (84) (73)

f:{f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;.z.D];x]}

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:

  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.30];x]}4
20140728
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.30];x]}7
20140729
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.28];x]}4
20140728
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;2014.07.28];x]}7
20140722
  "d"$-728450
0005.07.28
  {f d@*|&~.q.mod[(f:{$[^x;-1;.($x)@&~"."=$x]})'d:{"d"$x+!1+"i"$y-x}[-730457;-728450];x]}90000
-1

edytować:

g:.,/$`\:`$$:;f:{$[Z=r:{(z>x)&.q.mod[g z]y}[Z:-730458;y]{x-1}/x;-1;g"d"$r]}

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:

  g:.,/$`\:`$$:;{$[Z=r:{(z>x)&.q.mod[g z]y}[Z:-730458;y]{x-1}/x;-1;g"d"$r]}'[2014.07.30 2014.07.30 2014.07.28 2014.07.28,"d"$-728450;4 7 4 7 90000]
20140728 20140729 20140728 20140722 -1
Aaron Davies
źródło
1

VBA 343 bajtów (moduł)

Sub divD(i As Long)
a = Now()
b = Format(a, "yyyymmdd")
    Do While b / i <> Int(b / i)
    a = DateAdd("d", -1, a)
    b = Format(a, "yyyymmdd")
        If b = "01000101" Then
            MsgBox -1
            Exit Sub
        End If
    Loop
MsgBox b
End Sub
Alex
źródło
Można to mocno skrócić w 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 Subprzypadku 139 Bytes
Taylor Scott
1

PowerShell - 76

Zależy to od liczby przechowywanej w zmiennej $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
Rynant
źródło