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 code-golf , donc le plus petit programme (en octets) gagne. En cas d'égalité, la réponse avec le plus de votes l'emporte.
Réponses:
Mathematica,
9360 octetsS'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
DateString
spécifications gonflées et de format :).Edit: totalement oublié l'
-1
exigence. Fixé maintenant.Voici une explication
Notez que je l'ai utilisé à la
|
place de∣
dans l'explication, car celui Unicode dérange avec le monospace.la source
Python 2 - 150
Merci @ chill0r pour la suggestion de supprimer days =, et Jason S pour le conseil que le bloc try peut être réduit à une ligne.
la source
days=
danst-=d.timedelta(days=1)
. Cela fonctionne aussi très bien (au moins en python3)int(t.strftime("%Y%m%d"))
et supprimerre
, (2) utiliser une seule lignetry
car il net-=d.timedelta(1)
doit y être que.strftime
sur les dates plus anciennes fonctionne en python3, vérifié et j'obtiens une erreur en python2C # 136
Avec les spécifications révisées, une fonction qui prend un entier non signé et retourne un entier.
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 variables
.204 caractères avec STDIN / STDOUT:
la source
T-SQL (2012) - 148
Suppose qu'il existe une variable libre @n avec la valeur n.
la source
Golflua
9086Une version non golfée de Lua serait,
la source
MATLAB: 61
Suppose que le diviseur est stocké dans
n
. Le résultat sera stocké dans une variable appeléeans
.Version commentée:
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:
la source
PHP (92 = 85 + 7)
S'attend à ce que l'entrée soit stockée
$n
.Je viens de me rappeler pourquoi je n'aime plus PHP =)
EDIT: Maintenant, le -1 des spécifications est également implémenté.
la source
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).
la source
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 variabler
. Ceci est considéré00010101
comme la première date, cependant, car la date00000101
n'existe pas. Les suggestions d'amélioration sont toujours les bienvenues.Version de LINQPad:
la source
Groovy -
301300 caractèresTrès simple (et lent), sans astuces pour cacher le fait qu'il utilise Joda Time.
Golfé:
Exemple d'exécution (le 30/07/2014):
Non golfé:
la source
R,
146139Bonne chance avec une date qui ne fonctionne pas.
microbenchmark
rapporte 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
la source
!d
est plus court qued==F
et!z%%n
quez%%n==0
. De plus, la transformationas.numeric(gsub("-","",...)
en fonction devrait également réduire le nombre de caractères. Encore du beau travail!as.real
c'est souvent une bonne alternative plus courte àas.numeric
.as.real
n'existe plus depuis R 3.0.0. Mais nous avons encoreas.double
un caractère plus court.paste0
dans mon.Rprofile
naturellement :)Matlab 104
Non golfé:
EDIT: J'ai réussi à l'optimiser un peu, mais @DennisJaheruddin a la vraie solution ici
la source
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 octets, générateursMerci @ nyuszika7h pour la
import*
suggestionla source
Rubis 103
Contribution
Attend que la valeur du diviseur soit présente dans la variable
n
.Sortie
La valeur de retour de la
f
fonctionExemple en ligne: http://ideone.com/LoYxG4
la source
Java: 373 caractères
Il s'agit d'un portage de la réponse Groovy et utilise Joda Time.
Golfé:
Exemples d'exécutions (avec joda-time-2.4.jar sur classpath:
Non golfé:
la source
java.time.*
dans la dernière version de Java.Bash + coreutils (8.21), 67 octets
seq
génère des entiers de 1 à 9 9 , un par ligne, et le formate comme-<x>day
date -f
lequel interprète chaque ligne et affiche la date formatée dans unedc
expression 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 quittersp
enregistrer la macro dans le registre p[pq]
définir une macro pour pousser -1, imprimer le haut de la pile, puis quittersq
enregistrer la macro dans le registre q20140728
entier de date intégréd
dupliquer le haut de la pileA1
pousser 101 (00000101)=q
pop top 2 stack values: compare date and 101, and call macroq
if equal7
diviseur poussoir%
diviseur de pop et dividee, le diviser et pousser le reste0
pousser 0=p
pop top 2 valeurs de pile: comparer le reste et 0, et appeler la macrop
si égaled
dupliquer le haut de la pilep
est appelée: imprime un entier de date et quittedc
complètementdc
les expressions sont dirigées vers l'dc
évaluation. Une foisdc
la bonne valeur imprimée et quittée, le reste du pipeline est détruitSortie:
É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.
la source
|grep .||echo -1
à la fin du pipeline, ou utilisez zsh où vous pouvez imbriquer des extensions commeecho ${$(cmd):-1}
(cela vous coûtera une barre oblique inverse ailleurs ...)sizeof time_t
problè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 bitsPYTHON: 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.
Non golfé:
la source
from datetime import*
au lieu deimport datetime as d
,timedelta(1)
au lieu ded.timedelta(1)
etyield
au lieu dereturn
.JavaScript (ES5) - 94
Il attend l'entrée en variable
x
et place la sortie eno
.la source
k4
(84)(73)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-730457
utilisé, 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:
modifier:
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:
la source
VBA 343 octets (module)
la source
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
139 octetsPowerShell - 76
Cela dépend du nombre stocké dans la variable
$n
.la source