オフィス(「オフィス」と呼ぶことにします)は、オフィスの誕生日パーティーを統合することで、2019年の無駄な時間を削減します。同じ週の月曜日から金曜日(含む)の間に誕生日がある2人は、その週のいつかで共有誕生日パーティーで祝われます。誕生日が土曜日または日曜日に当たる人々はパーティーをまったく開催しません。
実際の誕生日を共有しない人と誕生日パーティーを共有したくない人もいます。彼らは共有の誕生日パーティーを持つことは非常に怒っています。
オフィスをシミュレートして、共有の誕生日パーティーについて誰かが非常に怒る最初の週を見つけます。
チャレンジ
次の基本ルールに従って、シミュレートされたオフィスの誰かが共有誕生日パーティーに非常に怒る 2019年の最初のISO週番号を出力するプログラムまたは関数を記述します。
- N > 1の整数を入力します。これは、オフィスの労働者の数です。
- Nの誕生日自体は(2月29無視する)1月1日から12月31日にランダムに一様に分布しています。
- ただし、共有誕生日パーティーを決定するための稼働週は、2019-W01-1(2018-12-31)と2019-W52-7(2019-12-29)の間の2019 ISO週日です。新しいISO週が毎週月曜日に始まります。(これが、この課題のISO週間について本当に知っておく必要があるすべてだと思います)。
- 以下のためのNのオフィスの人々 、それぞれが持つ1/3の確率がある非常に怒っている 共有の誕生日パーティーのあなたもそれをシミュレートする必要がありますので、性格のタイプを。
- しかし、パーティーが同じ誕生日を持っている人々と共有されれば、彼らは怒ることはありません。
- 非常に怒っている人の最初の発生に対して、ISO週番号(週番号が明確である限り、これの正確な形式は柔軟です)を出力します。怒っている人がいない場合は、ISOウィークと混同しないものを出力したり、プログラムでエラーが発生する可能性があります。
いくつかの単純化する仮定:
- 私が述べたように、2月29日問題を完全に無視してください(不要な複雑化)
- 祝日(これは国際社会なので祝日は異なります)を無視し、平日にオフィスが開いていると想定します。
ルール
これはコードゴルフです。各言語のバイトでの最短の回答が勝ちます。デフォルトの抜け穴は禁止されています。
コードの説明を歓迎します。
実施例
入力N = 7の考案された例1。最初の列と2番目の列は規則で説明されているようにランダムです(もちろん、実際にはランダムではありません)。
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
したがって、怒りは起こりません。プログラムまたは関数がエラーになるか、ISO週番号と混同されないものを出力する可能性があります。
Nが指定されていない例2 。
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
... ... ... ...
出力は、W11または同等のものになります。