C++ moderno nell'avvento del codice: Day6

È il sesto giorno dell'Avvento del Codice . Oggi trasformeremo la crescita esponenziale in una soluzione spaziale costante e daremo un'occhiata alla programmazione in fase di compilazione.

Come sempre, prova a risolvere il problema prima di guardare la soluzione. Per tutti gli articoli di questa serie, controlla questo elenco .

Giorno6: Parte 1 e Parte 2

Abbiamo il compito di modellare una popolazione di pesci lanterna che si riproduce ogni sette giorni (con la nuova generazione che ha bisogno di due cicli extra per "crescere"). Sfortunatamente, modellare un tale sistema ci costringe a evitare di modellare ogni individuo poiché la memoria si esaurirebbe rapidamente.

Quindi, come possiamo riformulare il problema in modo da non dover tenere traccia di ogni individuo? Considera che tutti i lanternfish con lo stesso timer interno si comportano allo stesso modo, quindi possiamo tenere traccia del numero di lanternfish con ogni stato del timer interno, che sarà sempre e solo 0..8. Ogni giorno, rimuoviamo il primo elemento, che è il numero di pesci lanterna che si riproducono, spostando tutti gli altri pesci lanterna in uno stato interno inferiore e aggiungiamo il pesce lanterna che si riproduce agli stati 6(per i genitori) e 8(per la prole).

Usiamo std::dequeper rendere facile il passaggio degli stati.

Per i test, abbiamo un test semplice che verifica se i lanternfish si riproducono correttamente e quindi utilizzano i dati di test da AoC:

L'implementazione segue la struttura delineata:

Dobbiamo stare attenti poiché possiamo facilmente traboccare con uint32_t, questo è il motivo per cui istanziamo std::accumulatecon UINT64_C(0)che forza che la somma corrente sia uint64_t(riga 19). Verifichiamo anche l'overflow durante la riproduzione (riga 26).

Infine, nel nostro main, leggiamo l'input di una riga e il ciclo per il numero richiesto di generazioni:

Day6: soluzione in fase di compilazione

Poiché la soluzione al problema di oggi era così semplice, ho deciso di fornire un bonus, ovvero una soluzione che calcola completamente durante la fase di compilazione.

Con il moderno C++ possiamo evitare il tipico codice spaghetti template del vecchio. Le funzioni Constexpr ora consentono un'elevata espressività e molte delle funzionalità della libreria standard sono disponibili come constexpr.

Link e note tecniche

Il repository con le soluzioni giornaliere è disponibile su: https://github.com/HappyCerberus/moderncpp-aoc-2021.

Dai un'occhiata a questo elenco per gli articoli sugli altri giorni in Advent of Code .

E per favore, non dimenticare di provare Advent of Code per te stesso.

Grazie per aver letto

Grazie per aver letto questo articolo. Ti è piaciuto?

Pubblico anche video su YouTube . avete domande? Hit me up su Twitter o LinkedIn .

Suggested posts

Ricerca di informazioni sui nomi di dominio

Un estratto da Small, Sharp Software Tools di Brian P. Hogan

Ricerca di informazioni sui nomi di dominio

Quando fai una richiesta a facebook.com, il tuo computer cerca il nome di dominio per tradurre quel nome di dominio in un indirizzo IP in modo che il tuo computer possa effettuare quella connessione.

La parola D e la parola L in UI Design. Questioni linguistiche. Non essere razzista.

La parola D e la parola L in UI Design. Questioni linguistiche. Non essere razzista.

La nostra lingua è uno strumento potente che può modellare i nostri pensieri, atteggiamenti e azioni. Anche termini apparentemente innocui possono perpetuare pregiudizi e stereotipi dannosi.

Related posts

Creazione di un ambiente di lavoro sicuro

Creazione di un ambiente di lavoro sicuro

“Mi proteggerà quando sarò in pericolo. mi nasconderà nella sua tenda.

L'assassinio di Jordan Neely e il problema del razzismo "patriottico".

Gli Stati Uniti possono fare il passo essenziale per non equiparare il comportamento razzista all'essere un buon americano?

L'assassinio di Jordan Neely e il problema del razzismo "patriottico".

[Avviso di attivazione: questo saggio include schermate di persone che elogiano l'assassino di Jordan Neely.] I funzionari delle forze dell'ordine hanno finalmente - e forse con riluttanza - accusato Daniel Penny, l'uomo che ha soffocato Jordan Neely fino alla sua morte, per quell'omicidio.

La persecuzione dei cristiani: il crimine d'odio di cui non parliamo

Dimentica l'islamofobia: i cristiani (e gli ebrei) sono le principali vittime dei crimini di odio religioso.

La persecuzione dei cristiani: il crimine d'odio di cui non parliamo

Qualsiasi mente razionale sa che i circoli politici e mediatici sono dominati dalla sinistra, anche dall'estrema sinistra, uno stato di cose che crea uno squilibrio nel discorso politico. Nel campo della religione, questo squilibrio è chiaramente visibile: giornali e reti di sinistra non si affrettano a difendere la fede cristiana.

Perché alcuni freelance stanno fingendo le loro vite

Perché alcuni freelance stanno fingendo le loro vite

Recentemente sono stato su Linkedin, il social network professionale più grande del mondo, e ho trovato post di designer freelance che seguo che hanno attirato la mia attenzione. Tutti hanno postato foto dagli aeroplani, sulla spiaggia con i loro laptop, dalle piscine e dagli uffici con viste mozzafiato.