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.
Respuestas:
Python 2 ,
172202bytesPruébalo en línea!
¡Uy! Perdí un requisito; Cuesta 30 bytes.
El OP indica que su cumpleaños no es el 29 de febrero.
Si su cumpleaños es el 30 de diciembre, no caerá en ninguna semana ISO de 2019, por lo que, en cualquier caso, no puede ser una semana ISO muy enojada de 2019.
Eso deja 364 otros cumpleaños para considerar que estás muy enojado. 104 de estos caen los fines de semana cuando hemos estipulado que no te enojarás mucho al respecto. Así que solo nos preocupamos 260/365 de las veces; es decir, cuándo
R(0,364)>104
(randint
el rango es inclusivo). Dada esa restricción, es equiprobable que el cumpleaños de su día de la semana caiga en cualquiera de las 52 semanas ISO de 2019, y cualquier día de la semana de esa semana; e, independientemente, que eres 1 de cada 3 es probable que seas una persona muy enojada.D es entonces un conjunto de
(weeknum,weekday)
modo que si una persona potencialmente enojada comparte un cumpleaños real, entonces no hay necesidad de ser Amgry a menos que haya otra persona que tenga un cumpleaños esa semana.0 se devuelve si no se manifiestan personas muy enojadas durante cualquier semana ISO 2019; de lo contrario, se devuelve el número de semana ISO de la primera fusión.
fuente
Gelatina ,
36 3233 bytes+1 byte para arreglar el caso límite de 30 dic que no había notado (como lo señaló Chas Brown en los comentarios debajo del OP)
-4 gracias a Erik the Outgolfer (ayuda en línea y uso de producto externo)
Pruébalo en línea!
O vea esta versión que imprime las semanas en las que se celebra el cumpleaños de cada persona (0 para los fines de semana) agrupadas, luego imprime una lista ordenada de listas de si esas personas son del tipo Muy enojado, y finalmente imprime el resultado.
fuente
Java 8, 198 bytes
La salida está basada en cero (0-51); un valor de 52 indica que no hay personas muy enojadas . Pruébelo en línea aquí .
Sin golf:
fuente
91>26
lugar de364>104