Tuve una idea genial para facilitar la vida laboral: una cuenta regresiva para una fecha específica que solo cuenta los días laborables.
La tarea básica es crear una cuenta regresiva para una fecha específica que solo incluye los días laborables en la cuenta regresiva.
Como la jornada laboral cuenta lunes , martes , miércoles , jueves y viernes .
La entrada debe ser una fecha específica en el formato estándar europeo "no oficial" dd.MM.yyyy
y debe ser hoy o un día en el futuro.
La salida solo debe ser el número de días restantes.
Como es código golf, el código más corto gana.
Caso de prueba:
Today | Input | Output
10.12.2018 | 17.12.2018 | 5
02.10.2018 | 16.10.2018 | 10
Si me perdí algunas cosas en la pregunta, perdóname, es mi primera pregunta :)
EDITAR:
- Puedes usar
false
como salida en lugar de0
<, pero no es hermoso - No es necesario respetar el horario de verano
Respuestas:
05AB1E ,
130128133131124123 bytesEstoy fuera de mí..
Para el lenguaje de golf 05AB1E no importa en absoluto si la entrada es con
.
o-
. Sin embargo, 05AB1E no tiene ninguna función integrada para los objetos o cálculos de fecha. Lo único que incluye las fechas que tiene es el año / mes / día / horas / minutos / segundos / microsegundos de hoy.Por eso, casi todo el código que ves son cálculos manuales para ir al día siguiente y calcular el día de la semana.
+5 bytes debido a una parte que olvidé en la fórmula de Zeller (año 1 para los meses de enero y febrero).
Pruébelo en línea o Pruébelo en línea con una fecha autoevaluada emulada de 'hoy' .
Explicación:
Muro de texto entrante.
En general, el código sigue el siguiente pseudocódigo:
1)
Date currentDate = today;
es esta parte del programa 05AB1E:2)
Integer counter = 0;
y 3)Start an infinite loop:
son sencillos en el programa 05AB1E:4)
If(currentDate is NOT a Saturday and currentDate is NOT a Sunday):
es la primera parte difícil con cálculos manuales. Dado que 05AB1E no tiene fechas incorporadas, tendremos que calcular el día de la semana manualmente.La fórmula general para hacer esto es:
Dónde para los meses de marzo a diciembre:
[1, 31]
)[3, 12]
)Y para los meses de enero y febrero:
[1, 31]
)[13, 14]
)Resultando en el día de la semanah , donde 0 = sábado, 1 = domingo, ..., 6 = viernes.
Fuente: congruencia de Zeller
Podemos ver esto en esta parte del programa 05AB1E:
5)
Counter += 1;
es sencillo de nuevo:6)
currentDate += 1; // Set currentDate to the next day in line
es nuevamente más complejo, porque tenemos que hacerlo manualmente. Entonces esto se expandirá al siguiente pseudocódigo:Fuentes:
Algoritmo para determinar si un año es bisiesto.(EDITAR: ya no es relevante, ya que utilizo un método alternativo para verificar los años bisiestos que ahorraron 7 bytes).Algoritmo para determinar la cantidad de días en un mes.
6a)
Integer isLeapYear = ...;
se hace así en el programa 05AB1E:También se utiliza en esta respuesta mía 05AB1E , por lo que se agregan algunos años de ejemplo para ilustrar los pasos.
6b)
currentDate.month == 2 ?
y 6c)28 + isLeapYear
se hacen así:6d)
:
y 6e)31 - (currentDate.month - 1) % 7 % 2;
se hacen así:6f)
If(currentDate.day < daysInCurrentMonth):
se hace así:6g)
nextDate.day += 1;
se hace así:6h)
Else:
y 6i)nextDate.day = 1;
se hacen así:6j)
If(currentDate.month < 12):
:6k)
nextDate.month += 1;
:6l)
Else:
, 6m)nextDate.month = 1;
y 6n)nextDate.year += 1;
se hacen así:Y finalmente a las 8)
If(currentDate == parsed input-string):
y 9)Stop the infinite loop, and output the counter
:fuente
Excel 24 Bytes
Asume la entrada en la celda A1
Utiliza la función incorporada. Lamentablemente, la función incluye hoy y la fecha de finalización. Desde entonces, OP ha aclarado no contar hoy, así que agrego uno a NOW para no contar hoy.
Para abordar los comentarios sobre el formato de número, nuevamente, este es el estándar de Excel:
fuente
10.12.2018
es una cadena cuando se mantiene en una celda en lugar de una fecha. La solución obvia, pero mucho tiempo para corregir esto sería cambiarA1
aDATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2))
en su soluciónHKCU\Control Panel\International\sDecimal
cadena de registro. En una instalación predeterminada de Windows de EE. UU. Que es MM / dd / aaaa. En la mayoría de los países de la UE, este sería el valor predeterminado.R , 76 bytes
También eche un vistazo a esta respuesta de 72 bytes R que también es independiente de la configuración regional.
Pruébalo en línea!
weekdays
da los días de texto de la semana, por lo que contamos los días en la secuencia entre hoy y la entrada que no contieneS
, y agregamos uno al resultado.fuente
Java 10,
233232226 bytesLa fecha siempre me recuerda cuán detallado es realmente Java ...
NOTA: Ahora hay dos respuestas Java más cortas (por debajo de 175 bytes), una con uso inteligente de métodos obsoletos de versiones anteriores de Java por @LukeStevens , y otra que usa la
java.time.LocalDate
novedad desde Java 8 por @ OlivierGrégoire .Pruébalo en línea.
Explicación:
fuente
e=s.clone()
?Calendar s=Calendar.getInstance(),e=s.getInstance()
, que desafortunadamente termina siendo exactamente de la misma longitud.C
hecho no es necesaria. Era de una parte antigua del código donde también utilicéC
en otro lugar. Pude jugar al golf 1 byte usandovar s=Calendar.getInstance();var e=s.getInstance();
así que gracias. :)java.time
.JavaScript (ES6),
116103 bytesPruébalo en línea!
¿Cómo?
.toJSON()
método:YYYY-MM-DD
YYYY-MM-DD
DD.MM.YYYY
D.getDay()
fuente
MATL , 24 bytes
Pruébalo en línea!
Tuviste éxito a medias :-)
Explicación
fuente
16.10.2018
hoy (lunes01-10-2018
) resultaría en11
, mañana en10
, etc.Wolfram Language (Mathematica) ,
6456 bytesPruébalo en línea!
DayCount[x,y,"Weekday"]
cuenta el número de días laborables entrex
yy
.Las entradas
x
yy
pueden ser muchas cosas, incluida una fantasíaDateObject
como la que devuelveToday
o una cadena en el formato (desafortunadamente)mm.dd.yyyy
.Mi intento anterior trató de convertir la
dd.mm.yyyy
entrada en unDateObject
diciéndole a Mathematica cómo analizarla; la nueva solución simplemente reorganiza la cadena para poner el día y el mes en el orden que Mathematica espera.Vale la pena señalar que la solución de 28 bytes
DayCount[Today,#,"Weekday"]&
no solo funciona perfectamente para un formato de entrada mes-día-año, sino que también maneja correctamente entradas no ambiguas de día-mes-año como31.12.2018
, que no podría significar "el día 12 del día 31 mes". Entonces es correcto más del 60% del tiempo :)fuente
Perl 6 , 61 bytes
Pruébalo en línea!
fuente
R, 72 caracteres
Una variación en la respuesta proporcionada por @ngm que evita que el grepl guarde algunos caracteres y funciona en idiomas que no están en inglés.
sum(strftime(seq(Sys.Date(),as.Date(scan(,""),"%d.%m.%Y"),1),'%u')<6)+1
fuente
Java (OpenJDK 8) ,
174166165 bytesCon un poco de inspiración de la respuesta de Kevin y un buen rastreo a través de la obsoleta API de fecha, he logrado obtener una solución Java más sucinta.
-8 bytes gracias al análisis de fechas inventivo de expresiones regulares de Kevin
-1 bytes gracias a la inteligente operación bit a bit de Nevay
Pruébalo en línea!
Explicación
fuente
d=d[0].split
y el.parse
formato obsoleto con formato predeterminadoMM/dd/yyyy
. Un pequeño error en tu publicación, lo tienes enimport java.text.*;
lugar deimport java.util.*;
en tu código y// Required import for both Calendar and Date
en tu explicación (aunque no lo usesCalendar
).java.text
pero lo arreglé ahora! ¡Gracias!d=d[0].split
con los varargs, cambiar la entrada a una cadena normal, eliminard=d[0].split("\\.");
y cambiard[1]+"/"+d[0]+"/"+d[2]
parad.replaceAll("(..).(..).","$2/$1/")
guardar 7 bytes .r+=new Date(s).getDay()%6<1?0:1,s+=864e5);
as+=864e5)r+=new Date(s).getDay()%6<1?0:1;
. :)r-=-new Date(s).getDay()%6>>-1;
Rojo , 72 bytes
Pruébalo en línea!
Toma la fecha en formato dd-mm-aaaa, por ejemplo 31-10-2018 (también funciona con 10-oct-2018)
Entrada estricta:
Rojo , 97 bytes
Pruébalo en línea!
Prima:
Devuelve una lista de las fechas / días laborables de los días hábiles hasta la fecha indicada:
Rojo , 235 bytes
Pruébalo en línea!
fuente
JavaScript,
8785 bytesDevoluciones
false
para0
.Pruébelo en línea o verifique los próximos 31 días
fuente
Python 2 ,
163156149147 bytesPruébalo en línea!
-7 con gracias a @mypetlion
-7 más gracias a @ovs
+30 debido al formato de entrada muy restrictivo que solo noté justo antes de publicar mi código anterior que tomó la entrada como, por ejemplo
(2018,11,1)
:-(fuente
(0,1)[t.weekday()<5]
. Los booleanos de Python son una subclase deint
yTrue, False
se pueden usar en operaciones aritméticas como1,0
. Reemplácelo conc+=t.weekday()<5
para guardar 7 bytes.Java (JDK 10) , 171 bytes
Pruébalo en línea!
Créditos
fuente
(.*)\\.(.*)\\.(.*)
a(..).(..).(.*)
.replaceAll
embargo, con su técnica, su respuesta también puede jugarse en 7 bytes, por lo que la suya es aún un poco más larga. ;)JavaScript (Node.js) ,
168160139133 bytes35 bytes menos gracias a Quintec y Kevin Cruijssen
Pruébalo en línea!
fuente
f=
al conteo de bytes (y en TIO puede ponerlo en el encabezado), por lo que @Quintec declaró que es 139 bytes en lugar de 141 bytes. Además, puede cambiarif((d.getDay()+1)%7>1)n++;
an+=-~d.getDay()%7>1;
al golf a 133 bytes .-~i
es el mismo que(i+1)
Además, si aún no lo ha visto, puede ser interesante leer los Consejos para jugar golf en JavaScript y los Consejos para jugar golf en <todos los idiomas> . :)Python3 y Numpy , 96 bytes
No podría ser más pequeño que la aburrida solución prefabricada ...
Pruébalo en línea!
fuente
PowerShell ,
10799 bytes-8 bytes gracias a mazzy
Pruébalo en línea!
Realiza una expresión regular
-split
en la entrada$args
, almacena los valores en$d
ays,$m
onths y$y
orejas, respectivamente. Luego, ingresa unfor
ciclo, inicializando$a
a la fecha de hoy. El bucle continúa mientras$a
es-l
esst
han de nuestra fecha límite de entrada. Cada iteración estamos añadiendo1
days
a$a
, y comprobar si la corrienteD*k
(corto paraDayOfWeek
) está en el rango1..5
(es decir, de lunes a viernes). Ese resultado booleano se acumula$o
y, una vez que estamos fuera del ciclo, ese valor se deja en la tubería y la salida es implícita.fuente
$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(...){...}
y coma entre y$o
se puede eliminar, ¡así que ahora estamos por debajo de 100!Python 2 ,
147143141140 bytesPruébalo en línea!
Toma una cadena, e, que representa la fecha de finalización en el formato "dd.MM.YYYY". Opcionalmente, también toma la fecha de inicio, pero se espera que sea datetime.date.
La fecha de inicio, s, está predeterminada a la fecha de hoy como un objeto datetime.date para ignorar la hora. La hora de finalización se analiza en un objeto datetime.datetime y luego se convierte en una fecha, ya que los objetos datetime.date no tienen un método de análisis y datetime no se puede agregar / restar de fechas. Se repite todos los días en (inicio, finalización) y agrega 1 al total si su número de día de la semana es <5. ([0-4] son [Lun-Vie], [5-6] son [Sáb-Dom]).
El análisis de fecha y hora es lo peor, chicos.
EDITAR: Robó el truco del mapa de ElPedro (int, thing) para guardar 4 bytes.
EDIT 2: BOOGALOO ELÉCTRICO: guardado 2 bytes al convertirlo en una función anónima. (¡Gracias Aaron!)
EDITAR 3: xrange -> rango. (¡Gracias de nuevo Aaron!)
fuente
f=
omitir las expresiones lambda aquírange
lugar dexrange
lo que debería funcionar bien.PHP, 66 bytes
salida vacía para
0
; insertar+
entreecho
y$r
para arreglar.Ejecutar como tubería con
-nr
o probarlo en línea .60 bytes con salida unaria:
fuente
PHP (con carbono ), 107 bytes
fuente
Fórmula IBM / Lotus Notes - 99 bytes
Toma información de un campo de fecha / hora
i
. El formato de entrada dei
se establece en.
separado, por lo que no es necesario convertir la entrada. Las notas pueden tomar una entrada de fecha con cualquier separador siempre que lo diga antes de lo que va a ser (¡espero que no sea trampa!). La fórmula está en el campo numérico calculadoo
en el mismo formulario.Interesante aparte: desde entonces
@For
y@While
fueron introducidos en el lenguaje Formula en (creo) R6 por el gran Damien Katz los el único uso que he encontrado para ellos es el golf de código. Nunca los he usado en una aplicación de producción.No hay TIO disponible para la fórmula, así que aquí hay una captura de pantalla tomada el 10/02/2018:
fuente
Ruby , 81 bytes
Pruébalo en línea!
fuente
K4 , 40 bytes
Solución:
Explicación:
Calcule la diferencia entre las fechas, use el módulo 7 para ignorar los fines de semana, resuma.
Notas:
"D"$,/|"."\:x
fuente
C (sonido metálico) ,
209208205 bytesBanderas del compilador
-DU=u=localtime(&b)
-DW=tm_wday
-DY=tm_year
-DT=tm_yday
(52 bytes).Pruébalo en línea!
-1 byte gracias a @JonathanFrech
fuente
?i++:0
->&&++i
.q,
5279 bytesen q, cada fecha tiene un valor entero subyacente, basado en cuántos días han pasado desde el comienzo del milenio. Aplicando 'mod 7' a esto, obtienes valores únicos para cada día de la semana (0 para el sábado, 6 para el viernes). Entonces, cuando 2> x mod 7, no incremente el contador, para evitar contar los fines de semana.
EDITAR: formato de fecha estricto perdido, edición
EDIT2: Incluido
fuente
{sum 1<mod[d+til("D"$x 10 vs 67893401)-d:.z.d]7}
para 48 bytes sin recurrir a los verbos K.