공유 생일 파티


9

2019 년에는 사무실 생일 파티를 통합하여 사무실 ( "사무실"이라고 함)이 낭비되는 시간을 줄입니다. 같은 주 월요일부터 금요일 (포함) 사이에 생일을 가진 두 사람은 그 주에 공유 생일 파티 를 열게됩니다. 생일이 토요일이나 일요일에있는 사람들은 파티를 전혀받지 않습니다.

어떤 사람들은 실제 생일을 공유하지 않는 사람들과 생일 파티를 공유하는 것을 좋아하지 않습니다. 그들은 공유 생일 파티 를 가지고 매우 화가 될 것 입니다.

우리는 사무실을 시뮬레이션하고 누군가가 그들의 공유 생일 파티에 대해 매우 화 를내는 첫 주를 찾을 것 입니다.

도전

다음의 기본 규칙 에 따라 모의 사무실에있는 누군가가 공유 생일 파티 에 대해 매우 화를 내는 2019 년 첫 번째 ISO 주 번호를 출력하는 프로그램 또는 함수를 작성하십시오 .

  • 사무실의 작업자 수인 N > 1 의 정수를 입력 하십시오.
  • N의 자체 12 월 31 일월 1 임의로 분포 생일 (이월 29 무시).
  • 그러나 공유 생일 파티 를 결정하기위한 작업 주일 은 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을 구상했습니다 . 첫 번째와 두 번째 열은 규칙에 설명 된대로 임의적입니다 (물론 실제로 임의적이지는 않습니다).

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같거나 비슷한 것입니다.


3
... 2019 년 2 월 29 일은 없습니다! 효과적인 예제를 추가 할 수 있습니까?
얽히고 설킨

아무도 "매우 화난"사람이 아닌 경우 결과는 무엇입니까? 이것은 작은 대해 아주 쉽게 발생할 수 있습니다 .
FryAmTheEggman

4
@Shaggy 거기서 생일이 2 월 29 일인 사람들이있을 수 있습니다. 나는 무의미한 egde case IMO를 추가하기 때문에 그 가능성을 무시한다고 말하고 있습니다.
ngm

1
화난 사람이 없으면 W01 ~ W52 또는 이와 동등한 것이 아닌 적절한 출력 또는 오류 메시지가 정상입니다. 모바일을 사용하지 않을 때이를 반영하도록 질문을 편집하겠습니다.
ngm

1
어쩌면 나일지도 모르지만 나는 공유 생일 파티를 전혀하지 않습니다. 주말에 생일을 가진 사람들을 모두 찢으십시오.
Kevin Cruijssen

답변:


5

파이썬 2 , 172202 바이트

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*

온라인으로 사용해보십시오!

죄송합니다! 요구 사항을 놓쳤다; 비용은 30 바이트입니다.

OP에 의해 생일이 2 월 29 일이 아님을 알 수 있습니다.

생일이 12 월 30 일인 경우 2019 년 ISO 주에 해당되지 않으므로 2019 년에는 매우 화난 ISO 주가 될 수 없습니다.

당신이 매우 화난 것을 고려하기 위해 364 개의 다른 생일이 남습니다. 이 중 104 개는 주말에 당신이 그것에 대해 매우 화 내지 않을 것이라고 규정했을 때 떨어집니다. 따라서 우리는 단지 260/365의 시간에만 관심이 있습니다. 즉, R(0,364)>104( randint의 범위를 포함하는 경우). 그러한 제약이 주어지면, 평일 생일은 2019 년의 ISO 52 주 중 어느 주나 그 주중의 어느 주일에 해당하는 것이 가능합니다. 독립적으로 귀하는 3 분의 1이 매우 화난 사람 일 가능성이 높습니다.

D는 (weeknum,weekday)잠재적으로 화난 사람이 실제 생일을 공유하는 경우 그 주에 다른 생일을 가진 사람이 없으면 Amgry가 될 필요가 없도록하는 세트입니다.

ISO 2019 주 동안 매우 화난 사람이 나타나지 않으면 0이 반환됩니다. 그렇지 않으면 가장 빠른 용융의 ISO 주 번호가 반환됩니다.


2019 년 12 월 31 일의 엣지 케이스도 고려해야합니까?
Charlie

1
@Charlie : 물론입니다! 12 월까지는 (31) 2018 년 1 월 1과 동일한 ISO 주 2019에 2019 이 밖으로 작동 그래서, "질투 자 주"의 일부가 될 것입니다 때문에.
Chas Brown

저는 파이썬 전문가는 아니지만 귀하의 답변이 이것을 설명하지 못한다고 생각합니다. "하지만 파티가 같은 생일을 가진 사람들과 공유된다면 화를 내지 않을 것입니다." 그래도 여전히 내 공감대를 얻었 어.
OOBalance

@OOBalance : 죄송합니다! 그것을 놓쳤다; 수정!
Chas Brown

2

젤리 ,  36 32  33 바이트

내가 알지 못했던 30-Dec 엣지 케이스를 수정하기 위해 +1 바이트 (Chiss Brown이 지적한 것처럼 OP 아래에 주석이 있음)

Outgolfer Erik (인라인 도우미 및 외부 제품 사용) 덕분에 -4

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

정수를 생성하는 모나드 링크 [0,52] 어디 0 일년 내내 전혀 화난 사람이 없으며 다른 결과물은 ISO 주 번호입니다.

온라인으로 사용해보십시오!

또는 각 사람의 생일이있는 주 (0 주일 동안 0 주)를 그룹화 한 다음 해당 사람들이 매우 화난 유형인지에 대한 동일한 순서의 목록을 인쇄 한 다음 결과를 인쇄하는 이 버전 을 참조하십시오 .


1

Java 8, 198 바이트

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

출력은 0부터 시작합니다 (0-51). 52 값은 매우 화난 사람이 없음을 나타냅니다 . 여기에서 온라인으로 사용해보십시오 .

언 골프 드 :

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
}

91>26대신 추천364>104
천장 고양이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.