Tiệc sinh nhật chia sẻ


9

Một văn phòng (hãy gọi nó là "Văn phòng") sẽ cắt giảm thời gian lãng phí vào năm 2019 bằng cách hợp nhất các bữa tiệc sinh nhật của văn phòng. Bất kỳ hai người nào có sinh nhật từ thứ Hai đến thứ Sáu (bao gồm) trong cùng một tuần sẽ được tổ chức với Bữa tiệc sinh nhật chung vào một thời gian trong tuần đó. Những người có ngày sinh nhật rơi vào thứ bảy hoặc chủ nhật không có bữa tiệc nào cả.

Một số người không thích chia sẻ bữa tiệc sinh nhật với những người không chia sẻ ngày sinh nhật thực sự của họ. Họ sẽ rất tức giận khi có một bữa tiệc sinh nhật chung .

Chúng tôi sẽ mô phỏng một văn phòng và tìm thấy tuần đầu tiên mà ai đó rất tức giận về Bữa tiệc sinh nhật chung của họ .

Các thách thức

Viết chương trình hoặc chức năng đưa ra số tuần ISO đầu tiên cho năm 2019, trong đó ai đó trong văn phòng mô phỏng sẽ rất tức giận về Bữa tiệc sinh nhật chung của họ , tuân theo các quy tắc cơ bản sau:

  • nhập một số nguyên N > 1, là số công nhân trong văn phòng.
  • các N sinh nhật mình được phân bố đều một cách ngẫu nhiên từ 1 Tháng một - 31 Tháng 12 (bỏ qua ngày 29 tháng 2).
  • nhưng các tuần làm việc cho mục đích xác định các bữa tiệc sinh nhật được chia sẻ là các Ngày trong tuần ISO 2019, trong khoảng từ 2019-W01-1 (2018-12-31) và 2019-W52-7 (2019-12-29). Một tuần ISO mới bắt đầu vào mỗi thứ Hai. (Tôi nghĩ rằng đây là tất cả những gì bạn thực sự cần biết về tuần ISO cho thử thách này).
  • Đối với N người trong văn phòng, mỗi người có 1/3 cơ hội có loại tính cách Bữa tiệc sinh nhật được chia sẻ rất tức giận , vì vậy bạn cũng sẽ phải mô phỏng điều đó.
  • nhưng họ sẽ không tức giận nếu bữa tiệc được chia sẻ với những người có cùng ngày sinh.
  • xuất số tuần ISO (định dạng chính xác cho điều này là linh hoạt miễn là số tuần rõ ràng) cho lần xuất hiện đầu tiên của một người Rất tức giận . Nếu không có người tức giận, bạn có thể xuất ra bất cứ điều gì không bị nhầm lẫn với một tuần ISO hoặc chương trình có thể bị lỗi, v.v.

Một số giả định đơn giản hóa:

  • như tôi đã đề cập, bỏ qua vấn đề ngày 29 tháng 2 hoàn toàn (một biến chứng không cần thiết)
  • bỏ qua các ngày lễ (đây là một cộng đồng quốc tế vì vậy ngày lễ của chúng tôi sẽ khác nhau) và chỉ giả sử văn phòng mở cửa vào mỗi ngày trong tuần.

Quy tắc

Đây là môn đánh gôn. Câu trả lời ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng. Lỗ hổng mặc định bị cấm.

Mã giải thích chào mừng.

Ví dụ làm việc

Ví dụ 1 có đầu vào N = 7. Cột thứ nhất và thứ hai là ngẫu nhiên như được mô tả trong các quy tắc (tất nhiên không thực sự ngẫu nhiên ở đây).

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

Vì vậy, không có sự tức giận xảy ra. Chương trình hoặc chức năng có thể lỗi hoặc xuất ra thứ gì đó không bị nhầm lẫn với số tuần ISO.

Ví dụ 2 với N không xác định.

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

Đầu ra sẽ là W11hoặc một cái gì đó tương đương.


3
... Không có ngày 29 tháng 2 năm 2019! Bạn có thể thêm một ví dụ làm việc, xin vui lòng?
Shaggy

N

4
@Shaggy có thể có những người làm việc ở đó có ngày sinh nhật là 29 tháng 2. Tôi nói rằng hãy bỏ qua khả năng đó vì nó chỉ thêm một trường hợp vô nghĩa IMO.
ngm

1
Nếu không có người tức giận, bất kỳ đầu ra phù hợp nào không phải là W01 đến W52 hoặc tương đương, hoặc một thông báo lỗi, đều ổn. Tôi sẽ chỉnh sửa câu hỏi để phản ánh điều này khi tôi tắt điện thoại.
ngm

1
Có lẽ đó là tôi, nhưng tôi thích tổ chức một bữa tiệc sinh nhật hơn là không có gì cả. Rip tất cả những người có sinh nhật của họ vào cuối tuần.
Kevin Cruijssen

Câu trả lời:


5

Python 2 , 172 202 byte

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*

Hãy thử trực tuyến!

Giáo sư! Bỏ lỡ một yêu cầu; Chi phí 30 byte.

OP được đưa ra rằng sinh nhật của bạn không phải là ngày 29 tháng 2.

Nếu sinh nhật của bạn là 30 tháng 12, nó sẽ không rơi vào bất kỳ tuần ISO nào của năm 2019, vì vậy trong mọi trường hợp, bạn không thể là một tuần ISO rất tức giận của năm 2019.

Điều đó khiến 364 ngày sinh nhật khác coi bạn đang rất tức giận. 104 trong số này rơi vào cuối tuần khi chúng tôi quy định rằng bạn sẽ không nhận được Rất tức giận về điều đó. Vì vậy, chúng tôi chỉ quan tâm đến bạn 260/365 của thời gian; tức là khi R(0,364)>104( randintphạm vi bao gồm). Với sự hạn chế đó, có thể trang bị rằng sinh nhật trong tuần của bạn rơi vào bất kỳ trong số 52 tuần ISO năm 2019 và bất kỳ ngày nào trong tuần đó; và, một cách độc lập, bạn là 1 trong 3 người có khả năng là một người rất tức giận.

D sau đó là một tập hợp (weeknum,weekday)để nếu một người có khả năng tức giận chia sẻ một sinh nhật thực sự, thì không cần phải là Amgry trừ khi có một người khác có sinh nhật vào tuần đó.

0 được trả về nếu không có người rất tức giận trong bất kỳ tuần ISO 2019 nào; mặt khác, số tuần ISO của meltdown sớm nhất được trả về.


Bạn cũng không nên xem xét trường hợp cạnh của ngày 31 tháng 12 năm 2019?
Charlie

1
@Charlie: Chắc chắn rồi! Nhưng ngày 31 tháng 12 năm 2018 là trong cùng tuần ISO 2019 với ngày 1 tháng 1 năm 2019, do đó sẽ là một phần của "tuần tiệc ghen" đó, vì vậy nó hoạt động được.
Chas Brown

Tôi không phải là chuyên gia về Python, nhưng tôi tin rằng câu trả lời của bạn không giải thích được điều này: "nhưng họ sẽ không tức giận nếu bữa tiệc được chia sẻ với những người có cùng ngày sinh." Bạn vẫn nhận được upvote của tôi mặc dù.
OOBalance

@OOBalance: Ôi trời! Bỏ lỡ điều đó; sửa đổi!
Chas Brown

2

Thạch ,  36 32  33 byte

+1 byte để sửa trường hợp cạnh 30 tháng 12 mà tôi không nhận thấy (như Chas Brown đã chỉ ra trong các bình luận bên dưới OP)

-4 cảm ơn Erik the Outgolfer (người trợ giúp nội tuyến và sử dụng sản phẩm bên ngoài)

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

[0,52]0

Hãy thử trực tuyến!

Hoặc xem phiên bản này in các tuần lễ sinh nhật của mỗi người (0 cho cuối tuần) được nhóm lại, sau đó in một danh sách theo thứ tự các danh sách xem những người đó có thuộc loại Rất tức giận hay không, và cuối cùng sẽ in kết quả.


1

Java 8, 198 byte

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

Đầu ra là không dựa trên (0-51); giá trị 52 cho thấy không có người rất tức giận . Hãy thử trực tuyến tại đây .

Ung dung:

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
}

Đề xuất 91>26thay vì364>104
trần mèo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.