Festa di compleanno condivisa


9

Un ufficio (chiamiamolo "The Office") ridurrà il tempo sprecato nel 2019 consolidando le feste di compleanno dell'ufficio. Ogni due persone con un compleanno tra lunedì e venerdì (incluso) della stessa settimana saranno festeggiate con una festa di compleanno condivisa qualche volta quella settimana. Le persone i cui compleanni cadono di sabato o domenica non ricevono alcuna festa.

Ad alcune persone non piace condividere una festa di compleanno con persone che non condividono il loro compleanno reale. Saranno molto arrabbiati per una festa di compleanno condivisa .

Simuleremo un ufficio e troveremo la prima settimana in cui qualcuno si arrabbia molto per la sua festa di compleanno condivisa .

La sfida

Scrivi un programma o una funzione che emetta il primo numero della settimana ISO per il 2019 in cui qualcuno in un ufficio simulato si arrabbi molto per la sua festa di compleanno condivisa , fatte salve le seguenti regole di base:

  • inserire un numero intero N > 1, che è il numero di lavoratori nell'ufficio.
  • i N compleanni stessi sono uniformemente distribuiti a caso dal 1 Gennaio - 31 Dicembre (29 Feb ignorano).
  • ma le settimane lavorative ai fini della determinazione delle feste di compleanno condivise sono le date della settimana ISO 2019, comprese tra 2019-W01-1 (2018-12-31) e 2019-W52-7 (2019-12-29). Una nuova settimana ISO inizia ogni lunedì. (Penso che questo sia tutto ciò che devi veramente sapere sulle settimane ISO per questa sfida).
  • per le persone N in ufficio, ognuna ha una probabilità 1/3 di avere un tipo di personalità per la festa di compleanno condivisa molto arrabbiato , quindi dovrai simularlo anche tu.
  • ma non si arrabbieranno se la festa è condivisa con persone che hanno lo stesso compleanno.
  • emette il numero della settimana ISO (il formato esatto per questo è flessibile fintanto che il numero della settimana è chiaro) per la prima occorrenza di una persona molto arrabbiata . Se non ci sono persone arrabbiate, puoi produrre qualsiasi cosa che non sia confusa con una settimana ISO o che il programma possa sbagliare ecc.

Alcune ipotesi di semplificazione:

  • come ho già detto, ignora completamente il problema del 29 febbraio (una complicazione non necessaria)
  • ignora le festività (questa è una comunità internazionale, quindi le nostre festività differiranno) e supponi che l'ufficio sia aperto ogni giorno della settimana.

Regole

Questo è code-golf. Vince la risposta più breve in byte per ogni lingua. Violazioni predefinite vietate.

Spiegazioni sul codice benvenute.

Esempi lavorati

Esempio contrastato 1 con input N = 7. La prima e la seconda colonna sono casuali come descritto nelle regole (ma in realtà non sono casuali qui ovviamente).

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

Quindi non accade rabbia. Il programma o la funzione possono generare errori o generare qualcosa di non confuso con un numero di settimana ISO.

Esempio 2 con N non specificato.

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

L'output sarebbe W11o qualcosa di equivalente.


3
... Non c'è il 29 febbraio nel 2019! Puoi aggiungere un esempio funzionante, per favore?
Shaggy,

Quale dovrebbe essere l'output se nessuno è "molto arrabbiato"? Questo potrebbe accadere abbastanza facilmente per le piccole . N
FryAmTheEggman,

4
@Shaggy potrebbero esserci persone che lavorano lì il cui compleanno è il 29 febbraio. Sto dicendo di ignorare questa possibilità poiché aggiunge semplicemente un caso IMO inutile.
ngm

1
Se non ci sono persone arrabbiate, qualsiasi uscita adatta che non va da W01 a W52 o equivalente, o un messaggio di errore, va bene. Modificherò la domanda per riflettere questo quando sono fuori dal cellulare.
ngm

1
Forse sono io, ma preferisco organizzare una festa di compleanno piuttosto che nessuna. Rip tutti quelli che hanno i loro compleanni nel fine settimana.
Kevin Cruijssen, il

Risposte:


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*

Provalo online!

oops! Mancato un requisito; costo 30 byte.

L'OP afferma che il tuo compleanno non è il 29 febbraio.

Se il tuo compleanno è il 30 dicembre, non cadrà in nessuna settimana ISO del 2019, quindi in ogni caso non puoi essere una settimana ISO molto arrabbiata del 2019.

Ciò lascia altri 364 compleanni a considerare che sei molto arrabbiato. 104 di questi cadono nei fine settimana quando abbiamo stabilito che non ti arrabbi molto. Quindi ci preoccupiamo solo per te 260/365 del tempo; cioè, quando R(0,364)>104( randintl'intervallo è compreso). Dato questo vincolo, è ipotizzabile che il tuo compleanno nei giorni feriali cada in una qualsiasi delle 52 settimane ISO del 2019 e in qualsiasi giorno della settimana di quella settimana; e, indipendentemente, che sei 1 su 3 probabilmente una persona molto arrabbiata.

D è quindi un insieme in (weeknum,weekday)modo che se una persona potenzialmente arrabbiata condivide un compleanno reale, allora non è necessario essere arrabbiato a meno che non ci sia un'altra persona che compie un compleanno quella settimana.

0 viene restituito se nessuna persona molto arrabbiata si manifesta durante una settimana ISO 2019; in caso contrario, viene restituito il numero della settimana ISO del primo tracollo.


Non dovresti considerare anche il caso limite del 31 dicembre 2019?
Charlie,

1
@Charlie: certo! Ma il 31 dicembre 2018 è nella stessa settimana ISO 2019 del 1 ° gennaio 2019, quindi farebbe parte di quella "settimana di festa gelosa", quindi funziona.
Chas Brown,

Non sono un esperto di Python, ma credo che la tua risposta non riesca a spiegarlo: "ma non si arrabbieranno se la festa è condivisa con persone che hanno lo stesso compleanno". Hai comunque ottenuto il mio voto.
OOBalance,

@OOBalance: Ooops! Perso quello; modificato!
Chas Brown,

2

Gelatina ,  36 32  33 byte

+1 byte per risolvere il caso limite del 30 dicembre che non avevo notato (come sottolineato da Chas Brown nei commenti sotto l'OP)

-4 grazie a Erik the Outgolfer (aiuto in linea e uso del prodotto esterno)

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

Un collegamento monadico che produce un numero intero in dove significa che non ci sono persone molto arrabbiate durante l'anno e altre uscite sono numeri ISO settimanali.0[0,52]0

Provalo online!

Oppure vedi questa versione che stampa le settimane in cui si trova il compleanno di ogni persona (0 per i fine settimana) raggruppati, quindi stampa un elenco degli elenchi dello stesso ordine se queste persone sono del tipo Molto arrabbiato e infine stampa il risultato.


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

L'output è a base zero (0-51); un valore di 52 non indica persone molto arrabbiate . Provalo online qui .

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
}

Suggerisci 91>26invece di364>104
ceilingcat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.