Wspólne przyjęcie urodzinowe

9

Biuro (nazwijmy to „The Office”) ograniczy zmarnowany czas w 2019 roku poprzez konsolidację biurowych przyjęć urodzinowych. Wszelkie dwie osoby z urodzinami od poniedziałku do piątku (włącznie) w tym samym tygodniu będą obchodzone ze wspólną imprezą urodzinową w tym tygodniu. Ludzie, których urodziny przypadają w sobotę lub niedzielę, w ogóle nie mają imprezy.

Niektóre osoby nie lubią dzielić przyjęcia urodzinowego z osobami, które nie dzielą swoich faktycznych urodzin. Będą bardzo źli na wspólne przyjęcie urodzinowe .

Zamierzamy symulować biuro i znaleźć pierwszy tydzień, w którym ktoś bardzo się rozgniewa na temat wspólnego przyjęcia urodzinowego .

Wyzwanie

Napisz program lub funkcję, która wyświetli pierwszy numer tygodnia ISO na rok 2019, w którym ktoś w symulowanym biurze jest bardzo zły na ich temat wspólnego przyjęcia urodzinowego , z zastrzeżeniem następujących podstawowych zasad:

  • wprowadź liczbę całkowitą N > 1, która jest liczbą pracowników w biurze.
  • N urodzin siebie są rozmieszczone równomiernie na losowo z 1 stycznia Dec 31 (ignoruj 29 lutego).
  • ale tygodni roboczych w celu ustalenia wspólnych przyjęć urodzinowych są daty tygodnia ISO w 2019 r., które wynoszą między 2019-W01-1 (2018-12-31) a 2019-W52-7 (2019-12-29). Nowy tydzień ISO zaczyna się w każdy poniedziałek. (Myślę, że to wszystko, co naprawdę musisz wiedzieć o tygodniach ISO dla tego wyzwania).
  • dla N osób w biurze, każdy ma 1/3 szansy na bardzo złość osobowości typu Shared Birthday Party , więc musisz to również zasymulować.
  • ale nie będą wściekli, jeśli impreza będzie dzielona z ludźmi, którzy ją mają same urodziny.
  • wypisz numer tygodnia ISO (dokładny format jest elastyczny, pod warunkiem, że numer tygodnia jest wyraźny) dla pierwszego wystąpienia Very Angry Osoby . Jeśli nie ma wściekłych ludzi, możesz wypisać wszystko, co nie jest mylone z tygodniem ISO lub program może się pomylić itp.

Niektóre założenia upraszczające:

  • jak wspomniałem, całkowicie zignoruj ​​problem z 29 lutego (niepotrzebna komplikacja)
  • zignoruj ​​święta państwowe (jest to społeczność międzynarodowa, więc nasze święta będą się różnić) i po prostu załóż, że biuro jest otwarte w każdy dzień powszedni.

Zasady

To jest golf golfowy. Najkrótsza odpowiedź w bajtach dla każdego języka wygrywa. Domyślne luki zabronione.

Witamy wyjaśnienia kodu.

Pracowane przykłady

Opracowany przykład 1 z wejściem N = 7. Pierwsza i druga kolumna są losowe, jak opisano w regułach (ale tak naprawdę nie są losowe tutaj).

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

Więc nie ma gniewu. Program lub funkcja może powodować błędy lub generować coś, co nie jest mylone z numerem tygodnia ISO.

Przykład 2 z N nieokreślonym.

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

Wynik byłby W11lub coś równoważnego.

ngm
źródło
3
... Nie ma 29 lutego w 2019 roku! Czy możesz dodać działający przykład?
Kudłaty
Jaki powinien być wynik, jeśli nikt nie jest „bardzo zły”? To może dość łatwo zdarzyć się dla małychN..
FryAmTheEggman
4
@ Shaggy mogą istnieć ludzie, którzy pracują tam, których urodziny są 29 lutego. Mówię, żeby po prostu zignorować tę możliwość, ponieważ po prostu dodaje ona bezsensowną sprawę np. IMO.
ngm
1
Jeśli nie ma wściekłych ludzi, każde odpowiednie wyjście, które nie jest W01 do W52 lub równoważne, lub komunikat błędu, jest w porządku. Przeredaguję pytanie, aby odzwierciedlić to, kiedy nie będę mobilny.
ngm
1
Może to ja, ale wolę wspólne przyjęcie urodzinowe niż wcale. Rozerwij wszystkich, którzy mają urodziny w weekend.
Kevin Cruijssen

Odpowiedzi:

5

Python 2 , 172 202 bajty

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*

Wypróbuj online!

ups! Pominięto wymóg; koszt 30 bajtów.

OP podaje, że twoje urodziny nie przypadają 29 lutego.

Jeśli twoje urodziny przypadają 30 grudnia, nie przypadnie to w żadnym tygodniu ISO w 2019 roku, więc w każdym razie nie możesz być bardzo złym tygodniem ISO w 2019 roku.

To pozostawia 364 inne urodziny, aby uznać cię za bardzo zły. 104 z nich przypada w weekendy, kiedy postanowiliśmy, że nie będziesz się tym bardzo denerwował. Dbamy więc tylko o ciebie 260/365 czasu; tzn. kiedy R(0,364)>104( randintzakres obejmuje). Biorąc pod uwagę to ograniczenie, możliwe jest, że Twoje urodziny w dzień powszedni przypadają na jeden z 52 tygodni ISO w 2019 r. Oraz w każdy dzień tygodnia tego tygodnia; i niezależnie, że masz 1 na 3 prawdopodobieństwo, że będziesz osobą bardzo złą.

D jest wtedy zestawem, (weeknum,weekday)dzięki któremu jeśli potencjalnie Gniewna osoba ma urodziny, nie musi być Amgry, chyba że w tym tygodniu będzie jeszcze inna osoba.

0 jest zwracane, jeśli żadna osoba bardzo rozgniewana nie zamanifestuje się podczas tygodnia ISO 2019; w przeciwnym razie zwracany jest numer tygodnia ISO najwcześniejszego krachu.

Chas Brown
źródło
Czy nie powinieneś również wziąć pod uwagę przypadku na krawędzi z 31 grudnia 2019 r.?
Charlie
1
@Charlie: Jasne! Ale 31 grudnia 2018 r. Jest w tym samym tygodniu ISO, co 1 stycznia 2019 r., A zatem byłby częścią tego „zazdrosnego tygodnia imprezowego”, więc się udało.
Chas Brown,
Nie jestem ekspertem od Pythona, ale wierzę, że twoja odpowiedź nie wyjaśnia tego: „ale nie będą źli, jeśli impreza będzie dzielona z osobami, które mają te same urodziny”. Nadal masz moje poparcie.
OOBalance
@OOBalance: Ups! Tęskniłem za tym; poprawione!
Chas Brown
2

Galaretka ,  36 32  33 bajtów

+1 bajt, aby naprawić przypadek 30 grudnia, którego nie zauważyłem (jak zauważył Chas Brown w komentarzach poniżej PO)

-4 dzięki Erikowi Outgolferowi (inline pomocnik i użycie produktu zewnętrznego)

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

Łącze monadyczne, które daje liczbę całkowitą w [0,52] gdzie 0 oznacza brak bardzo złych ludzi w ciągu roku, a inne wyniki to numery tygodni ISO.

Wypróbuj online!

Lub zobacz tę wersję, która drukuje pogrupowane tygodnie, w których przypadają urodziny każdej osoby (0 na weekendy), a następnie drukuje listę zamówień o tym samym zamówieniu, czy te osoby są bardzo wściekłe, i ostatecznie drukuje wynik.

Jonathan Allan
źródło
1

Java 8, 198 bajtów

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;}

Dane wyjściowe są zerowe (0–51); wartość 52 oznacza brak bardzo złych ludzi. Wypróbuj online tutaj .

Nie golfowany:

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
źródło
Zaproponuj 91>26zamiast364>104
ceilingcat