Gemeinsame Geburtstagsfeier

9

Ein Büro (nennen wir es "The Office") wird 2019 durch die Konsolidierung von Bürogeburtstagsfeiern weniger Zeit verschwenden. Zwei Personen mit einem Geburtstag zwischen Montag und Freitag (einschließlich) derselben Woche werden irgendwann in dieser Woche mit einer gemeinsamen Geburtstagsfeier gefeiert . Menschen, deren Geburtstage auf einen Samstag oder Sonntag fallen, bekommen überhaupt keine Party.

Einige Leute mögen es nicht, eine Geburtstagsfeier mit Leuten zu teilen, die ihren tatsächlichen Geburtstag nicht teilen. Sie werden sehr wütend sein, eine gemeinsame Geburtstagsfeier zu haben .

Wir werden ein Büro simulieren und die erste Woche finden, in der jemand sehr wütend auf seine gemeinsame Geburtstagsfeier wird .

Die Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die die erste ISO-Wochennummer für 2019 ausgibt, in der jemand in einem simulierten Büro über die gemeinsame Geburtstagsfeier sehr wütend wird , wobei die folgenden Grundregeln gelten:

  • Geben Sie eine Ganzzahl N > 1 ein, die der Anzahl der Mitarbeiter im Büro entspricht.
  • Die N Geburtstage selbst werden vom 1. Januar bis 31. Dezember gleichmäßig zufällig verteilt (ignorieren Sie den 29. Februar).
  • Die Arbeitswochen für die Bestimmung der gemeinsamen Geburtstagsfeiern sind jedoch die ISO-Wochentermine 2019, die zwischen 2019-W01-1 (2018-12-31) und 2019-W52-7 (2019-12-29) liegen. Jeden Montag beginnt eine neue ISO-Woche. (Ich denke, das ist alles, was Sie wirklich über ISO-Wochen für diese Herausforderung wissen müssen).
  • Für die N Personen im Büro hat jeder eine Chance von 1/3, einen Persönlichkeitstyp für eine sehr verärgerte gemeinsame Geburtstagsfeier zu haben. Sie müssen dies also auch simulieren.
  • Aber sie werden nicht böse sein, wenn die Party mit Leuten geteilt wird, die denselben Geburtstag haben.
  • Geben Sie die ISO-Wochennummer (das genaue Format hierfür ist flexibel, solange die Wochennummer klar ist) für das erste Auftreten einer sehr verärgerten Person aus. Wenn es keine wütenden Leute gibt, können Sie alles ausgeben, was nicht mit einer ISO-Woche verwechselt wird, oder das Programm kann Fehler usw. verursachen.

Einige vereinfachende Annahmen:

  • Ignorieren Sie, wie bereits erwähnt, die Ausgabe vom 29. Februar vollständig (eine unnötige Komplikation).
  • Ignorieren Sie Feiertage (dies ist eine internationale Gemeinschaft, daher unterscheiden sich unsere Feiertage) und gehen Sie einfach davon aus, dass das Büro an jedem Wochentag geöffnet ist.

Regeln

Das ist Code-Golf. Die kürzeste Antwort in Bytes für jede Sprache gewinnt. Standardschlupflöcher verboten.

Code-Erklärungen sind willkommen.

Arbeitsbeispiele

Erfundenes Beispiel 1 mit Eingabe N = 7. Erste und zweite Spalte sind zufällig, wie in den Regeln beschrieben (aber hier natürlich nicht zufällig).

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

Es passiert also keine Wut. Das Programm oder die Funktion kann Fehler verursachen oder etwas ausgeben, das nicht mit einer ISO-Wochennummer verwechselt wird.

Beispiel 2 mit N nicht spezifiziert.

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   
  ...             ...      ...   ... 

Die Ausgabe wäre W11oder etwas Äquivalentes.

ngm
quelle
3
... Es gibt keinen 29. Februar 2019! Können Sie bitte ein Beispiel hinzufügen?
Shaggy
N.
4
@Shaggy es könnte Leute geben, die dort arbeiten, deren Geburtstag der 29. Februar ist. Ich sage, diese Möglichkeit einfach zu ignorieren, da es nur einen sinnlosen egde-Fall IMO hinzufügt.
ngm
1
Wenn es keine verärgerten Personen gibt, ist jede geeignete Ausgabe, die nicht W01 bis W52 oder gleichwertig ist, oder eine Fehlermeldung in Ordnung. Ich werde die Frage bearbeiten, um dies widerzuspiegeln, wenn ich nicht mobil bin.
ngm
1
Vielleicht bin ich es, aber ich habe lieber eine gemeinsame Geburtstagsfeier als gar keine. Zerreiße alle, die am Wochenende Geburtstag haben.
Kevin Cruijssen

Antworten:

5

Python 2 , 172 202 Bytes

def f(n):
 D=set();A=[];R=randint
 while n:
	n-=1;w,d=R(1,52),R(1,5)
	if R(0,364)>104:D|={(w,d)};A+=[w]*(R(0,2)>1)
 return next((a for a in sorted(A)if[w for w,d in D].count(a)>1),0)
from random import*

Probieren Sie es online aus!

Hoppla! Verpasste eine Anforderung; kosten 30 Bytes.

Das OP gibt an, dass Sie nicht am 29. Februar Geburtstag haben.

Wenn Sie am 30. Dezember Geburtstag haben, fällt er nicht in eine ISO-Woche von 2019, sodass Sie auf keinen Fall eine sehr verärgerte ISO-Woche von 2019 sein können.

Das lässt 364 andere Geburtstage übrig, um Sie als sehr wütend zu betrachten. 104 davon fallen an Wochenenden, wenn wir festgelegt haben, dass Sie darüber nicht sehr wütend werden. Wir kümmern uns also nur 260/365 um Sie. dh wenn R(0,364)>104( randintder Bereich ist inklusive). Angesichts dieser Einschränkung ist es wahrscheinlich, dass Ihr Geburtstag an Wochentagen in eine der 52 ISO-Wochen von 2019 und an einen beliebigen Wochentag dieser Woche fällt. und unabhängig davon, dass Sie 1 von 3 sind, wahrscheinlich eine sehr verärgerte Person.

D ist dann ein Satz von, (weeknum,weekday)so dass, wenn eine potenziell verärgerte Person einen tatsächlichen Geburtstag teilt, es nicht notwendig ist, Amgry zu sein, es sei denn, es gibt noch eine andere Person, die in dieser Woche Geburtstag hat.

0 wird zurückgegeben, wenn sich während einer ISO 2019-Woche keine sehr verärgerten Personen manifestieren. Andernfalls wird die ISO-Wochennummer der frühesten Kernschmelze zurückgegeben.

Chas Brown
quelle
Sollten Sie nicht auch den Randfall vom 31. Dezember 2019 berücksichtigen?
Charlie
1
@ Charlie: Sicher! Der 31. Dezember 2018 befindet sich jedoch in derselben ISO-Woche 2019 wie der 1. Januar 2019 und wäre daher Teil dieser "Woche der eifersüchtigen Party", also funktioniert es.
Chas Brown
Ich bin kein Python-Experte, aber ich glaube, Ihre Antwort erklärt dies nicht: "Aber sie werden nicht böse sein, wenn die Party mit Leuten geteilt wird, die denselben Geburtstag haben." Du hast trotzdem meine Gegenstimme.
OOBalance
@OOBalance: Ups! Habe das verpasst; geändert!
Chas Brown
2

Gelee ,  36 32  33 Bytes

+1 Byte, um den 30-Dez-Randfall zu beheben, den ich nicht bemerkt hatte (wie von Chas Brown in den Kommentaren unter dem OP hervorgehoben)

-4 danke an Erik den Outgolfer (Inline-Helfer und Verwendung des Außenprodukts)

7R2<52×þFX)Ġị$,3XỊ¤€ṁ@\PṢ€Ḋ€Fḟ0Ḣ

Eine monadische Verbindung, die eine ganze Zahl in ergibt [0,52]] wo 0 bedeutet, dass während des Jahres überhaupt keine sehr verärgerten Menschen anwesend sind und andere Ausgaben ISO-Wochenzahlen sind.

Probieren Sie es online aus!

Oder sehen Sie sich diese Version an, in der die Wochen, in denen der Geburtstag jeder Person liegt (0 für Wochenenden), gruppiert gedruckt werden. Anschließend wird eine Liste mit Listen in derselben Reihenfolge gedruckt, in der angegeben wird, ob diese Personen vom Typ "Sehr wütend" sind, und schließlich das Ergebnis gedruckt.

Jonathan Allan
quelle
1

Java 8, 198 Bytes

double r(){return Math.random();}

n->{int r=52,a[]=new int[r];for(;n-->0;)if(r()*364>104)++a[(int)(r()*r)];for(;++n<52;)r=r>51&a[n]>1&r()<1-5/Math.pow(5,a[n])&r()<1-Math.pow(2./3,a[n])?n:r;return r;}

Die Ausgabe basiert auf Null (0-51). Ein Wert von 52 zeigt an, dass keine sehr wütenden Personen anwesend sind. Probieren Sie es hier online aus .

Ungolfed:

double r() { return Math.random(); } // shortcut for Math.random(), saves a few bytes

n -> { // lambda taking an intger argument and returning an integer
    int r = 52, // this will hold the result; set to the value for "no Very Angry people" for now
    a[] = new int[r]; // array counting the people whose birthday lies in each week
    for(; n-- > 0; ) // for each person:
        if(r() * 364 > 104) // determine whether their birthday is on a weekday that is not the 30th of December ...
            ++a[(int) (r() * r)]; // ... only if so, increment the counter for a random ISO week
    for(; ++n < 52; ) // loop through the weeks; n is -1 before the loop
        r = r > 51   // if r is still the default ...
          & a[n] > 1 // ... and there is more than one person with a birthday that week ...
          & r() < 1 - 5/Math.pow(5, a[n]) // ... and at least two people have a different birthday ...
          &r() < 1 - Math.pow(2./3, a[n]) // ... and at least one person has the Very Angry personality type ...
          ? n  // ... set the current week as the result ...
          : r; // ... otherwise leave it the same
    return r;  // return the result
}
OOBalance
quelle
Schlagen Sie 91>26statt364>104
Deckenkatze