Informazioni sulla serie
Prima di tutto, puoi trattarlo come qualsiasi altra sfida di golf del codice e rispondere senza preoccuparti della serie. Tuttavia, esiste una classifica in tutte le sfide. Puoi trovare la classifica insieme ad alcune ulteriori informazioni sulla serie nel primo post .
Anche se ho un sacco di idee in programma per la serie, le sfide future non sono ancora state messe sulla pietra. Se hai qualche suggerimento, per favore fatemelo sapere sul post sandbox pertinente .
Hole 3: Partizioni intere
È ora di aumentare un po 'la difficoltà.
Una partizione di un numero intero positivo n
è definita come un multiset di numeri interi positivi che si sommano a n
. Ad esempio se n = 5
, esistono le seguenti partizioni:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Si noti che questi sono multiinsiemi, quindi non c'è per loro {3,1,1}
, {1,3,1}
e {1,1,3}
sono tutti considerati identici.
Il tuo compito è, dato n
, generare una partizione casuale di n
. Ecco le regole dettagliate:
La distribuzione delle partizioni prodotte deve essere uniforme . Cioè, nell'esempio sopra, ogni partizione dovrebbe essere restituita con probabilità 1/7.
Naturalmente, a causa delle limitazioni tecniche dei PRNG, la perfetta uniformità sarà impossibile. Ai fini della valutazione dell'uniformità della presentazione, le seguenti operazioni saranno considerate come una distribuzione perfettamente uniforme:
- Ottenere un numero da un PRNG (su qualsiasi intervallo), che è documentato come (approssimativamente) uniforme.
- Mappare una distribuzione uniforme su un set di numeri più grande su un set più piccolo tramite modulo o moltiplicazione (o qualche altra operazione che distribuisce i valori in modo uniforme). Il set più grande deve contenere almeno 1024 volte il maggior numero possibile di valori del set più piccolo.
Poiché le partizioni sono multiset, è possibile restituirle in qualsiasi ordine e questo ordine non deve essere coerente. Tuttavia, ai fini della distribuzione casuale, l'ordine viene ignorato. Cioè, nell'esempio sopra
{3,1,1}
,{1,3,1}
e{1,1,3}
insieme devono avere una probabilità di 1/7 di essere restituiti.- L'algoritmo deve avere un runtime deterministico. In particolare, non è possibile generare multiset casuali e rifiutarli se non si sommano
n
. - La complessità temporale dell'algoritmo deve essere polinomiale
n
. In particolare, non è possibile semplicemente generare tutte le partizioni e selezionarne una casuale (poiché il numero di partizioni aumenta esponenzialmente conn
). Si può presumere che il PRNG in uso possa restituire valori distribuiti uniformemente in O (1) per valore. - Non è necessario utilizzare alcuna funzione integrata che risolva questa attività.
È possibile scrivere un programma completo o una funzione e accettare input tramite STDIN o alternativa più vicina, argomento della riga di comando o argomento della funzione e produrre output tramite valore di ritorno o stampando su STDOUT (o alternativa più vicina).
Si può presumere che n ≤ 65
(tale che il numero di partizioni sia inferiore a 2 21 ). L'output può essere in qualsiasi elenco o formato stringa comodo e inequivocabile.
Se invii una funzione, ti preghiamo di considerare di fornire anche un piccolo programma di test che chiama la funzione più volte e stampa i risultati. Va bene se i parametri devono essere modificati nel codice. Questo è solo così le persone possono verificare che la soluzione sia almeno approssimativamente uniforme.
Questo è il golf del codice, quindi vince l'invio più breve (in byte). E, naturalmente, la presentazione più breve per utente entrerà anche nella classifica generale della serie.
Classifica
Il primo post della serie genera una classifica.
Per assicurarti che le tue risposte vengano visualizzate, inizia ogni risposta con un titolo, utilizzando il seguente modello Markdown:
# Language Name, N bytes
dov'è N
la dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(La lingua non è attualmente visualizzata, ma lo snippet richiede e analizza, e in futuro potrei aggiungere una classifica linguistica).