Je viens d'avoir une idée géniale pour rendre la vie professionnelle plus facile - un compte à rebours pour une date spécifique qui ne compte que les jours ouvrables.
La tâche de base consiste à créer un compte à rebours à une date spécifique qui inclut uniquement les jours ouvrables dans le compte à rebours.
Comme la journée de travail compte lundi , mardi , mercredi , jeudi et vendredi .
L'entrée doit être une date spécifique dans le format standard européen "non officiel" dd.MM.yyyy
et doit être aujourd'hui ou un jour dans le futur.
Le résultat ne doit être que le nombre de jours restants.
Comme c'est du golf de code le plus court gagne.
Cas de test:
Today | Input | Output
10.12.2018 | 17.12.2018 | 5
02.10.2018 | 16.10.2018 | 10
Si j'ai raté certaines choses dans la question, veuillez me pardonner - c'est ma première question :)
ÉDITER:
- Vous pouvez utiliser
false
comme sortie au lieu de0
<- mais ce n'est pas beau - Pas besoin de respecter l'heure d'été
Réponses:
05AB1E ,
130128133131124 124123 octetsJe suis hors de mon esprit..
Pour la langue de golf 05AB1E, peu importe que l'entrée soit avec
.
ou-
. Cependant, 05AB1E n'a pas de commandes intégrées pour les objets Date ou les calculs. Le seul élément intégré concernant les dates dont il dispose est l'année / mois / jour / heures / minutes / secondes / microsecondes d'aujourd'hui.Donc à cause de cela, la quasi-totalité du code que vous voyez sont des calculs manuels pour aller au lendemain et calculer le jour de la semaine.
+5 octets en raison d'une partie que j'ai oubliée dans la formule de Zeller (année 1 pour les mois de janvier et février) ..
Essayez-le en ligne ou essayez-le en ligne avec une date émulée auto-spécifiée de «aujourd'hui» .
Explication:
Mur de texte entrant.
En général, le code suit le pseudo-code suivant:
1)
Date currentDate = today;
fait partie du programme 05AB1E:2)
Integer counter = 0;
et 3)Start an infinite loop:
sont simples dans le programme 05AB1E:4)
If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
est la première partie difficile avec des calculs manuels. Comme 05AB1E n'a pas de date intégrée, nous devrons calculer le jour de la semaine manuellement.La formule générale pour ce faire est:
Où pour les mois de mars à décembre:
[1, 31]
)[3, 12]
)Et pour les mois janvier et février:
[1, 31]
)[13, 14]
)Il en résulte le jour de la semaineh , où 0 = samedi, 1 = dimanche, ..., 6 = vendredi.
Source: congruence de Zeller
Nous pouvons le voir dans cette partie du programme 05AB1E:
5)
Counter += 1;
est à nouveau simple:6)
currentDate += 1; // Set currentDate to the next day in line
est encore plus complexe, car nous devons le faire manuellement. Donc, cela sera étendu au pseudo-code suivant:Sources:
algorithme pour déterminer si une année est une année bissextile.(EDIT: n'est plus pertinent, car j'utilise une méthode alternative pour vérifier les années bissextiles qui ont économisé 7 octets.)Algorithme pour déterminer le nombre de jours dans un mois.
6a)
Integer isLeapYear = ...;
se fait comme ceci dans le programme 05AB1E:Également utilisé dans ma réponse 05AB1E , il y a donc quelques années d'exemple qui sont ajoutées pour illustrer les étapes.
6b)
currentDate.month == 2 ?
et 6c)28 + isLeapYear
se font comme ceci:6d)
:
et 6e)31 - (currentDate.month - 1) % 7 % 2;
se font comme ceci:6f)
If(currentDate.day < daysInCurrentMonth):
se fait comme ceci:6g)
nextDate.day += 1;
se fait comme ceci:6h)
Else:
et 6i) senextDate.day = 1;
font alors comme ceci:6j)
If(currentDate.month < 12):
:6k)
nextDate.month += 1;
:6l)
Else:
, 6m)nextDate.month = 1;
et 6n) senextDate.year += 1;
font alors comme ceci:Et enfin à 8)
If(currentDate == parsed input-string):
et 9)Stop the infinite loop, and output the counter
:la source
Excel 24 octets
Suppose l'entrée dans la cellule A1
Utilise la fonction intégrée. Malheureusement, la fonction comprend à la fois aujourd'hui et la date de fin. Depuis, OP a précisé de ne pas compter aujourd'hui, donc j'en ajoute un à MAINTENANT pour ne pas compter aujourd'hui.
Pour répondre aux commentaires sur le format du nombre, encore une fois, c'est la norme Excel:
la source
10.12.2018
est une chaîne lorsqu'elle est conservée dans une cellule plutôt qu'une date. La solution évidente , mais longtemps pour corriger ce serait de changerA1
àDATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))
votre solutionHKCU\Control Panel\International\sDecimal
chaîne de registre. Sur une installation US Windows par défaut, c'est MM / jj / aaaa. Dans la plupart des pays de l'UE, ce serait la valeur par défaut.R , 76 octets
Veuillez également consulter cette réponse R de 72 octets qui est également indépendante des paramètres régionaux.
Essayez-le en ligne!
weekdays
donne le texte des jours de la semaine, nous comptons donc les jours dans la séquence entre aujourd'hui et l'entrée qui ne contiennent pasS
, et en ajoutons un au résultat.la source
Java 10,
233232226 octetsLa date me rappelle toujours à quel point Java est verbeux.
REMARQUE: il existe désormais deux réponses Java plus courtes (inférieures à 175 octets), l' une avec une utilisation intelligente des méthodes obsolètes des versions Java antérieures de @LukeStevens , et l' autre utilisant la
java.time.LocalDate
nouveauté depuis Java 8 de @ OlivierGrégoire .Essayez-le en ligne.
Explication:
la source
e=s.clone()
?Calendar s=Calendar.getInstance(),e=s.getInstance()
, ce qui finit malheureusement par être exactement de la même longueur.C
n'est en effet pas nécessaire. Il provenait d'une ancienne partie du code où je l'ai également utiliséC
ailleurs. J'ai pu jouer au golf 1 octet en utilisantvar s=Calendar.getInstance();var e=s.getInstance();
donc merci. :)java.time
.JavaScript (ES6),
116103 octetsEssayez-le en ligne!
Comment?
.toJSON()
YYYY-MM-DD
YYYY-MM-DD
DD.MM.YYYY
D.getDay()
la source
MATL , 24 octets
Essayez-le en ligne!
Vous avez à moitié réussi :-)
Explication
la source
16.10.2018
aujourd'hui (lundi01-10-2018
) se traduirait-il par11
, demain à10
, etc.Wolfram Language (Mathematica) ,
6456 octetsEssayez-le en ligne!
DayCount[x,y,"Weekday"]
compte le nombre de jours de semaine entrex
ety
.Les entrées
x
ety
peuvent être beaucoup de choses, y compris une fantaisieDateObject
comme celle retournée parToday
, ou une chaîne au format (malheureusement)mm.dd.yyyy
.Ma tentative précédente a essayé de transformer l'
dd.mm.yyyy
entrée en unDateObject
en disant à Mathematica comment l'analyser; la nouvelle solution réorganise simplement la chaîne pour mettre le jour et le mois dans l'ordre que Mathematica attend.Il convient de noter que la solution de 28 octets fonctionne
DayCount[Today,#,"Weekday"]&
non seulement parfaitement pour un format d'entrée mois-jour-année, mais gère également correctement les entrées jour-mois-année sans ambiguïté telles que31.12.2018
, ce qui ne pourrait pas signifier "le 12e jour du 31" mois". C'est donc correct plus de 60% du temps :)la source
Perl 6 , 61 octets
Essayez-le en ligne!
la source
R, 72 caractères
Une variation de la réponse fournie par @ngm qui évite au grepl de sauvegarder quelques caractères et fonctionne dans des environnements locaux non anglais.
sum(strftime(seq(Sys.Date(),as.Date(scan(,""),"%d.%m.%Y"),1),'%u')<6)+1
la source
Java (OpenJDK 8) ,
174166165 octetsAvec un peu d'inspiration dans la réponse de Kevin et un bon vieux chalut à travers l'API Date obsolète, j'ai réussi à obtenir une solution Java plus succincte.
-8 octets grâce à l'analyse inventive des dates d'expressions regex de Kevin
-1 octets grâce au fonctionnement intelligent au niveau du bit de Nevay
Essayez-le en ligne!
Explication
la source
d=d[0].split
et obsolètes.parse
avec le format par défautMM/dd/yyyy
. Une petite erreur dans votre message, vous en avezimport java.text.*;
au lieu deimport java.util.*;
dans votre code, et// Required import for both Calendar and Date
dans votre explication (même si vous ne l'utilisez pasCalendar
).java.text
mais réparé maintenant! Merci!d=d[0].split
avec les varargs, changer l'entrée en une chaîne régulière, la supprimerd=d[0].split("\\.");
et la changerd[1]+"/"+d[0]+"/"+d[2]
pourd.replaceAll("(..).(..).","$2/$1/")
économiser 7 octets .r+=new Date(s).getDay()%6<1?0:1,s+=864e5);
pours+=864e5)r+=new Date(s).getDay()%6<1?0:1;
. :)r-=-new Date(s).getDay()%6>>-1;
Rouge , 72 octets
Essayez-le en ligne!
Prend la date au format jj-mm-aaaa, par exemple 31-10-2018 (fonctionne également avec 10-oct-2018)
Entrée stricte:
Rouge , 97 octets
Essayez-le en ligne!
Prime:
Renvoie une liste des dates / jours ouvrables des jours ouvrables jusqu'à la date donnée:
Rouge , 235 octets
Essayez-le en ligne!
la source
JavaScript,
8785 octetsRetours
false
pour0
.Essayez-le en ligne ou consultez les 31 prochains jours
la source
Python 2 ,
163156149 149147 octetsEssayez-le en ligne!
-7 avec merci à @mypetlion
-7 de plus grâce à @ovs
+30 en raison du format d'entrée très restrictif que je n'ai remarqué que juste avant de poster mon code précédent qui prenait par exemple
(2018,11,1)
:-(la source
(0,1)[t.weekday()<5]
. Les booléens Python sont une sous-classe deint
etTrue, False
peuvent être utilisés dans des opérations arithmétiques comme1,0
. Remplacez-le parc+=t.weekday()<5
pour économiser 7 octets.Java (JDK 10) , 171 octets
Essayez-le en ligne!
Crédits
la source
(.*)\\.(.*)\\.(.*)
en(..).(..).(.*)
.replaceAll
technique, sa réponse peut également être jouée de 7 octets, donc la vôtre est encore légèrement plus longue. ;)JavaScript (Node.js) ,
168160139 139133 octets35 octets de moins grâce à Quintec et Kevin Cruijssen
Essayez-le en ligne!
la source
f=
to the byte-count (and on TIO you can put it in the header), which is why @Quintec stated it's 139 bytes instead of 141 bytes. In addition, you can changeif((d.getDay()+1)%7>1)n++;
ton+=-~d.getDay()%7>1;
to golf it to 133 bytes.-~i
is the same as(i+1)
Also, if you haven't seen it yet, Tips for golfing in JavaScript and Tips for golfing in <all languages> might be interesting to read through. :)Python3 & Numpy, 96 bytes
I couldn't get smaller than the boring pre-made solution...
Try it online!
la source
PowerShell,
10799 bytes-8 bytes thanks to mazzy
Try it online!
Performs a regex
-split
on the input$args
, stores the values into$d
ays,$m
onths, and$y
ears, respectively. Then, enters afor
loop, initializing$a
to today's date. The loop continues while$a
is-l
esst
han our input target date. Each iteration we're adding1
days
to$a
, and checking whether the currentD*k
(short forDayOfWeek
) is in the range1..5
(i.e., Monday to Friday). That Boolean result is accumulated into$o
and once we're out of the loop that value is left on the pipeline and output is implicit.la source
$d,$m,$y=$args-split'\.';for($a=date;$a-lt(date "$y-$m-$d");$a=$a|% *ys 1){$o+=($a|% D*k)-in1..5};$o
for(...){...}
and$o
can be removed, so we're now below 100!Python 2,
147143141140 bytesTry it online!
Takes a string, e, which represents the end date in the format "dd.MM.YYYY". Optionally also takes the start date, but this is expected to be a datetime.date.
The start date, s, is defaulted to today's date as a datetime.date object in order to disregard time. The end time is parsed into a datetime.datetime object then converted to a date, since datetime.date objects do not have a parse method and datetimes cannot be added to/subtracted from dates. Iterates through every day in (start, end] and adds 1 to the total if its weekday number is < 5. ([0-4] are [Mon-Fri], [5-6] are [Sat-Sun]).
Datetime parsing is the worst, you guys.
EDIT: Stole ElPedro's map(int,thing) trick to save 4 bytes.
EDIT 2: ELECTRIC BOOGALOO: Saved 2 bytes by making it an anonymous function. (Thanks Aaron!)
EDIT 3: xrange -> range. (Thanks again Aaron!)
la source
f=
from lambda expressions hererange
rather thanxrange
it should still work just fine.PHP, 66 bytes
empty output for
0
; insert+
betweenecho
and$r
to fix.Run as pipe with
-nr
or try it online.60 bytes with unary output:
la source
PHP (with Carbon), 107 bytes
la source
IBM/Lotus Notes Formula - 99 bytes
Takes input from a date/time field
i
. The input format ofi
is set to.
separated so there is no need to convert the input. Notes can take a date input with any separator as long as you tell it before what it is going to be (hope that's not cheating!). Formula is in computed numeric fieldo
on the same form.Interesting aside: Ever since
@For
and@While
were introduced into the Formula language in (I think) R6 by the great Damien Katz the only use I have found for them is code golfing. I have never used them in a production app.There is no TIO available for formula so here is a screenshot taken on 02.10.2018:
la source
Ruby, 81 bytes
Try it online!
la source
K4, 40 bytes
Solution:
Explanation:
Calculate the difference between the dates, use modulo 7 to ignore weekends, sum up.
Notes:
"D"$,/|"."\:x
la source
C (clang),
209208205 bytesCompiler flags
-DU=u=localtime(&b)
-DW=tm_wday
-DY=tm_year
-DT=tm_yday
(52 bytes).Try it online!
-1 byte thanks to @JonathanFrech
la source
?i++:0
->&&++i
.q,
5279 bytesin q, each date has an underlying integer value, based on how many days have passed since the start of the millenium. Applying 'mod 7' to this, you get unique values for each day of the week (0 for Saturday, 6 for Friday). So when 2 > x mod 7, don't increment the counter, to avoid counting weekends.
EDIT: Missed strict date format, editing
EDIT2: Included
la source
{sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}
for 48 bytes without resorting to K verbs.