¿Cuándo fue la última vez que la fecha fue divisible por n?

24

Una fecha puede ser representada por un entero sin signo como tal: AAAAMMDD. Lo que debe hacer es escribir el programa o la función más corta que calcule la fecha más reciente cuyo número era divisible por un número determinado n(incluida la fecha de hoy) y luego devuelve esa fecha en el formato que se muestra arriba. Si nunca ha habido una fecha (entre 00000101 y hoy inclusive) divisible por el entero dado, debe devolver -1.

Ejemplos

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

Entrada

Puede leer desde STDIN o tomar un argumento de función o incluso esperar que la entrada se almacene en una variable. La entrada será un entero sin signo.

Salida

Escriba en STDOUT o devuelva (o guarde en una variable) el número entero que representa la fecha en el formato AAAAMMDD.

Restricciones

Puede usar cualquier biblioteca estándar que ofrezca su idioma. Se aplican lagunas estándar .

Condiciones ganadoras

Este es un , por lo que gana el programa más pequeño (en bytes). En caso de empate, la respuesta con más votos gana.

overactor
fuente
44
La fecha 00000101 no existe. El recuento de años comienza en 1. en.wikipedia.org/wiki/0_%28year%29
edc65
1
@ edc65 ¿podemos pretender que existe?
overactor
3
¿Qué hay del 29 de febrero? ¿Necesitamos aplicar las reglas completas del año bisiesto para verificar las fechas válidas? en.wikipedia.org/wiki/Leap_year
Trauma digital
66
¿Qué pasa con los días perdidos debido al cambio de calendario juliano-gregoriano? ¿O vamos a Gregorian todo el camino? en.wikipedia.org/wiki/Gregorian_calendar
Digital Trauma
1
Sus especificaciones de entrada / salida son bastante flojas. Por ejemplo, ¿debería el "esperar que la entrada se almacene en una variable" contar la declaración de variable en un lenguaje como C? Dices "escribe un programa", pero dices "toma un argumento de función". ¿Eso significa que podemos escribir solo una función en lugar de un programa completo?
Bob

Respuestas:

16

Mathematica, 93 60 bytes

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

Espera que la entrada se almacene en n.

Tenga en cuenta que la línea vertical es el carácter unicode para "divide", que he contado como 3 bytes (UTF-8).

Editar: se encontró un buen truco para evitar la hinchazón DateStringy la especificación de formato :).

Editar: Olvidé por completo el -1requisito. Corregido ahora.

Aquí hay una explicación

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

Tenga en cuenta que he usado en |lugar de en la explicación, porque el Unicode se mete con el monoespacio.

Martin Ender
fuente
+ 1. ¿Tiene un enlace que indique que debe contar los caracteres unicode como 3 bytes?
Dr. belisarius
2
@belisarius El OP declaró que este código de golf se cuenta por bytes y no por caracteres (esto también es el valor predeterminado como se indica en la etiqueta wiki).
Martin Ender
Nunca pude leer hasta el final de la wiki :) ¡Gracias!
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

Gracias @ chill0r por la sugerencia de eliminar days =, y Jason S por la sugerencia de que el bloque try se puede reducir a una línea.

Vectorizado
fuente
Sí. Ese es un procedimiento operativo estándar;). Las pestañas se convierten en espacios después de pegar.
Vectorizado
Puede eliminar el days=en t-=d.timedelta(days=1). Esto también funciona bien (al menos en python3)
chill0r
@bitpwner ah ya veo, no importa entonces.
Martin Ender
1
Puede guardar más: (1) usar int(t.strftime("%Y%m%d"))y soltar re, (2) usar una línea tryporque solo t-=d.timedelta(1)necesita estar en ella.
Jason S
1
@bitpwner strftimeen fechas anteriores funciona en python3, comprobado y obtengo un error en python2
Jason S
5

C # 136

Con las especificaciones revisadas, una función que toma un int sin signo y devuelve un int.

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 caracteres con entrada / salida variable

Aprovechando los requisitos de entrada / salida sueltos, la entrada debe almacenarse en la variable n(actualmente cuenta todos los caracteres excepto el literal entero), y la salida se proporciona con la variable 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 caracteres con 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);}}
Mover
fuente
1
¿De verdad, un voto negativo? ¿Esto no resuelve el problema correctamente? Por favor explique. Si alguien piensa que dupliqué la otra respuesta de C #, en realidad escribí esto aproximadamente una hora antes que la otra, e incluso busqué usar C # 6.0 para las expresiones de declaración. Me desvié un poco, lo que resultó en publicar la respuesta tarde. Incluso entonces, esa es una razón bastante débil para un voto negativo.
Bob
4

T-SQL (2012) - 148

Asume que hay una variable libre @n con el valor 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
fuente
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)

Una versión de Lua sin golf sería:

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
fuente
2
Probado aquí n = 20140699 salidas 20140699
William Barbosa
@WilliamBarbosa: fijo; 20140699 devuelve -1.
Kyle Kanos
4

MATLAB: 61

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

Asume que el divisor está almacenado en n. El resultado se almacenará en una variable llamada ans.


Versión comentada:

-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

Generará un error si no se encuentra ningún resultado, pero la respuesta aún está disponible en la variable a pesar de eso.


El error podría evitarse a costa de 2 caracteres adicionales:

s=str2num(datestr(1:now,'YYYYmmDD')),d=[-1;s(~mod(s,n))],d(end)
Dennis Jaheruddin
fuente
@ MartinBüttner Hmm, resolvió ese problema, pero ahora la solución solo está vinculada a caracteres mínimos. ¿Puedes ver alguna mejora?
Dennis Jaheruddin
1
No, no fuera de mi cabeza. Pero mi motivación para ayudarte a vencerme es un poco limitada. ;)
Martin Ender
4

PHP (92 = 85 + 7)

Espera que la entrada se almacene en $n.

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

Acabo de recordar por qué ya no me gusta PHP =)

EDITAR: Ahora también se implementa el -1 de las especificaciones.

falla
fuente
No, solo lo comprobé, $ d será demasiado bajo al hacer eco. ¿Qué quieres decir con 'has falsificado'? (Lo siento, no inglés nativo =)
flawr
Oh, no vi esa especificación, por supuesto, esto tiene que agregarse, ¡gracias!
flawr
3

JavaScript (ES6) 115

Espera número en la variable n, resultado almacenado en la variable r. Cada día se verifica, comenzando con la fecha actual y disminuyendo, debe haber una mejor manera.
Además, utilizando las funciones de fecha estándar de javascript, todas las fechas son gregorianas hasta el año 1 (con los años bisiestos, en consecuencia, incorrectos antes de la reforma gregoriana).

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
fuente
3

C # - 144 (o 124 en LINQPad) + 1 por cada dígito en n

Esto espera que la entrada esté en la variable n. Al final de la ejecución, el valor deseado estará en la variable r. Sin 00010101embargo, esto se considera como la primera fecha, porque la fecha 00000101no existe. Las sugerencias de mejora son siempre bienvenidas.

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;}}}

Versión de 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
fuente
3

Groovy - 301 300 caracteres

Muy simple (y lento), sin trucos para ocultar el hecho de que usa Joda Time.

Golfizado:

@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

Ejecución de ejemplo (30/07/2014):

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

Sin golf:

@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
fuente
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)}

Buena suerte con una cita que no funciona. microbenchmarkinforma que tarda aproximadamente medio segundo en retroceder 15 días. Al 31 de julio de 2014, esto tomará alrededor de 20 millones de segundos (~ 23 días) para escupir -1, al menos de acuerdo con el reverso del sobre.

editar : algunos atajos en los comentarios

Shadowtalker
fuente
!des más corto que d==Fy !z%%nque z%%n==0. Además, convertir as.numeric(gsub("-","",...)una función también debería reducir el recuento de caracteres. Aún así, buen trabajo!
plannapus
Ah, y as.reales a menudo una buena alternativa más corta as.numeric.
plannapus
Desafortunadamente, as.realestá extinto a partir de R 3.0.0. Pero todavía tenemos as.doublecuál es un personaje más corto.
shadowtalker
Oh, no sabía eso, ya que todavía estoy usando R 2.14
plannapus
1
No estoy trabajando en una computadora en la que tengo derechos de administración, por lo que no depende de mí. Pero ya tengo paste0en mi .Rprofilenaturalmente :)
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

Sin golf:

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

EDITAR: logré optimizarlo un poco, pero @DennisJaheruddin tiene la solución real aquí

Scott
fuente
Esto todavía se puede jugar bastante, lo actualizaré.
Dennis Jaheruddin
@DennisJaheruddin He rechazado tu edición en base a esta meta publicación . Sugiera sus mejoras en un comentario, para que el OP pueda revisarlas antes de modificar su respuesta.
Martin Ender
Tenga en cuenta que puede guardar caracteres de varias maneras: use un script en lugar de una función, permita que las cosas se asignen a ans, realice el ciclo de bajo a alto y deje que cada resultado sobrescriba el anterior para que no tenga que romper el ciclo . - Por supuesto, la vectorización también puede ayudar, mira mi respuesta .
Dennis Jaheruddin
Aquí hay una versión más corta basada en bucle de 67 caracteres:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin
@ MartinBüttner Gracias por el comentario. Hubo un error como dijiste. Ahora debería estar bien.
Scott
3

Python 3 - 151 148 bytes, generadores

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)

Gracias @ nyuszika7h por su import*sugerencia

Jason S
fuente
2

Ruby 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}

Entrada

Espera que el valor del divisor esté presente en la variable n.

Salida

El valor de retorno de la ffunción.

Ejemplo en línea: http://ideone.com/LoYxG4

Cristian Lupascu
fuente
2

Java: 373 caracteres

Este es un puerto de la respuesta Groovy, y utiliza Joda Time.

Golfizado:

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);}}

Ejecuciones de muestra (con joda-time-2.4.jar en classpath:

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

Sin golf:

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
fuente
3
También hay java.time.*en la última versión de Java.
ntoskrnl
2

Bash + coreutils (8.21), 67 bytes

seq -f-%gday $[9**9]|date -f- +[pq]sp[_1pq]sq%Y%m%ddA1=qd$1%%0=p|dc
  • seqgenera enteros del 1 al 9 9 , uno por línea, y lo formatea como-<x>day
  • canalice esto a lo date -fque interpreta cada línea y genera la fecha formateada en una dcexpresión como [pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(espacios añadidos para facilitar la lectura)
    • [pq] defina una macro para imprimir la parte superior de la pila, luego salga
    • sp guardar macro en el registro p
    • [pq] defina una macro para presionar -1, imprima la parte superior de la pila y salga
    • sq guardar macro en el registro q
    • 20140728 entero de fecha incrustado
    • d duplicar la parte superior de la pila
    • A1 empuje 101 (00000101)
    • =qpop valores de la pila superior 2: compare la fecha y 101, y llame a macro qsi es igual
    • 7 divisor de empuje
    • % divisor de pop y dividee, el divide y empuja el resto
    • 0 empuje 0
    • =ppop valores de la pila superior 2: compare el resto y 0, y llame a macro psi es igual
    • d duplicar la parte superior de la pila
    • pse llama macro : imprime el entero de la fecha y se cierra por dccompleto
  • dclas expresiones se canalizan dcpara su evaluación. Una vez que dcimprime el valor correcto y se cierra, el resto de la tubería se derriba

Salida:

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

Dado que este programa genera números enteros del 1 al 9 9 , será válido hasta poco más de 1 millón de años en el futuro. Espero que esta limitación sea aceptable ;-)


Gracias @ WumpusQ.Wumbley por acortar el retorno de -1.

Trauma digital
fuente
@ MartinBüttner maldiciones! Ahora lo hace, con una penalización de 19 bytes :)
Digital Trauma
Formas más cortas para convertir la salida vacío a -1: complemento |grep .||echo -1hasta el final de la tubería, o el uso zsh donde se puede expansiones nido como echo ${$(cmd):-1}(esto le costará una barra invertida en otro lugar ...)
@ WumpusQ.Wumbley ¿Por qué no pensé en eso? ¡Gracias!
Trauma digital
1
Por cierto, esto parece ser sensible a la versión coreutils. El mío (8.15) se niega a regresar antes de 1901 con la especificación "días atrás".
1
En realidad, parece ser un sizeof time_tproblema, ya que el límite donde se rompe es 2 ** 31 segundos antes del 1/1/1970. Mi instalación anterior también es patéticamente de 32 bits
2

PITÓN: 134 bytes

No voy a poder vencer al líder actual, y no es mucho mejor que la mejor respuesta de Python, pero decidí publicar mi mejor solución de 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

Sin golf:

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
fuente
En realidad son 138 bytes. Puede guardar 4 bytes utilizando en from datetime import*lugar de import datetime as d, en timedelta(1)lugar de d.timedelta(1)y en yieldlugar de return.
nyuszika7h
Estoy usando un contador de bytes en línea aleatorio, ¿hay una mejor opción?
RageCage
¿Qué lo hace diferente a este? bytecount.bluebus112.com
RageCage
Ese no cuenta nuevas líneas, además cuenta caracteres , no bytes. Para el texto ASCII, los dos son iguales, por lo que el último no hace una diferencia aquí. En code-golf , generalmente cuenta los caracteres a menos que el OP indique lo contrario. (Además, el que vinculé fue el primer resultado en Google para "conteo de bytes" aquí.)
nyuszika7h
2

JavaScript (ES5) - 94

Espera la entrada en variable xy coloca la salida en o.

for(i=Date.now();i>-7e13&&(o=(new Date(i)).toISOString().replace(/-|T.*/g,''))%x;i-=864e5)o=-1
Ben
fuente
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]}

Esto es solo un corte inicial con el primer algoritmo que vino a la mente; Estoy seguro de que es mejor tanto en rendimiento como en longitud.

Esta versión codifica la parte "hoy" (esa es la .z.D ); cámbielo a un literal de fecha ( yyyy.mm.dd) o un entero en el sistema de fechas q (días desde el 1 de enero de 2000) para ejecutar los casos de prueba. (q no analizará los literales de fechas anteriores a principios del siglo XVIII, por lo que para las fechas anteriores, deberá calcular el valor y usar el entero apropiado directamente. El 1 de enero, "AD 0", de la especificación, se convierte fuera de ser -730457, que se utiliza en el código de función. 28 de julio, AD 5, desde el último caso de prueba, resulta ser -728450.)

Los casos de prueba dados:

  {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

editar:

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

Este es un enfoque diferente que utiliza uno de los operadores de convergencia para disminuir la fecha hasta que encuentre una divisible o cruce el límite de 1/1/0000. También realiza la conversión de fecha a entero de forma ligeramente diferente.

Los casos de prueba, esta vez de una vez:

  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
fuente
1

VBA 343 bytes (módulo)

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
fuente
Esto se puede condensar fuertemente a 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 Sub139 Bytes
Taylor Scott
1

PowerShell - 76

Esto depende del número que se almacena en la variable $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
Rynant
fuente