Paylaşılan Doğum Günü Partisi


9

Bir ofis (buna "Ofis" diyelim) 2019 yılında ofis doğum günü partilerini birleştirerek boşa harcanacak zamanı azaltacak. Aynı haftanın Pazartesi ve Cuma günleri (dahil) arasında doğum günü olan iki kişi, o hafta bir saatte Paylaşılan Doğum Günü Partisi ile birlikte kutlanacak . Doğum günleri cumartesi veya pazar günleri düşenlere parti verilmez.

Bazı insanlar, doğum günlerini gerçek doğum günlerini paylaşmayan insanlarla paylaşmayı sevmezler. Paylaşılan Doğum Günü Partisi için çok Kızgın olacaklar .

Bir ofisi simüle edeceğiz ve birinin Paylaşılan Doğum Günü Partisi hakkında Çok Kızgınlaştığı ilk haftayı bulacağız .

Meydan okuma

Simüle edilmiş bir ofiste birinin Paylaşılan Doğum Günü Partisi hakkında Çok Kızgınlaştığı 2019 için ilk ISO hafta numarasını veren bir program veya işlev yazın , aşağıdaki temel kurallara tabidir:

  • ofiste çalışan sayısı olan N > 1 tamsayısını girin .
  • N kendilerini 31 Ara Jan 1 rastgele eşit olarak dağılmış olan doğum (Şubat 29 yok say).
  • ancak Paylaşılan Doğum Günü Partilerini belirlemek için çalışma haftaları 2019-W01-1 (2018-12-31) ile 2019-W52-7 (2019-12-29) arasında olan 2019 ISO Hafta Tarihleri'dir. Her pazartesi yeni bir ISO haftası başlıyor. (Bu zorluk için ISO haftaları hakkında bilmeniz gereken tek şey budur).
  • için N ofiste insanlar, her bir sahip bir 1/3 şans Çok Kızgın Paylaşılan doğum günü partisi bunu da simüle etmek gerekecek böylece, kişilik tipini.
  • ancak parti aynı doğum günü olan insanlarla paylaşılırsa kızmazlar.
  • Çok Öfkeli bir kişinin ilk ortaya çıkışında ISO hafta numarasını (bunun için tam biçim hafta sayısı açık olduğu sürece esnektir) çıktılayın . Öfkeli insanlar yoksa, bir ISO haftasıyla karıştırılmamış herhangi bir şey çıktısı alabilirsiniz veya program hata verebilir.

Bazı basitleştirici varsayımlar:

  • belirttiğim gibi, 29 Şubat meselesini tamamen görmezden gelin (gereksiz bir komplikasyon)
  • resmi tatilleri görmezden gelin (bu uluslararası bir topluluktur, bu yüzden tatillerimiz farklı olacaktır) ve ofisin hafta içi her gün açık olduğunu varsayalım.

kurallar

Bu kod golfü. Her dil için bayt cinsinden en kısa cevap kazanır. Varsayılan boşluklar yasaktır.

Kod açıklamaları hoş geldiniz.

Çalışılan Örnekler

Giriş N = 7 olan Örnek 1. Birinci ve ikinci sütunlar, kurallarda açıklandığı gibi rastgele (ancak burada elbette rastgele değil).

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

Yani öfke olmaz. Program veya işlev hata yapabilir veya bir ISO hafta numarası ile karıştırılmamış bir şey çıktısı verebilir.

Örnek 2, N belirtilmemiş.

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

Çıktı W11veya eşdeğeri bir şey olurdu .


3
... 2019'da 29 Şubat yok! Çalışan bir örnek ekleyebilir misiniz, lütfen?
Shaggy

Hiç kimse "çok kızgın" değilse çıktı ne olmalıdır? Bu küçükler için kolayca olabilirN.
FryAmTheEggman

4
@ Doğum günü 29 Şubat olan orada çalışan insanlar olabilir. Sadece anlamsız bir egde davası IMO eklediğinden bu olasılığı görmezden gelmeyi söylüyorum.
ngm

1
Öfkeli insanlar yoksa, W01 ila W52 veya eşdeğeri olmayan herhangi bir uygun çıktı veya bir hata mesajı iyidir. Soruyu, mobil cihaz dışındayken bunu yansıtacak şekilde düzenleyeceğim.
ngm

1
Belki benim, ama hiç doğumdan ziyade ortak bir doğum günü partim var. Hafta sonları doğum günü olanları soy
Kevin Cruijssen

Yanıtlar:


5

Python 2 , 172202 bayt

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*

Çevrimiçi deneyin!

ayy! Bir gereksinimi kaçırdı; 30 bayt maliyeti.

OP tarafından doğum gününüz 29 Şubat değil.

Doğum gününüz 30 Aralık ise, 2019'un herhangi bir ISO haftasına düşmeyecektir, bu nedenle her durumda 2019'un Çok Kızgın ISO haftası olamazsınız.

Bu da sizi çok öfkeli olarak görmeniz için 364 doğum günü daha bırakır. Bunların 104'ü hafta sonlarında düşüyor, bu konuda Çok Kızmayacağınızı şart koşuyoruz. Bu yüzden sadece 260/365 kez sizi önemsiyoruz; yani, R(0,364)>104( randintaralığı kapsama dahil olduğunda). Bu kısıtlama göz önüne alındığında, hafta içi doğum gününüzün 2019'un 52 ISO haftasından herhangi birine ve o haftanın herhangi bir haftasına düşmesi eşdeğerdir; ve bağımsız olarak, çok öfkeli biri olma olasılığınız her üç kişiden birinde.

D, (weeknum,weekday)öyleyse, potansiyel olarak Öfkeli bir kişinin gerçek bir doğum gününü paylaşması durumunda, o hafta doğum günü olan başka bir kişi yoksa Amgry olmaya gerek yoktur.

Herhangi bir ISO 2019 haftasında Hiçbir Kızgın insan ortaya çıkmazsa 0 döndürülür; aksi takdirde, en erken erimenin ISO hafta numarası iade edilir.


31 Aralık 2019 tarihli son vakayı da dikkate almamalı mısınız?
Charlie

1
@Charlie: Elbette! Ama 31 Aralık'ta 2018 Jan 1 ile aynı ISO haftasında 2019 yılında ise 2019 işe yarar böylece, o "kıskanç taraf haftanın" bir parçası olacağını böylece.
Chas Brown

Ben Python uzmanı değilim, ancak cevabınızın bunu açıklayamadığına inanıyorum: "ama parti aynı doğum gününe sahip kişilerle paylaşılırsa kızmazlar." Yine de benim oyumu aldın.
OOBalance

@OOBalance: Hata! Bunu kaçırdı; tadil!
Chas Brown

2

Jöle ,  36 32  33 bayt

Fark etmediğim 30 Aralık kenarını düzeltmek için +1 bayt (Chas Brown tarafından işaret edildiği gibi OP'nin altındaki yorumlarda belirtilmiştir)

-4 Outgolfer Erik sayesinde (satıriçi yardımcı ve dış ürün kullanımı)

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

Bir tamsayı veren monadik bir bağlantı [0,52] nerede 0 yıl boyunca hiç çok kızgın insan olmadığı anlamına gelir ve diğer çıktılar ISO hafta sayılarıdır.

Çevrimiçi deneyin!

Ya da , her bir kişinin doğum gününün yattığı haftaları (hafta sonları için 0) gruplandıran, daha sonra bu kişilerin Çok Kızgın tipte olup olmadıklarının aynı sıralı bir listesini basan ve son olarak sonucu yazdıran bu sürüme bakın .


1

Java 8, 198 bayt

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

Çıktı sıfır tabanlıdır (0-51); 52 değeri Çok Öfkeli insan olmadığını gösterir . Burada çevrimiçi deneyin .

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
}

Öner 91>26yerine364>104
ceilingcat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.