À quand remonte la dernière fois que la date était divisible par n?


24

Une date peut être représentée par un entier non signé comme tel: YYYYMMDD. Ce que vous devez faire, c'est écrire le programme ou la fonction la plus courte qui détermine la date la plus récente dont le nombre était divisible par un nombre donné n(y compris la date du jour), puis renvoie cette date dans le format indiqué ci-dessus. S'il n'y a jamais eu de date (entre 00000101 et aujourd'hui inclus) divisible par l'entier donné, vous devez retourner -1.

Exemples

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

Contribution

Vous pouvez lire à partir de STDIN ou prendre un argument de fonction ou même vous attendre à ce que l'entrée soit stockée dans une variable. L'entrée sera un entier non signé.

Sortie

Écrivez dans STDOUT ou renvoyez (ou enregistrez dans une variable) l'entier représentant la date au format AAAAMMJJ.

Restrictions

Vous pouvez utiliser n'importe quelle bibliothèque standard proposée par votre langue. Des échappatoires standard s'appliquent.

Conditions gagnantes

Il s'agit d'un , donc le plus petit programme (en octets) gagne. En cas d'égalité, la réponse avec le plus de votes l'emporte.


4
La date 00000101 n'existe pas. Le décompte des années commence par 1. en.wikipedia.org/wiki/0_%28year%29
edc65

1
@ edc65 peut-on prétendre qu'il existe?
suracteur

3
Et le 29 février? Avons-nous besoin d'appliquer les règles de l'année bissextile complète pour vérifier les dates valides? en.wikipedia.org/wiki/Leap_year
Digital Trauma

6
Qu'en est-il des jours perdus à cause du changement de calendrier julien-grégorien? Ou allons-nous grégorien jusqu'au bout? en.wikipedia.org/wiki/Gregorian_calendar
Digital Trauma

1
Vos spécifications d'entrée / sortie sont plutôt lâches. Par exemple, est-ce que "s'attendre à ce que l'entrée soit stockée dans une variable" compte la déclaration de variable dans un langage comme C? Vous dites «écrire un programme», mais vous dites «prendre un argument de fonction» - cela signifie-t-il que nous pouvons écrire juste une fonction plutôt qu'un programme complet?
Bob

Réponses:


16

Mathematica, 93 60 octets

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

S'attend à ce que l'entrée soit stockée n.

Notez que la ligne verticale est le caractère unicode pour "divise", que j'ai compté comme 3 octets (UTF-8).

Edit: Trouvé une astuce pour éviter les DateStringspécifications gonflées et de format :).

Edit: totalement oublié l' -1exigence. Fixé maintenant.

Voici une explication

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

Notez que je l'ai utilisé à la |place de dans l'explication, car celui Unicode dérange avec le monospace.


+ 1.Avez-vous un lien indiquant que vous devez compter les caractères unicode comme 3 octets?
Dr belisarius

2
@belisarius L'OP a déclaré que ce code golf est compté par octets et non par caractères (c'est également la valeur par défaut comme indiqué dans le tag wiki).
Martin Ender

Je n'ai jamais pu lire jusqu'à la fin du wiki :) Merci!
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

Merci @ chill0r pour la suggestion de supprimer days =, et Jason S pour le conseil que le bloc try peut être réduit à une ligne.


Oui. Il s'agit d'une procédure d'exploitation standard;). Les onglets sont convertis en espaces après avoir été collés.
Vectorisé

Vous pouvez supprimer le days=dans t-=d.timedelta(days=1). Cela fonctionne aussi très bien (au moins en python3)
chill0r

@bitpwner ah je vois, tant pis alors.
Martin Ender

1
Vous pouvez économiser plus: (1) utiliser int(t.strftime("%Y%m%d"))et supprimer re, (2) utiliser une seule ligne trycar il ne t-=d.timedelta(1)doit y être que.
Jason S

1
@bitpwner strftimesur les dates plus anciennes fonctionne en python3, vérifié et j'obtiens une erreur en python2
Jason S

5

C # 136

Avec les spécifications révisées, une fonction qui prend un entier non signé et retourne un entier.

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 caractères avec entrée / sortie variable

Profitant des exigences d'entrée / sortie lâches, l'entrée doit être stockée dans la variable n(comptant actuellement tous les caractères sauf le littéral entier), et la sortie est fournie avec 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 caractères avec 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);}}

1
Vraiment, un downvote? Cela ne résout-il pas correctement le problème? S'il vous plaît, expliquez. Si quelqu'un pense que j'ai dupliqué l'autre réponse C #, j'ai écrit cela environ une heure avant l'autre, et j'ai même cherché à utiliser C # 6.0 pour les expressions de déclaration. J'ai été un peu détourné, ce qui a entraîné la publication tardive de la réponse. Même alors, c'est une raison plutôt fragile pour un downvote.
Bob

4

T-SQL (2012) - 148

Suppose qu'il existe une variable libre @n avec la valeur 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')

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)

Une version non golfée de Lua serait,

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)

2
Testé ici n = 20140699 sorties 20140699
William Barbosa

@WilliamBarbosa: fixe; 20140699 renvoie -1.
Kyle Kanos

4

MATLAB: 61

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

Suppose que le diviseur est stocké dans n. Le résultat sera stocké dans une variable appelée ans.


Version commentée:

-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

Générera une erreur si aucun résultat n'est trouvé, mais la réponse est toujours disponible dans la variable malgré cela.


L'erreur pourrait être évitée au prix de 2 caractères supplémentaires:

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

@ MartinBüttner Hmm, a résolu ce problème mais maintenant la solution n'est liée que pour les caractères minimum. Pouvez-vous voir des améliorations?
Dennis Jaheruddin

1
Non, pas du haut de ma tête. Mais ma motivation pour vous aider à me battre est un peu limitée. ;)
Martin Ender

4

PHP (92 = 85 + 7)

S'attend à ce que l'entrée soit stockée $n.

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

Je viens de me rappeler pourquoi je n'aime plus PHP =)

EDIT: Maintenant, le -1 des spécifications est également implémenté.


Non, je viens de le vérifier, $ d sera un trop bas lors de l'écho. Qu'entendez-vous par «vous avez forgé»? (Désolé, pas de langue maternelle anglaise =)
flawr

Oh, je n'ai pas vu cette spécification, bien sûr, cela doit être ajouté, merci!
flawr

3

JavaScript (ES6) 115

Attend un nombre dans la variable n, résultat stocké dans la variable r. Chaque jour est vérifié, en commençant par la date actuelle et en décrémentant - il doit y avoir un meilleur moyen.
De plus, en utilisant les fonctions de date javascript standard, toutes les dates sont grégoriennes jusqu'à l'année 1 (avec des années bissextiles en conséquence erronées avant la réforme grégorienne).

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

3

C # - 144 (ou 124 dans LINQPad) + 1 pour chaque chiffre dans n

Cela suppose que l'entrée soit dans la variable n. À la fin de l'exécution, la valeur souhaitée sera dans la variable r. Ceci est considéré 00010101comme la première date, cependant, car la date 00000101n'existe pas. Les suggestions d'amélioration sont toujours les bienvenues.

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

Version 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();

3

Groovy - 301 300 caractères

Très simple (et lent), sans astuces pour cacher le fait qu'il utilise Joda Time.

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

Exemple d'exécution (le 30/07/2014):

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

Non 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

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

Bonne chance avec une date qui ne fonctionne pas. microbenchmarkrapporte qu'il faut environ une demi-seconde pour revenir en arrière de 15 jours. Au 31 juillet 2014, cela prendrait environ 20 millions de secondes (~ 23 jours) pour cracher -1, au moins selon le dos de l'enveloppe.

edit : quelques raccourcis dans les commentaires


!dest plus court que d==Fet !z%%nque z%%n==0. De plus, la transformation as.numeric(gsub("-","",...)en fonction devrait également réduire le nombre de caractères. Encore du beau travail!
plannapus

Oh et as.realc'est souvent une bonne alternative plus courte à as.numeric.
plannapus

Malheureusement, il as.realn'existe plus depuis R 3.0.0. Mais nous avons encore as.doubleun caractère plus court.
shadowtalker

Oh, je ne le savais pas car j'utilise toujours R 2.14
plannapus

1
Je ne travaille pas sur un ordinateur sur lequel j'ai des droits d'administration, donc ce n'est pas vraiment à moi. Mais j'en ai déjà paste0dans mon .Rprofilenaturellement :)
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

Non 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

EDIT: J'ai réussi à l'optimiser un peu, mais @DennisJaheruddin a la vraie solution ici


Cela peut encore être joué un peu, je vais le mettre à jour.
Dennis Jaheruddin

@DennisJaheruddin J'ai rejeté votre modification sur la base de ce message . Veuillez suggérer vos améliorations dans un commentaire, afin que le PO puisse les réviser avant de modifier sa réponse.
Martin Ender

Notez que vous pouvez enregistrer les caractères de différentes manières: utilisez un script plutôt qu'une fonction, laissez les choses être affectées à ans, faites la boucle de bas en haut et laissez chaque résultat écraser le précédent afin que vous n'ayez pas besoin de rompre la boucle . - Bien sûr, la vectorisation peut aussi aider, voir ma réponse .
Dennis Jaheruddin

Voici une version basée sur une boucle plus courte de 67 caractères:-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Dennis Jaheruddin

@ MartinBüttner Merci pour le commentaire. Il y a eu une erreur comme vous l'avez dit. Maintenant ça devrait aller.
Scott

3

Python 3 - 151 148 octets, générateurs

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)

Merci @ nyuszika7h pour la import*suggestion


2

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

Contribution

Attend que la valeur du diviseur soit présente dans la variable n.

Sortie

La valeur de retour de la ffonction

Exemple en ligne: http://ideone.com/LoYxG4


2

Java: 373 caractères

Il s'agit d'un portage de la réponse Groovy et utilise Joda Time.

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

Exemples d'exécutions (avec joda-time-2.4.jar sur classpath:

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

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

3
Il y a aussi java.time.*dans la dernière version de Java.
ntoskrnl

2

Bash + coreutils (8.21), 67 octets

seq -f-%gday $[9**9]|date -f- +[pq]sp[_1pq]sq%Y%m%ddA1=qd$1%%0=p|dc
  • seqgénère des entiers de 1 à 9 9 , un par ligne, et le formate comme-<x>day
  • redirige ceci vers date -flequel interprète chaque ligne et affiche la date formatée dans une dcexpression telle que [pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p(espaces ajoutés pour plus de lisibilité)
    • [pq] définir une macro pour imprimer le haut de la pile, puis quitter
    • sp enregistrer la macro dans le registre p
    • [pq] définir une macro pour pousser -1, imprimer le haut de la pile, puis quitter
    • sq enregistrer la macro dans le registre q
    • 20140728 entier de date intégré
    • d dupliquer le haut de la pile
    • A1 pousser 101 (00000101)
    • =qpop top 2 stack values: compare date and 101, and call macro qif equal
    • 7 diviseur poussoir
    • % diviseur de pop et dividee, le diviser et pousser le reste
    • 0 pousser 0
    • =ppop top 2 valeurs de pile: comparer le reste et 0, et appeler la macro psi égale
    • d dupliquer le haut de la pile
    • la macro pest appelée: imprime un entier de date et quitte dccomplètement
  • dcles expressions sont dirigées vers l' dcévaluation. Une fois dcla bonne valeur imprimée et quittée, le reste du pipeline est détruit

Sortie:

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

Étant donné que ce programme génère des nombres entiers de 1 à 9 9 , il sera valable jusqu'à un peu plus d'un million d'années dans le futur. J'espère que cette limitation est acceptable ;-)


Merci @ WumpusQ.Wumbley pour avoir raccourci le retour de -1.


@ MartinBüttner Curses! Maintenant c'est le cas, avec une pénalité de 19 octets :)
Digital Trauma

Des moyens plus courts pour convertir une sortie vide en -1: ajoutez |grep .||echo -1à la fin du pipeline, ou utilisez zsh où vous pouvez imbriquer des extensions comme echo ${$(cmd):-1}(cela vous coûtera une barre oblique inverse ailleurs ...)

@ WumpusQ.Wumbley Pourquoi n'y ai-je pas pensé? Merci!
Digital Trauma

1
Soit dit en passant, cela semble être sensible à la version coreutils. Le mien (8,15) refuse de revenir avant 1901 avec la spécification "il y a quelques jours".

1
En fait, cela semble être un sizeof time_tproblème, car la limite où il se casse est de 2 ** 31 secondes avant le 1/1/1970. Mon ancienne installation est également pathétiquement 32 bits

2

PYTHON: 134 octets

Je ne vais pas pouvoir battre le leader actuel, et ce n'est pas beaucoup mieux que la meilleure réponse Python, mais j'ai décidé de publier ma meilleure solution 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

Non 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

C'est en fait 138 octets. Vous pouvez enregistrer 4 octets en utilisant from datetime import*au lieu de import datetime as d, timedelta(1)au lieu de d.timedelta(1)et yieldau lieu de return.
nyuszika7h

J'utilise un compteur d'octets en ligne aléatoire, existe-t-il une meilleure option?
RageCage


Qu'est-ce qui le différencie de celui-ci? bytecount.bluebus112.com
RageCage

Celui-ci ne compte pas les sauts de ligne, plus il compte les caractères , pas les octets. Pour le texte ASCII, les deux sont identiques, donc ce dernier ne fait aucune différence ici. En code-golf , vous comptez généralement les caractères, sauf indication contraire de l'OP. (En outre, celui que j'ai lié était le premier résultat dans Google pour le "nombre d'octets" ici.)
nyuszika7h

2

JavaScript (ES5) - 94

Il attend l'entrée en variable xet place la sortie en o.

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

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

Ce n'est qu'une coupe initiale avec le premier algorithme qui m'est venu à l'esprit; Je suis sûr que c'est mieux en termes de performances et de longueur.

Cette version code en dur la partie "aujourd'hui" (c'est le .z.D); remplacez-le par un littéral de date ( yyyy.mm.dd) ou un entier dans le système de dates q (jours depuis le 1er janvier 2000) pour exécuter les cas de test. (q n'analysera pas les littéraux de date avant le début du XVIIIe siècle, donc pour les dates antérieures, vous devrez déterminer la valeur et utiliser directement l'entier approprié. 1 janvier, "AD 0", à partir de la spécification, devient être -730457utilisé, qui est utilisé dans le code de fonction. Le 28 juillet AD 5, du dernier cas de test, se révèle être -728450.)

Les cas de test donnés:

  {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

modifier:

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

Il s'agit d'une approche différente qui utilise l'un des opérateurs de convergence pour décrémenter la date jusqu'à ce qu'elle en trouve une divisible ou qu'elle franchisse la frontière 1/1/0000. Il effectue également la conversion de date en entier légèrement différemment.

Les cas de test, cette fois d'un seul coup:

  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

1

VBA 343 octets (module)

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

Cela peut être fortement condensé à 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 octets
Taylor Scott

1

PowerShell - 76

Cela dépend du nombre stocké dans la variable $n.

try{@(0..$n|%{'{0:yyyyMMdd}'-f(date).AddDays(-$_)}|?{!($_%$n)})[0]}catch{-1}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.