Pesta Ulang Tahun Bersama

9

Sebuah kantor (sebut saja "Kantor") akan mengurangi waktu terbuang pada tahun 2019 dengan menggabungkan pesta ulang tahun kantor. Dua orang yang berulang tahun antara hari Senin dan Jumat (termasuk) dari minggu yang sama akan dirayakan dengan Pesta Ulang Tahun Bersama beberapa waktu dalam minggu itu. Orang-orang yang ulang tahunnya jatuh pada hari Sabtu atau Minggu tidak mendapat pesta sama sekali.

Beberapa orang tidak suka berbagi pesta ulang tahun dengan orang-orang yang tidak membagikan ulang tahun mereka yang sebenarnya. Mereka akan sangat marah memiliki Pesta Ulang Tahun Bersama .

Kami akan mensimulasikan kantor dan menemukan minggu pertama di mana seseorang menjadi sangat marah tentang Pesta Ulang Tahun Bersama mereka .

Tantangan

Tulis program atau fungsi yang menghasilkan angka minggu ISO pertama untuk 2019 di mana seseorang di kantor yang disimulasikan menjadi sangat marah tentang Pesta Ulang Tahun Bersama mereka , tunduk pada aturan dasar berikut:

  • masukan bilangan bulat N > 1, yang merupakan jumlah pekerja di kantor.
  • yang N ulang tahun sendiri terdistribusi secara merata secara acak dari 1 Januari - 31 Desember (mengabaikan Februari 29).
  • tetapi minggu kerja untuk tujuan menentukan Pesta Ulang Tahun Bersama adalah Tanggal Pekan ISO 2019, yaitu antara 2019-W01-1 (2018-12-31) dan 2019-W52-7 (2019-12-29). Minggu ISO baru dimulai setiap hari Senin. (Saya pikir ini semua yang perlu Anda ketahui tentang ISO minggu untuk tantangan ini).
  • untuk orang- orang N di kantor, masing-masing memiliki peluang 1/3 untuk memiliki tipe kepribadian Pesta Ulang Tahun yang Sangat Marah , jadi Anda harus mensimulasikannya juga.
  • tetapi mereka tidak akan marah jika pesta itu dibagikan kepada orang-orang yang memiliki ulang tahun yang sama .
  • mengeluarkan nomor minggu ISO (format yang tepat untuk ini fleksibel selama jumlah minggu jelas) untuk kemunculan pertama orang yang Sangat Marah . Jika tidak ada orang yang marah, Anda dapat menampilkan apa pun yang tidak bingung dengan minggu ISO atau program dapat kesalahan keluar dll.

Beberapa asumsi penyederhanaan:

  • seperti yang saya sebutkan, abaikan masalah 29 Februari sepenuhnya (komplikasi yang tidak dibutuhkan)
  • abaikan hari libur umum (ini adalah komunitas internasional sehingga liburan kami akan berbeda) dan anggap saja kantor buka pada setiap hari kerja.

Aturan

Ini adalah kode-golf. Jawaban terpendek dalam byte untuk setiap bahasa menang. Celah default dilarang.

Penjelasan kode diterima.

Contoh yang berhasil

Contoh 1 dibuat dengan input N = 7. Kolom pertama dan kedua acak seperti yang dijelaskan dalam aturan (tapi tentu saja tidak acak di sini).

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

Jadi tidak ada kemarahan yang terjadi. Program atau fungsi dapat membuat kesalahan atau mengeluarkan sesuatu yang tidak dikacaukan dengan angka minggu ISO.

Contoh 2 dengan N tidak ditentukan.

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

Outputnya akan menjadi W11atau sesuatu yang setara.

ngm
sumber
3
... Tidak ada tanggal 29 Februari di tahun 2019! Bisakah Anda menambahkan contoh yang berhasil?
Shaggy
N
4
@ Shaggy mungkin ada orang-orang yang bekerja di sana yang berulang tahun tanggal 29 Februari. Saya mengatakan untuk mengabaikan kemungkinan itu karena itu hanya menambahkan IME case pointless sia-sia.
ngm
1
Jika tidak ada orang yang marah, output yang sesuai yang tidak W01 ke W52 atau setara, atau pesan kesalahan, baik-baik saja. Saya akan mengedit pertanyaan untuk mencerminkan hal ini ketika saya tidak aktif di ponsel.
ngm
1
Mungkin ini aku, tapi aku lebih suka mengadakan pesta ulang tahun bersama daripada tidak sama sekali. Robek semua orang yang berulang tahun di akhir pekan.
Kevin Cruijssen

Jawaban:

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*

Cobalah online!

Ups! Kehilangan persyaratan; biaya 30 byte.

Diberikan oleh OP bahwa ulang tahun Anda bukan tanggal 29 Februari.

Jika ulang tahun Anda adalah 30 Desember, maka tidak akan termasuk dalam minggu ISO 2019, jadi Anda tidak dapat menjadi minggu ISO Sangat Marah pada 2019.

Yang membuat 364 ulang tahun lainnya menganggap Anda sangat marah. 104 dari ini jatuh pada akhir pekan ketika kami telah menetapkan bahwa Anda tidak akan menjadi sangat marah tentang hal itu. Jadi kami hanya peduli dengan Anda 260/365 waktu; yaitu kapan R(0,364)>104( randintrentangnya inklusif). Mengingat kendala itu, tidak dapat disangkal bahwa ulang tahun hari kerja Anda termasuk dalam salah satu dari 52 minggu ISO tahun 2019, dan setiap hari kerja dalam minggu itu; dan, secara mandiri, bahwa Anda adalah 1 dari 3 yang cenderung menjadi orang yang sangat marah.

D adalah seperangkat (weeknum,weekday)sehingga jika seseorang yang berpotensi Marah membagikan ulang tahun yang sebenarnya, maka tidak perlu menjadi Amgry kecuali ada orang lain yang berulang tahun pada minggu itu.

0 dikembalikan jika tidak ada orang yang Sangat Marah yang memanifestasikan selama ISO 2019 minggu apa pun; jika tidak, nomor minggu ISO dari krisis paling awal dikembalikan.

Chas Brown
sumber
Bukankah sebaiknya Anda juga mempertimbangkan kasus tepi 31 Desember 2019?
Charlie
1
@Charlie: Tentu! Tetapi 31 Desember 2018 berada dalam minggu ISO yang sama 2019 dengan 1 Januari 2019 sehingga akan menjadi bagian dari "minggu pesta cemburu" itu, jadi itu berhasil.
Chas Brown
Saya bukan pakar Python, tetapi saya yakin jawaban Anda gagal menjelaskan hal ini: "tetapi mereka tidak akan marah jika pesta dibagi dengan orang-orang yang memiliki ulang tahun yang sama." Anda masih punya upvote saya.
OOBalance
@OOBalance: Ups! Melewatkan itu; diamandemen!
Chas Brown
2

Jelly ,  36 32  33 byte

+1 byte untuk memperbaiki kasus tepi 30-Des yang saya tidak perhatikan (seperti yang ditunjukkan oleh Chas Brown dalam komentar di bawah OP)

-4 Terima kasih kepada Erik the Outgolfer (pembantu inline dan penggunaan produk luar)

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

[0,52]0

Cobalah online!

Atau lihat versi ini yang mencetak minggu-minggu di mana ulang tahun setiap orang berada (0 untuk akhir pekan) dikelompokkan, lalu mencetak daftar daftar urutan yang sama dari apakah orang-orang itu dari tipe Sangat Marah, dan akhirnya mencetak hasilnya.

Jonathan Allan
sumber
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;}

Output berbasis nol (0-51); nilai 52 menunjukkan tidak ada orang yang sangat marah . Cobalah online di sini .

Tidak Disatukan:

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
}
Ketidakseimbangan
sumber
Sarankan 91>26alih-alih364>104
ceilingcat