На четиринадесетия ден от Advent of Code ние симулираме падащ пясък. Насърчавам ви първо да опитате да го разрешите сами https://adventofcode.com.

Вход

Днешният вход е поредица от сканирания, като всяко сканиране се състои от поредица от координати, които представляват свързани линии. Ще интерпретираме всяко сканиране и ще начертаем съответните линии в нашата карта, която съхраняваме като std::vector<std::vector<char>>.

Докато рисуваме линии, ще запомним и ограничителната кутия (начертани минимални и максимални координати), която ще ни е необходима и за двете части.

std::views::iota ни помага да избегнем досадната аритметика на индекса.

Пускане на пясък в празнотата

За първа част приемаме, че нашите сканирания съществуват в празнота и трябва да открием колко песъчинки ще бъдат заседнали, преди да започнат да падат в празнотата.

Тъй като си спомнихме ограничителната кутия, можем да я използваме, за да определим кога парче пясък е навлязло в празнотата. Освен това, ние повтаряме, преместваме парчето пясък според правилата и откриваме кога е заседнало.

Пускане на пясък на пода

За втора част имаме виртуален под, който се намира две под координатата на максималната дълбочина и спираме, когато има песъчинка, заседнала в началната координата (0,500).

Можем да използваме повторно по-голямата част от решението за първа част, но вместо да откриваме кога пясъкът навлиза в празнотата, ние откриваме кога се забива на пода.

Връзки

Хранилището с цялостно решение (включително анализ на вход) е достъпно тук: https://github.com/HappyCerberus/moderncpp-aoc-2022.

Публикувам ежедневно съдържание на Modern C++ в Twitter, LinkedIn, Mastodon, Medium и Substack.