Un bureau (appelons-le "The Office") va réduire le temps perdu en 2019 en regroupant les fêtes d'anniversaire de bureau. Deux personnes avec un anniversaire entre le lundi et le vendredi (inclus) de la même semaine seront célébrées avec une fête d'anniversaire partagée au cours de la semaine. Les personnes dont l'anniversaire tombe un samedi ou un dimanche n'obtiennent aucune fête.
Certaines personnes n'aiment pas partager une fête d'anniversaire avec des personnes qui ne partagent pas leur anniversaire réel. Ils seront très en colère d'avoir une fête d'anniversaire partagée .
Nous allons simuler un bureau et trouver la première semaine où quelqu'un se met très en colère au sujet de sa fête d'anniversaire partagée .
Le défi
Écrivez un programme ou une fonction qui génère le premier numéro de semaine ISO pour 2019 dans lequel une personne dans un bureau simulé se met très en colère contre sa fête d'anniversaire partagée , sous réserve des règles de base suivantes:
- entrez un entier N > 1, qui est le nombre de travailleurs dans le bureau.
- les N anniversaires eux-mêmes sont distribués uniformément au hasard du 1er janvier au 31 décembre (ignorez le 29 février).
- mais les semaines de travail pour déterminer les fêtes d'anniversaire partagées sont les dates de la semaine ISO 2019, qui sont comprises entre 2019-W01-1 (2018-12-31) et 2019-W52-7 (2019-12-29). Une nouvelle semaine ISO commence chaque lundi. (Je pense que c'est tout ce que vous devez vraiment savoir sur les semaines ISO pour ce défi).
- pour les N personnes au bureau, chacune a 1/3 de chance d'avoir un type de personnalité Fête d'anniversaire partagée très en colère , vous devrez donc simuler cela aussi.
- mais ils ne seront pas en colère si la fête est partagée avec des gens qui ont le même anniversaire.
- sortir le numéro de semaine ISO (le format exact est flexible tant que le numéro de semaine est clair) pour la première occurrence d'une personne très en colère . S'il n'y a pas de gens en colère, vous pouvez générer tout ce qui n'est pas confondu avec une semaine ISO ou le programme peut générer des erreurs, etc.
Quelques hypothèses simplificatrices:
- comme je l'ai mentionné, ignorer complètement le problème du 29 février (une complication inutile)
- ignorez les jours fériés (il s'agit d'une communauté internationale, donc nos jours fériés seront différents) et supposez simplement que le bureau est ouvert chaque jour de semaine.
Règles
C'est du code-golf. La réponse la plus courte en octets pour chaque langue gagne. Les failles par défaut sont interdites.
Les explications du code sont les bienvenues.
Exemples travaillés
Exemple 1 avec entrée N = 7. Les première et deuxième colonnes sont aléatoires comme décrit dans les règles (mais pas réellement aléatoires ici bien sûr).
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
Donc, aucune colère ne se produit. Le programme ou la fonction peut générer des erreurs ou produire quelque chose qui ne soit pas confondu avec un numéro de semaine ISO.
Exemple 2 avec N non spécifié.
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 sortie serait W11
ou quelque chose d'équivalent.