Una oficina (llamémosla "The Office") reducirá el tiempo perdido en 2019 al consolidar las fiestas de cumpleaños de la oficina. Cualquier dos personas con un cumpleaños entre el lunes y el viernes (inclusive) de la misma semana se celebrarán con una fiesta de cumpleaños compartida en algún momento de esa semana. Las personas cuyos cumpleaños son sábados o domingos no tienen fiesta.
A algunas personas no les gusta compartir una fiesta de cumpleaños con personas que no comparten su cumpleaños real. Estarán muy enojados por tener una fiesta de cumpleaños compartida .
Vamos a simular una oficina y encontrar la primera semana en la que alguien se pone muy enojado acerca de su fiesta de cumpleaños compartido .
El reto
Escriba un programa o función que genere el primer número de semana ISO para 2019 en el que alguien en una oficina simulada se enoje mucho por su fiesta de cumpleaños compartida , sujeto a las siguientes reglas básicas:
- ingrese un número entero N > 1, que es el número de trabajadores en la oficina.
- los N cumpleaños se distribuyen uniformemente al azar del 1 de enero al 31 de diciembre (ignore el 29 de febrero).
- pero las semanas laborales para determinar las fiestas de cumpleaños compartidas son las fechas de la semana ISO 2019, que se encuentran entre 2019-W01-1 (2018-12-31) y 2019-W52-7 (2019-12-29). Una nueva semana ISO comienza todos los lunes. (Creo que esto es todo lo que realmente necesita saber sobre las semanas ISO para este desafío).
- para las N personas en la oficina, cada uno tiene una probabilidad de 1/3 de tener un tipo de personalidad de fiesta de cumpleaños compartida muy enojada , por lo que también tendrá que simular eso.
- pero no se enojarán si la fiesta se comparte con personas que tienen el mismo cumpleaños.
- muestra el número de semana ISO (el formato exacto para esto es flexible siempre que el número de semana sea claro) para la primera aparición de una persona muy enojada . Si no hay personas enojadas, puede generar cualquier cosa que no se confunda con una semana ISO o el programa puede generar errores, etc.
Algunos supuestos simplificadores:
- como mencioné, ignore por completo el problema del 29 de febrero (una complicación innecesaria)
- ignore los días festivos (esta es una comunidad internacional por lo que nuestros días festivos serán diferentes) y asuma que la oficina está abierta cada día laborable.
Reglas
Este es el código de golf. La respuesta más corta en bytes para cada idioma gana. Lagunas predeterminadas prohibidas.
Código de explicaciones de bienvenida.
Ejemplos trabajados
Ejemplo 1 contribuido con entrada N = 7. La primera y segunda columnas son aleatorias como se describe en las reglas (pero en realidad no son aleatorias aquí, por supuesto).
Angry Type
Person? Birthday ISO Week Comment
================================================================================
N 2018-12-31 W01 In the 2019 ISO week date year
Y 2018-12-31 W01 Same birthday, so no anger happens
N 2019-02-05 W06
Y 2019-03-15 W11 No anger happens because other W11 b-day is a Saturday
N 2019-03-16 W11
N 2019-09-08 W36 My birthday!
Y 2019-12-30 - Not in the 2019 ISO week date year
Entonces no ocurre enojo. El programa o la función pueden generar errores o generar algo que no se confunda con un número de semana ISO.
Ejemplo 2 con N no especificado.
Angry Type
Person? Birthday ISO Week Comment
================================================================================
N 2019-01-19 W03
Y 2019-02-04 W06
N 2019-02-05 W06 No anger because not an angry person
... ... ... (No angry people until...)
Y 2019-03-12 W11 Very Angry Person!
N 2019-03-14 W11
... ... ... ...
La salida sería W11
o algo equivalente.