... Ah scusa, niente popcorn qui, solo POPCNT.
Scrivi il programma o la funzione più breve che accetta un numero n
e genera tutti gli interi da 0 a 2 n - 1, in ordine crescente di numero di 1 bit nella rappresentazione binaria dei numeri (popcount). Nessun duplicato consentito.
L'ordine dei numeri con lo stesso popcount è definito dall'implementazione.
Ad esempio, per n = 3
, tutti questi output sono validi:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
Il formato di input e output è definito dall'implementazione per consentire l'uso delle funzionalità del linguaggio per migliorare ulteriormente il codice. Ci sono alcune restrizioni sull'output:
- I numeri devono essere emessi in formato decimale.
L'output deve contenere un separatore ragionevole tra i numeri (separatore finale consentito, ma non iniziale).
Riga (
\n
), scheda (\t
), lo spazio,,
,.
,;
,|
,-
,_
,/
sono separatore abbastanza ragionevole. Non mi dispiace spazi aggiuntivi per la stampa carina, ma non uso lettere o cifre come separatori.- I numeri e i separatori possono essere racchiusi tra
[ ]
,{ }
o qualsiasi array o notazione di elenco. - Non stampare nient'altro non indicato sopra.
indennità
Moltiplica il tuo punteggio per 0,5 se la tua soluzione può generare il numero al volo. Lo spirito di questo bonus è che se dovessi convertire direttamente la tua soluzione di stampa in un generatore, il generatore utilizza al massimo la memoria O (n) dove n è il numero di bit come definito sopra. (Non è necessario convertire effettivamente la soluzione in generatore). Si noti che mentre impongo n <= 28, la memoria necessaria per memorizzare tutti i numeri cresce ancora in modo esponenziale e una soluzione di ordinamento ingenuo ridurrebbe almeno 4 GB di memoria a n = 28.
Aggiungi una semplice spiegazione di come funziona la tua soluzione prima di richiedere questo bonus.