Compare commits

...

10 Commits

Author SHA1 Message Date
Sebastian Seedorf
efc9d51f52 Day 25 2020-12-30 19:39:33 +01:00
Sebastian Seedorf
fc93f4a5e7 Day 17 (bug fix for higher dimensions) 2020-12-30 16:40:57 +01:00
Sebastian Seedorf
8cc845167e Day 24 2020-12-30 16:40:28 +01:00
Sebastian Seedorf
1e78940455 Day 23 2020-12-30 10:35:08 +01:00
Sebastian Seedorf
9e79644296 Day 22 2020-12-29 17:26:41 +01:00
Sebastian Seedorf
259eb24308 Day 20 (works for any square puzzle size with 10x10 tiles) 2020-12-29 15:42:56 +01:00
Sebastian Seedorf
79087a9199 Merge remote-tracking branch 'origin/master' 2020-12-29 15:38:47 +01:00
Sebastian Seedorf
a04cbc39af Day 21 2020-12-29 15:38:41 +01:00
Sebastian Seedorf
61ad0cbf38 Day 20 (Part 2 fi-na-l-l-yyyyy) 2020-12-28 22:18:55 +01:00
Sebastian Seedorf
aef62199e6 Day 20 (Part 1 dmeo only [need runtime opt.]) 2020-12-21 18:11:27 +01:00
20 changed files with 3297 additions and 4 deletions

View File

@@ -0,0 +1,584 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="664c1b78-b4d4-4bbc-8e12-a9418ee991f1" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/day20/input.txt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/day20/part1.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/day20/part2.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Jupyter Notebook" />
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="MacroExpansionManager">
<option name="directoryName" value="mvkk2oii" />
</component>
<component name="ProjectId" id="1l4Q10hGGIP246ZjH4xEd0VRHrG" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/day17" />
<property name="nodejs_package_manager_path" value="npm" />
<property name="project.structure.last.edited" value="Modules" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="settings.editor.selected.configurable" value="reference.idesettings.debugger.python" />
</component>
<component name="PyConsoleOptionsProvider">
<option name="myPythonConsoleState">
<console-settings module-name="python-aoc-2020" sdk-home="/usr/bin/python3.8" is-module-sdk="true">
<option name="mySdkHome" value="/usr/bin/python3.8" />
<option name="myUseModuleSdk" value="true" />
<option name="myModuleName" value="python-aoc-2020" />
</console-settings>
</option>
</component>
<component name="PyDebuggerOptionsProvider">
<option name="mySaveCallSignatures" value="true" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/day17" />
<recent name="$PROJECT_DIR$/day16" />
<recent name="$PROJECT_DIR$/day14" />
<recent name="$PROJECT_DIR$/day13" />
<recent name="$PROJECT_DIR$/day03" />
</key>
</component>
<component name="RunManager">
<configuration default="true" type="ArquillianJUnit" factoryName="" nameIsGenerated="true">
<option name="arquillianRunConfiguration">
<value>
<option name="containerStateName" value="" />
</value>
</option>
<option name="TEST_OBJECT" value="class" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
<module name="python-aoc-2020" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="/usr/bin/python3.6" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="part1" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="python-aoc-2020" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="/usr/bin/python3.6" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day20" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/day20/part1.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.part1" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="664c1b78-b4d4-4bbc-8e12-a9418ee991f1" name="Default Changelist" comment="" />
<created>1606853665136</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1606853665136</updated>
<workItem from="1606853666683" duration="131000" />
<workItem from="1606853814892" duration="760000" />
<workItem from="1606854599751" duration="928000" />
<workItem from="1606855557391" duration="1384000" />
<workItem from="1606856988222" duration="41000" />
<workItem from="1606857137278" duration="1519000" />
<workItem from="1606892538415" duration="8285000" />
<workItem from="1606904172888" duration="1446000" />
<workItem from="1606905632259" duration="580000" />
<workItem from="1606906226346" duration="1141000" />
<workItem from="1606907391915" duration="3414000" />
<workItem from="1606988799888" duration="4335000" />
<workItem from="1607007418349" duration="606000" />
<workItem from="1607180911317" duration="7601000" />
<workItem from="1607258940333" duration="2116000" />
<workItem from="1607337838962" duration="10752000" />
<workItem from="1607435437270" duration="10803000" />
<workItem from="1607508615852" duration="2578000" />
<workItem from="1607601888038" duration="7137000" />
<workItem from="1607678716107" duration="8665000" />
<workItem from="1607765983302" duration="20011000" />
<workItem from="1607853669813" duration="10863000" />
<workItem from="1607879272204" duration="14487000" />
<workItem from="1607930840742" duration="25098000" />
<workItem from="1608019091396" duration="4564000" />
<workItem from="1608060353431" duration="8916000" />
<workItem from="1608106302585" duration="30557000" />
<workItem from="1608196206138" duration="18527000" />
<workItem from="1608284182753" duration="17185000" />
<workItem from="1608373747507" duration="9664000" />
<workItem from="1608396253020" duration="1266000" />
<workItem from="1608472289397" duration="12135000" />
</task>
<task id="LOCAL-00046" summary="Day 13 (cleanup)">
<created>1607880382001</created>
<option name="number" value="00046" />
<option name="presentableId" value="LOCAL-00046" />
<option name="project" value="LOCAL" />
<updated>1607880382001</updated>
</task>
<task id="LOCAL-00047" summary="Day 13 (minified version)">
<created>1607886173625</created>
<option name="number" value="00047" />
<option name="presentableId" value="LOCAL-00047" />
<option name="project" value="LOCAL" />
<updated>1607886173625</updated>
</task>
<task id="LOCAL-00048" summary="Day 13 (minified version 2)">
<created>1607886379574</created>
<option name="number" value="00048" />
<option name="presentableId" value="LOCAL-00048" />
<option name="project" value="LOCAL" />
<updated>1607886379574</updated>
</task>
<task id="LOCAL-00049" summary="Day 13 (minified version 3)">
<created>1607886811882</created>
<option name="number" value="00049" />
<option name="presentableId" value="LOCAL-00049" />
<option name="project" value="LOCAL" />
<updated>1607886811882</updated>
</task>
<task id="LOCAL-00050" summary="Day 13 (minified version 4)">
<created>1607887101244</created>
<option name="number" value="00050" />
<option name="presentableId" value="LOCAL-00050" />
<option name="project" value="LOCAL" />
<updated>1607887101244</updated>
</task>
<task id="LOCAL-00051" summary="Day 13 (minified version 5 / one-line)">
<created>1607888045089</created>
<option name="number" value="00051" />
<option name="presentableId" value="LOCAL-00051" />
<option name="project" value="LOCAL" />
<updated>1607888045089</updated>
</task>
<task id="LOCAL-00052" summary="Day 13 (minified version 6)">
<created>1607888433558</created>
<option name="number" value="00052" />
<option name="presentableId" value="LOCAL-00052" />
<option name="project" value="LOCAL" />
<updated>1607888433558</updated>
</task>
<task id="LOCAL-00053" summary="Day 13 (minified version 7)">
<created>1607888620666</created>
<option name="number" value="00053" />
<option name="presentableId" value="LOCAL-00053" />
<option name="project" value="LOCAL" />
<updated>1607888620666</updated>
</task>
<task id="LOCAL-00054" summary="Day 13 (minified version 8)">
<created>1607889212250</created>
<option name="number" value="00054" />
<option name="presentableId" value="LOCAL-00054" />
<option name="project" value="LOCAL" />
<updated>1607889212250</updated>
</task>
<task id="LOCAL-00055" summary="Day 13 (minified version 9)">
<created>1607890079970</created>
<option name="number" value="00055" />
<option name="presentableId" value="LOCAL-00055" />
<option name="project" value="LOCAL" />
<updated>1607890079970</updated>
</task>
<task id="LOCAL-00056" summary="Day 13 (minified version 10)">
<created>1607890582581</created>
<option name="number" value="00056" />
<option name="presentableId" value="LOCAL-00056" />
<option name="project" value="LOCAL" />
<updated>1607890582581</updated>
</task>
<task id="LOCAL-00057" summary="Day 13 (minified version 11)">
<created>1607890701437</created>
<option name="number" value="00057" />
<option name="presentableId" value="LOCAL-00057" />
<option name="project" value="LOCAL" />
<updated>1607890701437</updated>
</task>
<task id="LOCAL-00058" summary="Day 13 (minified version 12)">
<created>1607892297971</created>
<option name="number" value="00058" />
<option name="presentableId" value="LOCAL-00058" />
<option name="project" value="LOCAL" />
<updated>1607892297971</updated>
</task>
<task id="LOCAL-00059" summary="Day 13 (minified version 13)">
<created>1607892742426</created>
<option name="number" value="00059" />
<option name="presentableId" value="LOCAL-00059" />
<option name="project" value="LOCAL" />
<updated>1607892742426</updated>
</task>
<task id="LOCAL-00060" summary="Day 13 (minified version 14)">
<created>1607893005787</created>
<option name="number" value="00060" />
<option name="presentableId" value="LOCAL-00060" />
<option name="project" value="LOCAL" />
<updated>1607893005787</updated>
</task>
<task id="LOCAL-00061" summary="Day 13 (part 2 v2)">
<created>1607896913895</created>
<option name="number" value="00061" />
<option name="presentableId" value="LOCAL-00061" />
<option name="project" value="LOCAL" />
<updated>1607896913895</updated>
</task>
<task id="LOCAL-00062" summary="Day 13 (minified version 15)">
<created>1607931708204</created>
<option name="number" value="00062" />
<option name="presentableId" value="LOCAL-00062" />
<option name="project" value="LOCAL" />
<updated>1607931708204</updated>
</task>
<task id="LOCAL-00063" summary="Day 14">
<created>1607936096135</created>
<option name="number" value="00063" />
<option name="presentableId" value="LOCAL-00063" />
<option name="project" value="LOCAL" />
<updated>1607936096135</updated>
</task>
<task id="LOCAL-00064" summary="Day 14 (removed unnecessary string join)">
<created>1607936647098</created>
<option name="number" value="00064" />
<option name="presentableId" value="LOCAL-00064" />
<option name="project" value="LOCAL" />
<updated>1607936647098</updated>
</task>
<task id="LOCAL-00065" summary="Day 14 (glamorized)">
<created>1607939351712</created>
<option name="number" value="00065" />
<option name="presentableId" value="LOCAL-00065" />
<option name="project" value="LOCAL" />
<updated>1607939351712</updated>
</task>
<task id="LOCAL-00066" summary="Day 14 (minified)">
<created>1607944419074</created>
<option name="number" value="00066" />
<option name="presentableId" value="LOCAL-00066" />
<option name="project" value="LOCAL" />
<updated>1607944419074</updated>
</task>
<task id="LOCAL-00067" summary="Day 14 (minified 2)">
<created>1607957518405</created>
<option name="number" value="00067" />
<option name="presentableId" value="LOCAL-00067" />
<option name="project" value="LOCAL" />
<updated>1607957518405</updated>
</task>
<task id="LOCAL-00068" summary="Day 14 (minified 3)">
<created>1607958134929</created>
<option name="number" value="00068" />
<option name="presentableId" value="LOCAL-00068" />
<option name="project" value="LOCAL" />
<updated>1607958134929</updated>
</task>
<task id="LOCAL-00069" summary="Init script">
<created>1608019774782</created>
<option name="number" value="00069" />
<option name="presentableId" value="LOCAL-00069" />
<option name="project" value="LOCAL" />
<updated>1608019774782</updated>
</task>
<task id="LOCAL-00070" summary="Day 15">
<created>1608022044409</created>
<option name="number" value="00070" />
<option name="presentableId" value="LOCAL-00070" />
<option name="project" value="LOCAL" />
<updated>1608022044409</updated>
</task>
<task id="LOCAL-00071" summary="Day 15 (cleanup)">
<created>1608022545942</created>
<option name="number" value="00071" />
<option name="presentableId" value="LOCAL-00071" />
<option name="project" value="LOCAL" />
<updated>1608022545942</updated>
</task>
<task id="LOCAL-00072" summary="Day 15 (refactoring)">
<created>1608063535608</created>
<option name="number" value="00072" />
<option name="presentableId" value="LOCAL-00072" />
<option name="project" value="LOCAL" />
<updated>1608063535609</updated>
</task>
<task id="LOCAL-00073" summary="Day 15 (visualize)">
<created>1608070209232</created>
<option name="number" value="00073" />
<option name="presentableId" value="LOCAL-00073" />
<option name="project" value="LOCAL" />
<updated>1608070209232</updated>
</task>
<task id="LOCAL-00074" summary="Day 16">
<created>1608119199051</created>
<option name="number" value="00074" />
<option name="presentableId" value="LOCAL-00074" />
<option name="project" value="LOCAL" />
<updated>1608119199051</updated>
</task>
<task id="LOCAL-00075" summary="Day 16 (with numpy)">
<created>1608136385778</created>
<option name="number" value="00075" />
<option name="presentableId" value="LOCAL-00075" />
<option name="project" value="LOCAL" />
<updated>1608136385778</updated>
</task>
<task id="LOCAL-00076" summary="Day 15 (visualize)">
<created>1608136409168</created>
<option name="number" value="00076" />
<option name="presentableId" value="LOCAL-00076" />
<option name="project" value="LOCAL" />
<updated>1608136409168</updated>
</task>
<task id="LOCAL-00077" summary="Day 16 (cleanup)">
<created>1608136760527</created>
<option name="number" value="00077" />
<option name="presentableId" value="LOCAL-00077" />
<option name="project" value="LOCAL" />
<updated>1608136760527</updated>
</task>
<task id="LOCAL-00078" summary="Day 16 (removed unused lines)">
<created>1608137306706</created>
<option name="number" value="00078" />
<option name="presentableId" value="LOCAL-00078" />
<option name="project" value="LOCAL" />
<updated>1608137306706</updated>
</task>
<task id="LOCAL-00079" summary="Day 15 (static array length 14s -&gt; 10s)">
<created>1608162197662</created>
<option name="number" value="00079" />
<option name="presentableId" value="LOCAL-00079" />
<option name="project" value="LOCAL" />
<updated>1608162197662</updated>
</task>
<task id="LOCAL-00080" summary="Day 17 (Part 1 / Part 2 not working)">
<created>1608201064255</created>
<option name="number" value="00080" />
<option name="presentableId" value="LOCAL-00080" />
<option name="project" value="LOCAL" />
<updated>1608201064256</updated>
</task>
<task id="LOCAL-00081" summary="Day 17 (Part 2)">
<created>1608202365345</created>
<option name="number" value="00081" />
<option name="presentableId" value="LOCAL-00081" />
<option name="project" value="LOCAL" />
<updated>1608202365345</updated>
</task>
<task id="LOCAL-00082" summary="Day 17 (cleanup)">
<created>1608202766419</created>
<option name="number" value="00082" />
<option name="presentableId" value="LOCAL-00082" />
<option name="project" value="LOCAL" />
<updated>1608202766419</updated>
</task>
<task id="LOCAL-00083" summary="Day 17 (dimension independent)">
<created>1608204531845</created>
<option name="number" value="00083" />
<option name="presentableId" value="LOCAL-00083" />
<option name="project" value="LOCAL" />
<updated>1608204531845</updated>
</task>
<task id="LOCAL-00084" summary="Day 17 (glamorize)">
<created>1608218726312</created>
<option name="number" value="00084" />
<option name="presentableId" value="LOCAL-00084" />
<option name="project" value="LOCAL" />
<updated>1608218726312</updated>
</task>
<task id="LOCAL-00085" summary="Day 17 (minimized part 2)">
<created>1608232855814</created>
<option name="number" value="00085" />
<option name="presentableId" value="LOCAL-00085" />
<option name="project" value="LOCAL" />
<updated>1608232855815</updated>
</task>
<task id="LOCAL-00086" summary="Day 18">
<created>1608296277242</created>
<option name="number" value="00086" />
<option name="presentableId" value="LOCAL-00086" />
<option name="project" value="LOCAL" />
<updated>1608296277242</updated>
</task>
<task id="LOCAL-00087" summary="Day 18 (cleanup part 2)">
<created>1608298084741</created>
<option name="number" value="00087" />
<option name="presentableId" value="LOCAL-00087" />
<option name="project" value="LOCAL" />
<updated>1608298084742</updated>
</task>
<task id="LOCAL-00088" summary="Day 18 (glamorized)">
<created>1608335292380</created>
<option name="number" value="00088" />
<option name="presentableId" value="LOCAL-00088" />
<option name="project" value="LOCAL" />
<updated>1608335292381</updated>
</task>
<task id="LOCAL-00089" summary="Day 1 (glamorized)">
<created>1608335763791</created>
<option name="number" value="00089" />
<option name="presentableId" value="LOCAL-00089" />
<option name="project" value="LOCAL" />
<updated>1608335763791</updated>
</task>
<task id="LOCAL-00090" summary="Day 19">
<created>1608379472674</created>
<option name="number" value="00090" />
<option name="presentableId" value="LOCAL-00090" />
<option name="project" value="LOCAL" />
<updated>1608379472674</updated>
</task>
<task id="LOCAL-00091" summary="Day 19 (cleanup)">
<created>1608379621098</created>
<option name="number" value="00091" />
<option name="presentableId" value="LOCAL-00091" />
<option name="project" value="LOCAL" />
<updated>1608379621098</updated>
</task>
<task id="LOCAL-00092" summary="Day 19 (cleanup and reduce depth for speedup)">
<created>1608380157231</created>
<option name="number" value="00092" />
<option name="presentableId" value="LOCAL-00092" />
<option name="project" value="LOCAL" />
<updated>1608380157231</updated>
</task>
<task id="LOCAL-00093" summary="Day 19 (glamorized)">
<created>1608380385154</created>
<option name="number" value="00093" />
<option name="presentableId" value="LOCAL-00093" />
<option name="project" value="LOCAL" />
<updated>1608380385154</updated>
</task>
<task id="LOCAL-00094" summary="Day 19 (bug fix)">
<created>1608383397325</created>
<option name="number" value="00094" />
<option name="presentableId" value="LOCAL-00094" />
<option name="project" value="LOCAL" />
<updated>1608383397325</updated>
</task>
<option name="localTasksCounter" value="95" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
<option name="oldMeFiltersMigrated" value="true" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="Init script" />
<MESSAGE value="Day 15" />
<MESSAGE value="Day 15 (cleanup)" />
<MESSAGE value="Day 15 (refactoring)" />
<MESSAGE value="Day 16" />
<MESSAGE value="Day 16 (with numpy)" />
<MESSAGE value="Day 15 (visualize)" />
<MESSAGE value="Day 16 (cleanup)" />
<MESSAGE value="Day 16 (removed unused lines)" />
<MESSAGE value="Day 15 (static array length 14s -&gt; 10s)" />
<MESSAGE value="Day 17 (Part 1 / Part 2 not working)" />
<MESSAGE value="Day 17 (Part 2)" />
<MESSAGE value="Day 17 (cleanup)" />
<MESSAGE value="Day 17 (dimension independent)" />
<MESSAGE value="Day 17 (glamorize)" />
<MESSAGE value="Day 17 (minimized part 2)" />
<MESSAGE value="Day 18" />
<MESSAGE value="Day 18 (cleanup part 2)" />
<MESSAGE value="Day 18 (glamorized)" />
<MESSAGE value="Day 1 (glamorized)" />
<MESSAGE value="Day 19" />
<MESSAGE value="Day 19 (cleanup)" />
<MESSAGE value="Day 19 (cleanup and reduce depth for speedup)" />
<MESSAGE value="Day 19 (glamorized)" />
<MESSAGE value="Day 19 (bug fix)" />
<option name="LAST_COMMIT_MESSAGE" value="Day 19 (bug fix)" />
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/python_aoc_2020$part2_v2.coverage" NAME="part2-v2 Coverage Results" MODIFIED="1608137393295" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day16" />
<SUITE FILE_PATH="coverage/python_aoc_2020$online.coverage" NAME="online Coverage Results" MODIFIED="1608118845239" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day16" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part2_minified.coverage" NAME="part2-minified Coverage Results" MODIFIED="1608233116290" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day17" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part1.coverage" NAME="part1 Coverage Results" MODIFIED="1608494626763" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day20" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part2_v2_minified.coverage" NAME="part2-v2-minified Coverage Results" MODIFIED="1607931599143" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day13" />
<SUITE FILE_PATH="coverage/python_aoc_2020$crunchncrisp.coverage" NAME="crunchncrisp Coverage Results" MODIFIED="1607436343175" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day07" />
<SUITE FILE_PATH="coverage/python_aoc_2020$day01_2.coverage" NAME="day01-2 Coverage Results" MODIFIED="1606858411447" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day01" />
<SUITE FILE_PATH="coverage/aoc_2020$day01.coverage" NAME="day01 Coverage Results" MODIFIED="1606855777120" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day01" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part2.coverage" NAME="part2 Coverage Results" MODIFIED="1608383303458" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day19" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part1_minified.coverage" NAME="part1-minified Coverage Results" MODIFIED="1607893882088" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day13" />
<SUITE FILE_PATH="coverage/aoc_2020$day01_2.coverage" NAME="day01-2 Coverage Results" MODIFIED="1606856752752" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day01" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part1__1_.coverage" NAME="part1 (1) Coverage Results" MODIFIED="1607781943237" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day09" />
<SUITE FILE_PATH="coverage/python_aoc_2020$visualize.coverage" NAME="visualize Coverage Results" MODIFIED="1608136317406" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day15" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part1_v2.coverage" NAME="part1-v2 Coverage Results" MODIFIED="1608137373494" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day16" />
<SUITE FILE_PATH="coverage/python_aoc_2020$part2__1_.coverage" NAME="part2 (1) Coverage Results" MODIFIED="1608335573717" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/day01" />
</component>
</project>

View File

@@ -13,12 +13,12 @@ kernel[(1, )*DIMS] = 0
for _ in range(6):
grid = np.pad(grid, pad_width=1)
neighbors = convolve(grid, kernel, mode='same')
neighbors = convolve(grid, kernel, mode='same', method='direct')
set_inactive = np.logical_and(grid == 1, np.floor_divide(neighbors, 2) != 1)
set_active = np.logical_and(grid == 0, neighbors == 3)
grid[set_inactive] = 0
grid[set_active] = 1
a = tuple(slice(np.min(idxs), np.max(idxs) + 1) for idxs in np.where(grid == 0))
a = tuple(slice(np.min(idxs), np.max(idxs) + 1) for idxs in np.where(grid == 1))
grid = grid[a]
print(np.sum(grid))

View File

@@ -13,12 +13,12 @@ kernel[(1, )*DIMS] = 0
for _ in range(6):
grid = np.pad(grid, pad_width=1)
neighbors = convolve(grid, kernel, mode='same')
neighbors = convolve(grid, kernel, mode='same', method='direct')
set_inactive = np.logical_and(grid == 1, np.floor_divide(neighbors, 2) != 1)
set_active = np.logical_and(grid == 0, neighbors == 3)
grid[set_inactive] = 0
grid[set_active] = 1
a = tuple(slice(np.min(idxs), np.max(idxs) + 1) for idxs in np.where(grid == 0))
a = tuple(slice(np.min(idxs), np.max(idxs) + 1) for idxs in np.where(grid == 1))
grid = grid[a]
print(np.sum(grid))

1728
day20/input.txt Normal file

File diff suppressed because it is too large Load Diff

53
day20/part1.py Normal file
View File

@@ -0,0 +1,53 @@
#!/usr/bin/env python3
from collections import defaultdict
from functools import reduce
import numpy as np
lines = (x.strip() for x in open("input.txt"))
rotations = [(t, r) for t in (True, False) for r in range(4)]
tiles = {}
borders = defaultdict(set)
def add_tile(num, tile):
global tiles, borders
tiles[num] = tile
for transpose, rotate in rotations:
view = np.rot90(tile.T if transpose else tile, rotate)
edge = np.packbits(view[0])
edge = edge[0] * 4 + edge[1] // 64
borders[edge].add(num)
for line in lines:
if line.startswith("Tile"):
num = int(line[5:-1])
tile = np.zeros((10, 10), dtype=np.int16)
lnr = 0
elif line == "":
add_tile(num, tile)
else:
a = np.array([(0 if x == '.' else 1) for x in line], dtype=np.int16)
tile[lnr] = a
lnr += 1
add_tile(num, tile)
# every border matches only once
print("sum joints", sum(1 for key, val in borders.items() if len(val) > 1))
print("should joints", (len(tiles)-np.sqrt(len(tiles))) * 2)
print("sum outer", sum(1 for key, val in borders.items() if len(val) == 1))
print("should outer", np.sqrt(len(tiles)) * 4)
print("cnt tiles", len(tiles))
print("multi matches", sum(1 for key, val in borders.items() if len(val) > 2))
# find corners
edges = defaultdict(int)
for key, val in borders.items():
if len(val) == 1:
for item in val:
edges[item] += 1
print(reduce(lambda a, b: a*b, (key for key, val in edges.items() if val == 4), 1))

115
day20/part2.py Normal file
View File

@@ -0,0 +1,115 @@
from collections import defaultdict
from functools import reduce
import numpy as np
from scipy.signal import convolve
lines = (x.strip() for x in open("input.txt"))
rotations = [(t, r) for t in (True, False) for r in range(4)]
tiles = {}
borders = defaultdict(set)
def edge_to_bin(edge):
edge = np.packbits(edge)
return edge[0] * 4 + edge[1] // 64
def add_tile(num, tile):
global tiles, borders
tiles[num] = tile
for transpose, rotate in rotations:
view = np.rot90(tile.T if transpose else tile, rotate)
edge = edge_to_bin(view[0])
borders[edge].add(num)
for line in lines:
if line.startswith("Tile"):
num = int(line[5:-1])
tile = np.zeros((10, 10), dtype=np.int8)
lnr = 0
elif line == "":
add_tile(num, tile)
else:
a = np.array([(0 if x == '.' else 1) for x in line], dtype=np.int8)
tile[lnr] = a
lnr += 1
add_tile(num, tile)
WIDTH = int(np.sqrt(len(tiles)))
# find top left corner
edges = defaultdict(int)
corner = None
for key, val in borders.items():
if len(val) == 1:
for item in val:
edges[item] += 1
for key, val in edges.items():
if val == 4:
corner = key
break
# rotate top left corner
corner_tile = tiles[corner]
joints = []
for x in range(4):
edge = edge_to_bin(corner_tile[0])
corner_tile = np.rot90(corner_tile)
if len(borders[edge]) == 2:
joints.append(edge)
if len(joints) == 2:
break
corner_tile = np.rot90(corner_tile)
# prepare plane
plane = np.zeros(((10-1)*WIDTH+1, (10-1)*WIDTH+1), dtype=np.int8)
plane[:10, :10] = corner_tile
used_tiles = {corner}
# orientate and add tiles to plane
for idx in range(1, len(tiles)):
x, y = (idx % WIDTH) * (10-1), (idx // WIDTH) * (10-1)
next_tile_top = None if y == 0 else borders[edge_to_bin(plane[y, x:x+10])]
next_tile_left = None if x == 0 else borders[edge_to_bin(plane[y:y+10, x].T)]
if next_tile_top is None:
next_tile = next_tile_left
elif next_tile_left is None:
next_tile = next_tile_top
else:
next_tile = next_tile_left.intersection(next_tile_top)
next_tile = next_tile.difference(used_tiles).pop()
used_tiles.add(next_tile)
tile = tiles[next_tile]
for transpose, rotate in rotations:
view = np.rot90(tile.T if transpose else tile, rotate)
if y != 0 and not np.all(np.equal(plane[y, x:x+10], view[0])):
continue
if x != 0 and not np.all(np.equal(plane[y:y+10, x], view[:, 0])):
continue
plane[y:y+10, x:x+10] = view
break
# remove all edges
plane = np.delete(plane, list(range(0, plane.shape[0], 10-1)), axis=0)
plane = np.delete(plane, list(range(0, plane.shape[1], 10-1)), axis=1)
# kernel
#
# ## ## ###
# # # # # #
kernel = np.array([
[0,0,0,0,0 ,0,0,0,0,0 ,0,0,0,0,0 ,0,0,0,1,0],
[1,0,0,0,0 ,1,1,0,0,0 ,0,1,1,0,0 ,0,0,1,1,1],
[0,1,0,0,1 ,0,0,1,0,0 ,1,0,0,1,0 ,0,1,0,0,0]
])
count = np.sum(kernel)
for transpose, rotate in rotations:
view = np.rot90(plane.T if transpose else plane, rotate)
neighbors = convolve(view, kernel, mode='valid')
if np.max(neighbors) == count:
print(len(np.where(view == 1)[0]) - len(np.where(neighbors == count)[0]) * count)

47
day21/input.txt Normal file
View File

@@ -0,0 +1,47 @@
bmhn hcpvz klpx fshdvz kxrz spg fmgxh gnspg pgqxvc nsg vrqbct nvzj pqnlq tphvg rzzs crkvkk fxzh xgtms rjgfr ldkp gggnm kskcfv fkrkk szc mfdv psxvf jpsnjbt cskbmx ppbqpx lqlt bmgtf tstp tlhqvhq tktzx vcck bxdbkvtt tzxcmr mxbs lxxm fdzg jdnrq mmkmt hrv qstvls hxbp mmpphm pdhv mmdh knvg fblzjv qqgjft nqfsk gqzzzp fpk pqjk xgcjxkkm jptrc cjdmk kspj xbt hsxpqftn cjkrc chs qnhmjbz rzhb gsfqhcd jzrjtn jrmr nptr mvkxqh ttmphk nnhl xjgzz (contains fish, shellfish)
fpk hcrbxt vbztx jrmr vrqbct szc hjm jdnrq xjgzz gxtlpx sfdc pqnlq pbt tzxcmr zdmxsgp jbp xjdchp jpsnjbt mdjr tphvg lcvcng kskcfv tlhqvhq jzrjtn cjdmk tktzx vqdpfb fblzjv gqzzzp ctsl gksjpm mpbm pcrmsb qqgjft xrmf cskbmx rzhb mvkxqh hrv ckz mxbs smppjj rjgfr bmhn hcpvz vndglc gcczzsd fxzh tstp xlxknk sdzzhnfc gmblk gnc psxvf hdfqc pzvb ttmphk sbh hlsvmjh xrxrs (contains wheat, nuts)
dkfvl nnhl mpbm djbb pzfmh pqdtkpd mvkxqh cskbmx jbp sfqjtk klhrx fmgxh gqb nptr vbztx fdxgf fkrkk fvgb mhdf fshdvz hqpfl kvdbxp kspj ffpq chs vqdpfb hxpxh tktzx gqzzzp tzxcmr cjdmk jxkn pcrmsb vxchx qnhmjbz hlsvmjh ttmphk tqxcv nsg fxzh fblzjv lqlt bmgtf jrmr bmhn rzzs hcpvz zmzz sbcntv jssvhx tlhqvhq jcjt (contains fish)
gmblk cfjkt hjm nqfsk szc tzxcmr fblzjv lqlt nvql jpsnjbt fxzh gqb vnzdgh gcczzsd qdjfg kspj mhdf nthkh vqdpfb xppzqqz ldkp ppbqpx bmhn ghfxfs qstvls hxpxh pcrmsb bkqj nsg hjlv lxxm fkrkk rzzs vnmbz ffcxn klhrx vbztx zxpnt sfqjtk gnc hrv nnhl chs xlxknk gxtlpx ffrxl cjdmk zdmxsgp fxvcg gxlp kbgcsp fvgb jcjt zbmcz ttmphk nqx jrmr cskbmx pstjn tphvg hpjnl grxfxfr rgbj zgg xslk fshdvz pqnlq hlktbd pqpvvm pqjk hxbp hddxgp rttkb xbt (contains dairy, shellfish, fish)
fpk klpx pgqxvc hcpvz nptr jxkn spg hvpx zzgjdt nvzj gqb pzfmh vxchx qdjfg bmgtf zqb tftlfk jptrc ffrxl kxrz hlsvmjh fxvcg tzxcmr cskbmx vrqbct pdhv zbmcz kvdbxp bmhn xlxknk jbtf grxfxfr hsxpqftn cfjkt mngvb jpsnjbt jrmr hjnnd sbcntv kskcfv klhrx rtqxnnm pstjn cjkrc cjdmk gzks mvkxqh nthkh gxlp vbztx fshdvz hqpfl tkjs fmgxh fdxgf zddcbth lxxm (contains shellfish)
lcvcng zmzz spg hsxpqftn gn kbgcsp nljd klpx cjdmk zddcbth grxfxfr xppzqqz hrrl cskbmx pzvb pgqxvc xlxknk hxpxh jrmr xbt mpbm pqnlq mfdv bmhn tqxcv zdmxsgp gzks tzxcmr nmdcs lxxm hcpvz fbgf gdrj gmpvdl tkrzbv lqlt ghfxfs fdzg hcrbxt tlhqvhq rzzs tftlfk gcczzsd klhrx jxkn crkvkk xgcjxkkm kskcfv jzrjtn fxzh mmpphm djbb gqb mdjr nthkh hlsvmjh hrlzp ctsl cjkrc zqb hpjnl xgtms pqpvvm jbtf (contains dairy, sesame, peanuts)
pdhv zbmcz cjdmk nmdcs tmzmhtb hrv hddxgp xrxrs ldkp tstp mxbs tftlfk bkqj jlzhrn jrmr sfdc mngvb ghfxfs kskcfv gxtlpx mfdv xstrnv tkrzbv mmdh xrmf lqlt fmgxh mbjnfc xlxknk jdnrq tgn lxxm rzzs vndglc qdjfg mvkxqh cfccb bmhn jptrc cskbmx nnhl kbgcsp kspj nvzj fpk gxlp bmgtf vcck zzgjdt hjm tkjs xjgzz pgqxvc xjdchp gcczzsd ctsl pqjk hrlzp tjbk hlktbd hpjnl jxkkxb tzxcmr qstvls nqx (contains nuts)
zddcbth xjdchp jdnrq vqdpfb jrmr ffpq lbxt dzf gxlp mngvb vxchx sdzzhnfc nptr pqjk hqpfl gzks jxkn kxrz bxdbkvtt qcrtcf mmdh zdmxsgp pqpvvm rttkb jbp kkhzrj pbt jlzhrn mpbm pjpshs xgcjxkkm grxfxfr vcck hxbp gsfqhcd vrqbct tktzx szc gn pzfmh zmzz mxbs qdjfg nnhl cskbmx vnzdgh zgg pgqxvc sfqjtk pcrmsb kvlnft tlhqvhq xstrnv tjbk tqxcv xlxknk pdhv tstp xbt fmgxh psxvf dkfvl hcrbxt xppzqqz ppbqpx pqnlq jjb kskcfv fxzh cfccb mvkxqh vbztx gmblk sbh hrrl crkvkk hlktbd bmhn kvdbxp xjgzz nqx cjdmk hmft tkrzbv ckz sbcntv nctnv (contains peanuts, soy, sesame)
grxfxfr gnc mmdh smppjj qqgjft jzrjtn jrmr gmzk sbh hjlv xrmf bpdhjc gdrj hqbn gnspg zddcbth tftlfk pdhv jxkkxb cskbmx djbb fkrkk xjdchp mxbs psxvf qnhmjbz vbztx kxrz tgn lqlt jjb nsg hcpvz vcrpl mmpphm ckz hvpx vcck ppbqpx fdzg nvql dkfvl bxdbkvtt hxbp hcrbxt spg xlxknk fblzjv tjbk tphvg nmdcs nthkh sbcntv zqb sfdc gqzzzp gn fshdvz zdmxsgp lbxt bmhn fxzh tzxcmr mbjnfc xslk jpsnjbt jxrx qdjfg zzgjdt jxkn ttmphk tqxcv jcjt hjm bmgtf pqdtkpd sfqjtk fmgxh kvlnft (contains dairy)
tgn vnzdgh nctnv jpsnjbt xlxknk nqx fxzh lqlt pstjn nptr jcjt jbtf lcvcng cjdmk djbb dkfvl hcpvz hdfqc gxlp tktzx tzxcmr sbcntv jxkkxb kspj lxxm bmgtf zbmcz tphvg qqgjft bmhn qdjfg pqjk xgcjxkkm fkrkk mvkxqh jzrjtn vndglc ppbqpx bcrjgj hlktbd hqpfl rttkb tqxcv cskbmx nj chs fblzjv mbjnfc pjpshs nljd mfdv tlhqvhq jrmr rjgfr (contains peanuts, wheat, fish)
xgtms jssvhx gcczzsd gksjpm sfdc spg gxlp psxvf fdxgf sbh chs cjdmk fxvcg xrmf lcvcng nptr vnmbz cskbmx bmhn pzfmh pqpvvm fxzh hrv pqnlq xppzqqz dkfvl pzvb vcck lbxt kvlnft fpk bxdbkvtt pgqxvc xlxknk xjgzz tkrzbv xgcjxkkm gdrj jrmr qcrtcf pqjk tkjs rtqxnnm fdzg jdnrq cfccb hsxpqftn ttmphk mhdf hlsvmjh tftlfk fmgxh vrqbct mmdh zxpnt xrxrs fblzjv cjkrc rzhb gmpvdl crkvkk gqb qstvls ldkp zgg kxrz kspj tphvg hcpvz jxkkxb (contains peanuts, wheat)
hdfqc tzxcmr jrmr jxrx ttmphk fmgxh gmblk fpk vrqbct xrmf psxvf jbp ldkp pstjn ghfxfs hjm sbcntv ffcxn mpbm bxdbkvtt xlxknk vcrpl sbh rttkb lcvcng fshdvz nmdcs pqjk lxxm qcrtcf bpdhjc tlhqvhq mbjnfc kspj jjb xslk szc dzf fdxgf fxzh tgn xvl vnzdgh cmzpv ckz nvzj fkrkk pjpshs nqfsk fvgb spg hrlzp bmgtf zgg fblzjv jptrc gggnm pgqxvc qdjfg tmzmhtb cskbmx gksjpm pcrmsb pzfmh pdhv xgcjxkkm cjdmk zbmcz zqb jcjt hqpfl nthkh kskcfv rjgfr hqbn pqnlq hlktbd (contains wheat, sesame)
jrmr jxrx hlsvmjh gsfqhcd hvpx gmpvdl lqlt nsg fmgxh jcjt sfqjtk gcczzsd xlxknk fxvcg fdzg lbxt cjkrc xrmf fxzh flvfsz nqfsk fbgf xgcjxkkm xstrnv cfjkt nmdcs jjb sbh dzf ctsl rgbj hrv mmdh hddxgp ffrxl zzgjdt bmhn ffpq vnmbz zqb hxpxh dkfvl vcck vcrpl hjm jxkkxb hsxpqftn jbtf nthkh mhdf gnc tstp bxdbkvtt mfdv qqgjft zbmcz kkhzrj tjbk gksjpm cskbmx tzxcmr rjgfr (contains peanuts, fish)
hdfqc xlxknk hmft gxlp fbgf pqnlq pqjk cjkrc gmpvdl tftlfk jbp nctnv chs hjm tmzmhtb cskbmx klhrx fblzjv gdrj hjlv vbztx mhdf rtqxnnm nsg jdnrq lqlt qdjfg mmkmt dkfvl fmgxh xslk vxchx rgbj fxzh vnmbz vqdpfb jjb mmdh jlzhrn kvlnft qqgjft zbmcz cfjkt pcrmsb hqpfl hlsvmjh tkjs tzxcmr cjdmk zgg xjgzz xgcjxkkm rjgfr jbtf dzf jrmr szc gmzk cmzpv nqx gqzzzp zddcbth tstp nqfsk pjpshs jpsnjbt zzgjdt gcczzsd sfdc gnspg nljd vndglc fkrkk mvkxqh spg xbt mfdv rzhb nj tjbk fshdvz vrqbct gggnm (contains wheat, dairy)
hqpfl hjnnd fdzg dzf knvg cmzpv gnspg sbcntv vcck grxfxfr fmgxh tftlfk rnn psxvf fxzh gksjpm bkqj nvzj vndglc sdzzhnfc nqfsk smppjj hvpx pzfmh hpjnl nnhl klhrx jzrjtn vnzdgh fpk lqlt gnc kvdbxp xjgzz bmhn dkfvl nqx mdjr mbjnfc jrmr sbh qstvls pqjk nvql xjdchp gcczzsd fbgf hlktbd lbxt hjlv cskbmx rzhb pgqxvc nthkh fblzjv ppbqpx xbt ldkp zzgjdt mmdh zqb mpbm gxlp jpsnjbt xrmf lxxm nptr zdmxsgp jssvhx jbp tzxcmr gdrj hlsvmjh ffrxl kxrz jjb bmgtf rjgfr xgtms xstrnv xlxknk (contains fish)
fdxgf fmgxh hddxgp vrqbct mpbm pdhv tzxcmr mmkmt cjdmk mhdf hjm ckz cskbmx klpx cjkrc zzgjdt fblzjv qqgjft pqpvvm fdzg xjdchp rtqxnnm gdrj xlxknk vqdpfb gzks zddcbth fshdvz ffcxn sfqjtk zmzz pzfmh mbjnfc sfdc gqzzzp sbh rttkb qdjfg xstrnv tjbk bmhn kskcfv gmpvdl jrmr rgbj lxxm ffrxl fvgb pstjn (contains nuts)
lbxt vcck bpdhjc xslk szc rnn mxbs jxrx kbgcsp pcrmsb kskcfv nvql flvfsz qcrtcf djbb rjgfr hxpxh mmdh jxkn tjbk klpx ffpq pqdtkpd jrmr xjdchp lxxm nljd qstvls cskbmx hmft zzgjdt bxdbkvtt bmhn ldkp gxtlpx tzxcmr pstjn zxpnt gmzk gn chs pzvb xgtms xlxknk hlsvmjh rzzs pbt tftlfk fxzh kkhzrj cmzpv gdrj fmgxh sfdc hcpvz jxkkxb gxlp nsg xgcjxkkm tkjs nnhl jssvhx jpsnjbt nqfsk sdzzhnfc rttkb qdjfg jdnrq (contains fish, soy, dairy)
tstp spg tftlfk pqdtkpd hrrl hdfqc xjgzz mfdv jxkkxb fxzh hxbp jssvhx bxdbkvtt jzrjtn pzfmh gnspg pqpvvm hlktbd xlxknk gqzzzp vbztx tzxcmr psxvf tlhqvhq nljd chs cskbmx ffpq nthkh flvfsz gmzk bmhn rnn rttkb knvg vnmbz mngvb sbcntv ctsl jrmr gmpvdl zgg fdzg kskcfv ttmphk pbt jptrc jdnrq qqgjft fmgxh nsg gn tktzx nmdcs sbh fvgb xrxrs ffrxl lqlt tqxcv pzvb fshdvz lbxt tmzmhtb vndglc kspj pstjn gsfqhcd hsxpqftn nptr crkvkk xslk (contains fish, sesame)
fbgf cskbmx vcck vcrpl gxlp kskcfv qnhmjbz fshdvz mpbm qcrtcf grxfxfr tzxcmr pqpvvm fxvcg tktzx fkrkk xrmf zmzz ctsl gggnm pgqxvc fpk qdjfg fmgxh cfccb nljd gqb nsg vnmbz kvlnft xlxknk zdmxsgp rttkb cjdmk jjb kspj nmdcs szc vnzdgh xbt zbmcz nthkh gqzzzp vxchx qstvls tqxcv jrmr ckz tlhqvhq lbxt hsxpqftn rgbj fxzh gmpvdl sbh hvpx pstjn vrqbct cfjkt mhdf jcjt (contains wheat)
vqdpfb ctsl pgqxvc hqbn lxxm vnmbz gdrj gnspg fblzjv tkrzbv szc ttmphk zbmcz tphvg vrqbct mbjnfc kxrz xrmf tkjs fkrkk bpdhjc lbxt hjlv zgg nthkh jrmr rgbj cjdmk xgtms bxdbkvtt pjpshs knvg hlsvmjh sfqjtk xlxknk kskcfv fxzh xjdchp mhdf vnzdgh qdjfg ldkp fmgxh tjbk hrlzp nptr ffpq mmdh sfdc jbp klhrx lcvcng gnc cskbmx zddcbth hpjnl qcrtcf rzzs rttkb cfjkt hsxpqftn hrv mvkxqh nj vndglc gggnm hdfqc pzfmh hjm bmhn fxvcg rzhb lqlt nvql nctnv xgcjxkkm (contains fish, wheat)
tkjs vcck pstjn kspj lbxt ctsl hjnnd klpx tmzmhtb nljd hpjnl qdjfg zbmcz ldkp hdfqc nnhl jzrjtn qstvls tjbk rtqxnnm fdxgf xrxrs gn spg qnhmjbz fvgb fbgf hlktbd hmft djbb jbp rzhb chs hvpx tzxcmr cjdmk gggnm gmblk ffrxl zzgjdt hqbn jjb tqxcv xjdchp gksjpm mxbs cskbmx fmgxh hjlv szc fblzjv nj klhrx kxrz nsg gzks ffcxn zdmxsgp bpdhjc jcjt tktzx tphvg cfccb kkhzrj xppzqqz hlsvmjh vrqbct hrv nmdcs bmhn dzf pgqxvc pqjk xlxknk rzzs hrrl jrmr grxfxfr (contains fish, nuts)
jrmr tkrzbv ttmphk cskbmx ldkp gzks pbt mdjr jjb dzf jdnrq tzxcmr smppjj bpdhjc gnc pqnlq gmzk jzrjtn tstp crkvkk grxfxfr gqzzzp cjdmk xstrnv szc mxbs zbmcz mngvb gnspg psxvf rzhb cmzpv qdjfg pstjn pqpvvm fmgxh tftlfk xlxknk zqb hqbn zmzz fxzh fblzjv (contains nuts, wheat, shellfish)
hxbp tstp tftlfk cskbmx hjnnd szc cfccb hsxpqftn xslk fxzh spg jxrx flvfsz fdxgf mpbm lxxm chs cfjkt bmhn jxkkxb grxfxfr jrmr xlxknk gnc rttkb bcrjgj cjdmk vbztx tzxcmr rnn kxrz fbgf xrmf gqb mfdv jpsnjbt xjdchp tmzmhtb gmblk hddxgp hrv hcpvz hjlv kspj bkqj knvg hmft fvgb mvkxqh jcjt vcck (contains peanuts, wheat, fish)
knvg pqpvvm szc nljd mmpphm gksjpm jxkkxb kkhzrj gxtlpx smppjj jcjt lqlt hlktbd xjdchp xrmf tphvg tkjs hqbn bmhn hxpxh gggnm mbjnfc chs xjgzz xstrnv kspj vqdpfb qnhmjbz nthkh fxzh fmgxh pqdtkpd hcrbxt tzxcmr klhrx hlsvmjh fdzg pjpshs nmdcs jrmr cskbmx pstjn ppbqpx fkrkk klpx gqzzzp sdzzhnfc gsfqhcd hcpvz mhdf xlxknk bmgtf vbztx zxpnt hpjnl (contains fish)
rtqxnnm jzrjtn jrmr zmzz psxvf gnspg zgg cjkrc bmhn hjlv dkfvl dzf gxlp nvql jbtf mfdv kspj smppjj kskcfv qstvls gksjpm nj fmgxh jlzhrn nmdcs cjdmk mmpphm xlxknk ctsl nvzj pgqxvc tphvg kbgcsp pjpshs djbb mvkxqh lqlt zzgjdt sdzzhnfc qdjfg vbztx vnzdgh hpjnl klhrx sbcntv zbmcz xstrnv cskbmx rnn jptrc fxvcg ffrxl pqjk vnmbz xrxrs bkqj vqdpfb crkvkk ttmphk szc tmzmhtb vndglc fblzjv pqpvvm xppzqqz qqgjft tzxcmr gmzk lbxt (contains nuts, peanuts)
xjgzz bcrjgj cjkrc hcpvz bmhn psxvf tktzx gn jbp rzzs ckz kxrz rjgfr hrlzp nsg fxzh xbt tftlfk xlxknk jrmr jxrx kbgcsp hcrbxt cjdmk jxkkxb hmft ppbqpx pqdtkpd zgg vcck chs fmgxh xgcjxkkm jcjt gnspg jlzhrn fdxgf hxpxh vbztx zxpnt cmzpv hvpx qnhmjbz ffrxl flvfsz ldkp qcrtcf xgtms cskbmx qqgjft hrrl zqb fpk pqpvvm gxlp (contains sesame, soy)
xlxknk hqpfl mdjr tzxcmr xppzqqz fxzh ffrxl hdfqc vrqbct jptrc pbt jssvhx hsxpqftn jxkn rnn mngvb bmhn cjdmk zdmxsgp hmft hxbp mmpphm ldkp nvql klpx qqgjft spg tlhqvhq zgg fvgb gxtlpx fshdvz zbmcz pstjn nqx gxlp pcrmsb lqlt mmkmt hjlv bxdbkvtt gnspg jpsnjbt jrmr kkhzrj cfjkt jdnrq fmgxh rjgfr pgqxvc tjbk szc (contains soy, sesame, shellfish)
rtqxnnm xlxknk jcjt vrqbct smppjj pqjk gnc zqb gmpvdl kbgcsp zxpnt ffrxl kskcfv jjb gmzk lqlt mmkmt szc tzxcmr mxbs zgg pstjn vxchx lbxt tftlfk fxvcg mvkxqh vcrpl bmhn mdjr nvql sbh xrmf mpbm ffpq hxbp tkrzbv jbtf kxrz xjgzz fxzh zbmcz cmzpv hjlv hcrbxt sfdc hrlzp xppzqqz flvfsz dkfvl jrmr mmdh cskbmx zddcbth jxkn lcvcng gqb mhdf cjdmk hpjnl (contains shellfish, dairy)
hqpfl vbztx hrrl cmzpv jptrc mbjnfc fkrkk pqdtkpd nthkh kskcfv cjdmk lxxm nmdcs mpbm gnc mmdh klhrx ghfxfs gcczzsd hcrbxt pzvb gmblk kbgcsp lcvcng vcck xppzqqz lqlt jrmr hjlv rttkb pqnlq fxvcg ffcxn mxbs kvlnft xjgzz tzxcmr kvdbxp bmhn hqbn zddcbth sbh bkqj klpx ldkp zmzz jpsnjbt pqpvvm fmgxh mfdv tkrzbv sbcntv gn tkjs cskbmx jdnrq xgtms nj hrv smppjj tjbk mngvb gxlp xlxknk xgcjxkkm kxrz xrmf hdfqc tqxcv cjkrc sfdc szc jzrjtn (contains soy)
xrxrs kvdbxp jlzhrn klhrx jjb jssvhx tftlfk vbztx tkrzbv qnhmjbz zddcbth kbgcsp cjkrc rjgfr hlsvmjh xvl flvfsz lcvcng jrmr vqdpfb szc gcczzsd pjpshs cfjkt rzhb tzxcmr jxkn fblzjv lqlt xppzqqz jcjt nctnv vrqbct xgtms nptr gqzzzp mdjr vcck kxrz psxvf fxzh hcrbxt hddxgp ctsl sfqjtk bxdbkvtt fkrkk mhdf rgbj mngvb xlxknk nvzj xbt rtqxnnm chs rnn cskbmx sbh xstrnv mpbm pqnlq hjnnd tgn hrlzp gksjpm nvql xjgzz vndglc fpk cjdmk qqgjft fdxgf fvgb rttkb fshdvz bmhn (contains sesame, fish, nuts)
lxxm mmdh gxtlpx dzf xstrnv gsfqhcd jpsnjbt jbp jjb lbxt cskbmx rzzs bpdhjc fshdvz gnc gzks jxkkxb nljd mdjr hxbp zdmxsgp hrlzp cfjkt tkjs jssvhx pqjk lcvcng cjdmk chs lqlt kspj bmhn gmzk hdfqc hlktbd tjbk gdrj gxlp szc crkvkk gmblk rgbj xlxknk ctsl zxpnt zgg jxkn pqnlq gksjpm tmzmhtb hpjnl tqxcv nvzj ghfxfs rzhb gn jrmr vnzdgh zddcbth hrv hrrl nctnv fxzh gnspg xrxrs fmgxh mngvb xgcjxkkm fblzjv vbztx (contains peanuts)
psxvf dzf pqpvvm mmdh pstjn nnhl gcczzsd tlhqvhq jxrx vcck tstp hqpfl rnn hxbp cfccb xlxknk hsxpqftn xrmf nljd gxtlpx gn fmgxh cjdmk tjbk jjb gggnm jrmr mfdv bxdbkvtt lbxt gnspg nqfsk tkrzbv kbgcsp pqjk bmgtf cskbmx zmzz pjpshs gzks tzxcmr fxzh hjnnd grxfxfr vqdpfb tgn gsfqhcd xvl hvpx (contains wheat)
ldkp djbb cjdmk pqpvvm pgqxvc jptrc bxdbkvtt pqdtkpd fxzh lxxm nj mngvb zxpnt cmzpv pqjk jbp vnzdgh pstjn crkvkk sfdc rtqxnnm kbgcsp ffpq nmdcs fxvcg jzrjtn gdrj kxrz sdzzhnfc nvql cskbmx jrmr xstrnv lbxt vnmbz tqxcv xgtms gggnm fmgxh rzzs fdzg xppzqqz xvl nctnv nsg qstvls jlzhrn ffcxn kspj kvdbxp rjgfr vqdpfb bcrjgj gcczzsd hsxpqftn pzvb bmhn chs mpbm pqnlq hddxgp tzxcmr gmzk mfdv tstp jxkn hrrl gmblk ghfxfs pzfmh bmgtf tkjs gksjpm (contains wheat, sesame)
mhdf tmzmhtb chs tzxcmr zddcbth pgqxvc gzks vqdpfb qstvls pstjn nctnv xppzqqz bmhn tftlfk tkjs hjm fvgb nj fmgxh tlhqvhq gnspg zxpnt xrxrs flvfsz cjdmk kvdbxp rnn knvg jbp crkvkk hrrl mvkxqh bcrjgj vcck jzrjtn zdmxsgp mmkmt cfjkt kspj gnc xgcjxkkm tkrzbv xjdchp jrmr lbxt hsxpqftn nljd vnmbz xlxknk tjbk cjkrc hrlzp pzvb cskbmx mmdh kbgcsp smppjj klhrx fpk nqfsk mngvb nsg (contains soy)
spg nsg gdrj tgn qdjfg rgbj nctnv nvzj ctsl zmzz qstvls mfdv kvlnft vcck tzxcmr tmzmhtb hlktbd mhdf gmzk tktzx vcrpl grxfxfr hsxpqftn pzvb kspj nqx hcrbxt fxzh nvql mmpphm vnmbz jlzhrn cjdmk ppbqpx hrrl bxdbkvtt psxvf fmgxh tftlfk jptrc fpk tkrzbv tjbk nptr pcrmsb gxlp cskbmx rjgfr gn nmdcs xstrnv jxkkxb xlxknk fdxgf lbxt gzks gksjpm hdfqc hxpxh jdnrq xppzqqz nthkh bmhn fkrkk mmdh cfjkt (contains nuts, soy)
nvql fshdvz rzzs fblzjv jrmr fmgxh gxlp fxzh cskbmx rtqxnnm vqdpfb mhdf pzfmh xppzqqz rgbj ldkp xvl grxfxfr nsg hmft lbxt hlsvmjh gqb rzhb bpdhjc nnhl qnhmjbz cfjkt bmhn ffrxl sdzzhnfc gn mvkxqh gmpvdl pstjn pcrmsb jxkkxb hqpfl gzks gksjpm cjdmk ghfxfs dzf nqx tgn tzxcmr hjnnd xrxrs xgcjxkkm zbmcz jzrjtn (contains fish)
tqxcv pgqxvc hxpxh vcrpl gn mbjnfc fmgxh gmpvdl gxtlpx hjm qnhmjbz nvql klhrx cjdmk bxdbkvtt vcck sdzzhnfc bpdhjc pzfmh jrmr tkrzbv cfjkt qdjfg nctnv rgbj nqx hmft sfdc fdxgf fxzh cskbmx crkvkk dkfvl nj mmpphm rnn hddxgp kbgcsp xrmf rtqxnnm hjnnd vqdpfb gnc jlzhrn pqpvvm jzrjtn hqbn gcczzsd lxxm pqjk hqpfl hcpvz jbp pjpshs tphvg rjgfr mngvb zxpnt tzxcmr gxlp fkrkk ctsl bmhn vnmbz hjlv mvkxqh (contains soy, wheat)
qqgjft xvl jlzhrn pstjn klhrx tstp zdmxsgp gksjpm vbztx cskbmx fblzjv jrmr szc nljd zqb gmpvdl sbh mngvb tjbk klpx cfccb ffrxl nctnv fvgb hddxgp gzks jzrjtn tgn dzf mmkmt zgg zzgjdt gmblk jdnrq rzzs cmzpv zmzz sbcntv nqx hdfqc jssvhx rttkb nvql jxrx xslk hcpvz pqjk hsxpqftn mmdh tftlfk pbt hpjnl pdhv nj rjgfr gmzk jcjt nsg spg gdrj cfjkt xbt cjdmk xjgzz zxpnt hmft hlktbd hqpfl tzxcmr jxkn xlxknk lbxt mhdf pzvb tkjs pzfmh fmgxh hrrl crkvkk fpk fshdvz fxzh mbjnfc gnspg mxbs xgcjxkkm pqpvvm vqdpfb ffcxn ffpq (contains fish, shellfish)
nmdcs lbxt rtqxnnm kspj xlxknk dkfvl bmhn jjb sfdc xbt bpdhjc fkrkk pcrmsb bmgtf qdjfg qcrtcf crkvkk jdnrq smppjj nvzj nj jxrx tzxcmr vqdpfb sdzzhnfc fmgxh gksjpm gmpvdl ffcxn ttmphk sbcntv bxdbkvtt hqpfl cjdmk mvkxqh ldkp jxkn gqzzzp cskbmx jrmr gggnm fdxgf ffpq ghfxfs flvfsz nqfsk mbjnfc xstrnv jbp rnn zzgjdt nthkh hqbn fdzg (contains sesame, dairy)
ldkp nj zzgjdt sdzzhnfc hxpxh nvzj nvql nsg pqdtkpd tzxcmr vrqbct rgbj gxlp lbxt gqzzzp fvgb xlxknk sbh pcrmsb mmdh rjgfr gnspg jrmr xslk knvg zddcbth grxfxfr tjbk qdjfg jxkn zbmcz tmzmhtb fmgxh xgtms gxtlpx lcvcng spg zdmxsgp ffpq kspj hsxpqftn chs pjpshs gzks jpsnjbt mhdf ghfxfs tphvg sfqjtk bmgtf jbp tstp hqbn zqb mngvb hjm cjdmk tktzx cskbmx hmft hjlv nqx kskcfv fdxgf vqdpfb bpdhjc jptrc crkvkk djbb gmpvdl klpx fxzh gmblk gn fblzjv (contains shellfish, nuts, dairy)
flvfsz nnhl hxpxh qnhmjbz gqzzzp gsfqhcd knvg lxxm hjnnd jdnrq zgg kbgcsp nsg vndglc cmzpv zbmcz vrqbct ckz pqnlq cskbmx tftlfk xvl hqbn jssvhx lbxt hrv tzxcmr hpjnl sdzzhnfc rttkb pjpshs sbh fshdvz ffpq pqpvvm gxtlpx kskcfv fmgxh bpdhjc jlzhrn xrxrs psxvf zzgjdt hxbp cfccb nptr xgcjxkkm hcrbxt xslk cjdmk gnspg jrmr xlxknk bmhn mpbm hmft jxkkxb lcvcng tmzmhtb mmpphm xstrnv pzfmh (contains nuts)
tgn psxvf pzvb nqx fxvcg sbcntv cskbmx hxpxh hdfqc qdjfg cfjkt nqfsk ckz zdmxsgp bxdbkvtt ldkp vndglc rjgfr fvgb gxlp gnc fbgf zgg mpbm ctsl rtqxnnm jzrjtn gksjpm xjgzz jssvhx tjbk ghfxfs mdjr xlxknk pstjn cjdmk hxbp sfdc jrmr jcjt fxzh xslk jpsnjbt bmgtf mngvb qnhmjbz jjb qstvls nljd pqnlq vbztx pqdtkpd kbgcsp tkjs bmhn gzks jlzhrn hmft gmpvdl hjnnd lcvcng mvkxqh fmgxh knvg zxpnt tkrzbv mmkmt kspj (contains dairy, nuts)
bmhn rjgfr gdrj mmpphm nj fvgb pqjk cfjkt fxzh hvpx xjdchp cjkrc gnc sfqjtk pqpvvm tmzmhtb vcrpl pdhv gsfqhcd ffcxn xlxknk hjm qqgjft sbcntv nvzj bxdbkvtt vcck fpk kvdbxp tftlfk tjbk rttkb kskcfv fkrkk zzgjdt hjnnd hpjnl bmgtf gxtlpx xrmf hqpfl hmft tlhqvhq jrmr cfccb pgqxvc cskbmx tzxcmr mhdf cjdmk nnhl gmblk (contains wheat, peanuts, sesame)
zmzz chs xlxknk pbt jbp gsfqhcd cskbmx lbxt gggnm nqfsk bmhn zbmcz vcrpl jrmr hsxpqftn sdzzhnfc nmdcs hcrbxt gmzk gmblk fmgxh jxkkxb fpk gdrj gxlp cfccb sbcntv hxpxh zddcbth vnmbz pqnlq xrxrs crkvkk xvl mmdh xppzqqz gcczzsd ldkp xstrnv jssvhx kspj qqgjft bcrjgj zdmxsgp fvgb cfjkt fdxgf xbt kvlnft hjnnd bxdbkvtt hcpvz hmft tzxcmr fxzh tkrzbv gnc rzhb mmkmt gmpvdl (contains shellfish, fish, soy)
vnzdgh fvgb nptr hjnnd zdmxsgp mmdh fxzh nthkh xlxknk tzxcmr sbcntv vcck nvzj gmblk grxfxfr bmhn chs qqgjft xstrnv tphvg mvkxqh djbb qcrtcf mmkmt jcjt lqlt hlktbd xjgzz tjbk hvpx fblzjv vxchx jzrjtn kbgcsp xgcjxkkm nqx pqdtkpd vcrpl spg pstjn ffcxn hrrl cjdmk jjb cskbmx crkvkk gqb hqbn hrv zgg fmgxh jxkn (contains peanuts)
tjbk nqfsk cjdmk xrmf cmzpv tstp fmgxh gnc bmgtf kskcfv jcjt ghfxfs jxkn mxbs gksjpm gggnm tftlfk chs lxxm cskbmx hdfqc qstvls gsfqhcd fshdvz gn hjlv tkrzbv hlktbd fxzh vcck bxdbkvtt nsg hrrl qdjfg pqnlq qcrtcf sfqjtk sfdc nvql tmzmhtb gqb bmhn jbp pjpshs xlxknk dkfvl gxlp jrmr kvlnft klhrx rjgfr spg pzfmh nj hxbp pqdtkpd jjb vbztx (contains peanuts, dairy, soy)
hxbp sbh kspj mmkmt mvkxqh mpbm tzxcmr crkvkk mdjr zdmxsgp qnhmjbz gmblk hsxpqftn mmpphm xstrnv mmdh jzrjtn gksjpm zqb nptr szc cskbmx gmzk fxzh jxkn nljd mngvb lqlt kbgcsp bcrjgj cjdmk tftlfk kxrz hdfqc tgn nj ckz vndglc jptrc bmgtf vqdpfb chs xgcjxkkm gqzzzp fshdvz hcpvz mfdv nqfsk smppjj hqbn sbcntv fpk xjdchp gnc qcrtcf ctsl mhdf mbjnfc fmgxh mxbs pqpvvm gqb cjkrc sfdc hqpfl bmhn zgg jrmr xvl (contains fish, shellfish)

25
day21/part1.py Normal file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/env python3
import re
from collections import defaultdict
lines = (x.strip() for x in open("input.txt"))
REGEX = re.compile(r"((?:[a-z]+ )+)\(contains (.*)\)")
possible_ingredients = dict()
count = defaultdict(int)
for line in lines:
ingredients, allergens = REGEX.match(line).groups()
ingredients = set(ingredients.strip().split())
for ing in ingredients:
count[ing] += 1
allergens = allergens.strip().split(", ")
for allergen in allergens:
if allergen in possible_ingredients:
possible_ingredients[allergen].intersection_update(ingredients)
else:
possible_ingredients[allergen] = set(ingredients)
valids = set.union(*possible_ingredients.values())
print(sum(v for k, v in count.items() if k not in valids))

36
day21/part2.py Normal file
View File

@@ -0,0 +1,36 @@
#!/usr/bin/env python3
import re
from collections import defaultdict
lines = (x.strip() for x in open("input.txt"))
REGEX = re.compile(r"((?:[a-z]+ )+)\(contains (.*)\)")
possible_ingredients = dict()
count = defaultdict(int)
for line in lines:
ingredients, allergens = REGEX.match(line).groups()
ingredients = set(ingredients.strip().split())
for ing in ingredients:
count[ing] += 1
allergens = allergens.strip().split(", ")
for allergen in allergens:
if allergen in possible_ingredients:
possible_ingredients[allergen].intersection_update(ingredients)
else:
possible_ingredients[allergen] = set(ingredients)
valids = set.union(*possible_ingredients.values())
done = dict()
while len(possible_ingredients):
for allergen, ingredients in possible_ingredients.copy().items():
if len(ingredients) == 1:
ing = ingredients.pop()
done[allergen] = ing
possible_ingredients.pop(allergen)
for ings in possible_ingredients.values():
ings.discard(ing)
print(",".join(done[x] for x in sorted(done.keys())))

53
day22/input.txt Normal file
View File

@@ -0,0 +1,53 @@
Player 1:
44
47
29
31
10
40
50
27
35
30
38
11
14
9
42
1
26
24
6
13
8
15
21
18
4
Player 2:
17
22
28
34
32
23
3
19
36
12
45
37
46
39
49
43
25
33
2
41
48
7
5
16
20

23
day22/part1.py Normal file
View File

@@ -0,0 +1,23 @@
#!/usr/bin/env python3
lines = (x.strip() for x in open("input.txt"))
stats = [[], []]
player2 = False
for line in lines:
if line.startswith("Player"):
continue
elif line == "":
player2 = True
else:
stats[1 if player2 else 0].append(int(line))
while all(len(x) > 0 for x in stats):
a, b = stats[0].pop(0), stats[1].pop(0)
if a > b:
stats[0].extend((a, b))
else:
stats[1].extend((b, a))
print(list(map(lambda x: sum(i*v for i, v in zip(x, range(len(x), 0, -1))), stats)))

35
day22/part2.py Normal file
View File

@@ -0,0 +1,35 @@
#!/usr/bin/env python3
lines = (x.strip() for x in open("input.txt"))
init_stats = [[], []]
player2 = False
for line in lines:
if line.startswith("Player"):
continue
elif line == "":
player2 = True
else:
init_stats[1 if player2 else 0].append(int(line))
def play_game(stats):
done = set()
while all(len(x) > 0 for x in stats):
state = (*stats[0], "+", *stats[1])
if state in done:
return True, state
done.add(state)
a, b = stats[0].pop(0), stats[1].pop(0)
if len(stats[0]) >= a and len(stats[1]) >= b:
winner = play_game([stats[0][:a], stats[1][:b]])[0]
else:
winner = a > b
if winner:
stats[0].extend((a, b))
else:
stats[1].extend((b, a))
return len(stats[0]) > 0, stats
winner, out_stats = play_game(init_stats)
print(list(map(lambda x: sum(i*v for i, v in zip(x, range(len(x), 0, -1))), out_stats))[0 if winner else 1])

1
day23/input.txt Normal file
View File

@@ -0,0 +1 @@
952316487

19
day23/part1.py Normal file
View File

@@ -0,0 +1,19 @@
#!/usr/bin/env python3
from functools import reduce
from tqdm import tqdm
num = [list(map(int, (char for char in x.strip()))) for x in open("input.txt")][0]
for _ in tqdm(range(100)):
destination = num[0]
while True:
destination -= 1
if destination == 0:
destination = 9
if not destination in num[1:4]:
break
pos = num.index(destination)
num = num[4:pos+1] + num[1:4] + num[pos+1:] + num[0:1]
pos = num.index(1)
print(reduce(lambda a, b: 10*a+b, num[pos+1:] + num[:pos], 0))

52
day23/part2.py Normal file
View File

@@ -0,0 +1,52 @@
#!/usr/bin/env python3
from tqdm import tqdm
class Node:
value = None
next = None
def __init__(self, value, next):
self.value = value
self.next = next
num = [list(map(int, (char for char in x.strip()))) for x in open("input.txt")][0]
num = num + list(range(len(num)+1, 1000000+1))
MAX = len(num)
nodes = dict()
nodes[num[-1]] = curr = last = Node(num[-1], None)
for n in num[-2::-1]:
nodes[n] = curr = Node(n, curr)
last.next = curr
for _ in tqdm(range(10000000)):
pickups = []
lp = curr
for j in range(3):
lp = lp.next
pickups.append(lp.value)
ap = lp.next
destination = curr.value
while True:
destination -= 1
if destination == 0:
destination = MAX
if destination not in pickups:
break
dst = nodes[destination]
lp.next = dst.next
dst.next = curr.next
curr.next = ap
curr = curr.next
while curr.value != 1:
curr = curr.next
curr = curr.next
res = curr.value
curr = curr.next
res *= curr.value
print(res)

424
day24/input.txt Normal file
View File

@@ -0,0 +1,424 @@
swnenewnenenwneneeseseenwwnesenenenenene
neeewseswneewwnwsewwwsewwnwwsw
eewswwnwnwwnwwnwnwwnwnwnwnwnwswnw
nwwnwnwwnwenwnwnwnwwewsewnwnwwnww
senweeswswnwnesenwnweneeenenweeesw
neenenenewnenenenenenenwswnenene
sewneeewswneneneeenewneneneenee
seesenwsenwwsenwswswseseeneseswseswsese
ewewswswwwsewnwnwswsewww
nwnenwwwwwwwneesenwswnwwwwwsw
wnwnwsesenwnwsenwnwnwnwnwnewnenwnwnwwnwnw
nwnwnwnwenwwwnwnwnwewnwenwnwswnwnwsenw
swewsesenwsenwsesesenesweswneneese
swwwwwwwwswwwwswnwweww
nenweneesweenweseeneeenwswseeene
wsenwneseeewswswswseswswseswswseswse
sewnewwwsewwwwwwswnewnewwwww
eneesweewsweeeeenweeeenww
eswswswseswswswnwwswnwswswwswswswswsw
wnwwwnewsenwwwwnwwwsewwwnesew
nwnenwnwnwnwwnwsenwwnwnwnenwsenwnwnenwnw
swwneswwseswswwnwswneswwwewneswsww
swsweswneswwnwseseswnweswewswswswswsw
nwwsenwwwnwnwenwnwwnwnwwenwnwnww
senwnenwneenenewnenwnwnwnwwwnwnwsenw
eneeeesweneenenweneeeeewnee
eswneenenwswnesenwnwnww
wesenweweweseswnwswsenwneswwwswnw
wseenenenenenenewne
nwnwnwswnwnwwnwnwenenwnenesenwnwwnwne
nenenenenwneneeeeswe
neswswwswseswswnwswswswswswneswswwswswesw
enewsenenenenesenwseneneenenweneene
enwneeeeswneeenenene
newnewnenenenenenenenwnwwsenenenweese
weenenwneseneeeeneeenesweeene
nenwnenwnwnenwnwnweenenenwnenwneneswsw
seseeseenwseseseeseenesesesenweeew
seswnewswsenwseswwnwseseseseesesesenenw
eeeeeeeseeeseweeseee
neneweswwswswwseswwswswswwswswswsw
swswswswneswsewswswswseswesweseswnwsesew
eseseseseseswneswswnwsewswnwneswsewse
swswswneswswsewswswswne
sesesewseseeseswnwseseseseseseenwsesw
sesesesewseseesesesesesenwese
swnweseswswsenenenenwwnenewnwnwsenwenw
neseneneswneeneneeneenwneenenesewnw
nwwnesenenenenenwneneseswnenwneswneenenwnw
nwnwnwnwenwwswnwnwnenwnwnwnwswnwnwnwne
senewswswswwwww
wwswwswwwwnwwswneenewesewwswe
wwwswwneswseswsenewswswwneswswneesw
nwswewneneeeenwneeeeneswswnweeswe
swnenenenwnenwnwewwwsweneesewne
nwswwswneswswwneeseseeswswswseswswsw
seseswseneeseseesese
neeeeweeneeeeeenewsweenene
nenwnwnwnenwnwnwnwwsenenwenwnenw
nweesesewneeeneenwwneesweswenese
eenwsewenwswnwnwsewenenweneewswswsw
sesesesewsenwsenwsene
eeesewseenwwseeseseneeeneesee
wwwswswswwswswneenwswwwseswwwnw
nenenewnenesenenwseeseswnwneswnenwnenese
ewewneneseeseewnweneswneeswnee
seesenewseesesesese
sewnwneseseenenwwwnenenwnwnwsenwsenwne
enesesesenwswseseswswsesesesesesesesese
eseeeewneeeeweseeeeee
eeeneeneeeenwseeeeeee
sesesenwnweseeneneseseswnewseseseseseswse
weeseeeneeeeeenweswneneneenw
nwewnwseseseseseswseseneeseswsesewsesee
wwnwnwnwewwnwnwnwnwwnwnwnenwwsenw
enwsesesenwseneswewnesewneseenwewew
nwenwnwnwwswnwsenwenenwnwnwnenwwnwnwsw
wnwwnwnenwwnwnwnwnwnwesewnwwenwsw
sewseswneenwnwesesenwseeswsesesesese
weswnwnwnwnwwsewnwnwwnewnwww
nwwwwnwwwwwnwewnwewswnwwwnw
wwwwnwwnwwwwsenwnewwwwswwew
seswnewneswsenwswswseseswwneneesewne
newseswnwwwwwwwnewswswwwwsew
nenwnenenwseneneneswnwenwnwnenw
enwnwswneenewswse
eseswnwsesenwsesenwseseweenwseseswse
wewsenesesenewsewene
eeswseewsenwsesenwswnenw
swswneswswswneswsewswweswwswswswswsw
wswswnwseneeesweesesenwnwnwnwsenwsewse
ewenenewseeeeneneeenwswneneneee
seeeseeseeseneseesesewseesewwsene
swsweswswwswseswswnwswweeseswswswswnw
nwnwnenenenenwsewnenesenenenenenesenwne
neneseseneeewnenewseenwnwnenenwnene
swsenwseweesesenwnweeweewee
weseeeneeeeeneneeneeeneswee
nwnwnwnwneswnenwwswnwnwnwnwnwnwnww
nenweneswnenwnwnwne
nenweneeneswnewswswnwnenesewenenenwnw
swsweeswnwnwwsesesw
nenenewnenenenenenenenenenwnewnenesenwse
neswwwwswewwswwswswsewwwneww
nwnenenenenenesenenwneeneneneneswnewne
swwwnwnwwnwwwwnwnwewnwww
wwswwewwwsewswswwswwsewenenesww
newseseneeneswnenwnenwseweenenwene
swswwwwswswwwnenwwwwewsewswswnw
nwnwnwnwenwnwnwnwseeswnenwnwwnwnwnesw
swnwnewneewswwswnwenwswwnwnwwwnew
seneswsewswseswsenwnewswwwnwwswnesww
sewwwnwnesenwwwwwnewwwwnww
nenenenwseswnwnenenwnw
wwswnwswwwwnwwwewewseswwww
neneneeneneswseneeswnewneeeneeenenene
wsewwwswnewnwnwewwwnwswwnwwnww
nwneewneeneneeneeswneeneneenenee
neswnwseeswneneswsewswsw
eswswsewswswnwswnweswnwneswsesweesw
nesewnenenenenwneneseneneneneneneewne
nwnwnwnwnwnwnwswnewwwswne
swneneenwwswesenenwwnesewswnewwswswnw
swnwwwnwnwnwnesenwnwnwwsenwnwwnwnwnw
seseneseseneseswseseswseswswsesese
swnwswenenenweee
seseseeseesewseseswseseseswsesenesww
swseesesesewneseswswnwswswswnenenwnese
seenenwswnenesewneswneswneewneweneene
seeweeweneeeneneenweswweww
neswwswswswnwswswnwnenwsesesweewnene
eenwwneeswseenweeeeeswewnew
eweenweseeeseeewseenwseneswe
ewwwwewnwsewwwwwwswwwenww
swnewneeneneenenwnenwnenenenenenenwnw
sewewswswwnwwwwwenwnewwswenw
nwnwnenwnwnwswnwsenwseneneenwswswnwnenw
seeseseeesewnwseseeeneseeewsese
nenewneneneneneenwnenenwnenenw
seseneswswswsweswswswsenesewseswswsesw
newwwswwnewnwwwnwsewwwseeswne
neenwnwnenenenenenesewnwne
swnenewwsenenenwnenwweseseswnesesww
wwwwnweewwwnwnw
swneswwswewwswswwswseswneseww
sewseseseseseseseesenee
swsewnwwwneswswseswswwnewsewswswswwsw
wneseewewnwsweswewnwnwwnwswsew
swsesewswneseenwseswsesweswswseswnwsw
nenwenwnwwnenwnwne
nwnwnwnwsenenenenenwnwneswnwswnenwnwnene
sewwnwwwneswswenwwswwswsweseswse
neeneseneeswneswneneenenenenenwnesenwnw
swswnwswswswwswswswswseswswswseneswswsw
eeeeneeeeeneswesweneeeee
swswseeswnwnwswswswswswseswswwsweswsww
nwnwnenwnwenwnenwnwnwnwnwnwnwsw
swsenwwseseesenwsewsenweseseseseseswne
eewwswswswswswsweswenwneweswswnw
neeeneneseeeneswneeneewnwneeeee
swwsweneswneswewwsenewswswwesesewnw
swweeeseesenwsesesweseesenwnwee
nwewnwnwnwseswnwnwnwnwwnwwenwnwwnwnesw
eeeeeeeeeseeeesesenwe
neeneneswsenenewnenwwnwseswneneeenwnene
eseeeeeewenwse
eeeneesweeeeweeesewneeeee
swswsweswswswswswsesenwsw
wwswwwwwsewwwwseswnewwwnewsw
eswnesenweswewenenwnesweeeeene
nwwswnwsweeweeenewneneneneneneswnese
nweenwenwnwneswnenwnwnwnwswswswnwenwnwnw
neswneneneenwnenenene
wwwwwswwwwwswwnesw
wwwsewnwnwwnwwnwwwwweewwwsw
nwwnwnwnewewwwwnwwnwwwswnww
swseswswsewswsweneswseswswwnwsesenesesesw
nwenesenenewnwnwnenwneswseneswnenenenene
neneeneseneneenweeeneswnw
swnwewseswswwnewswswswwweeswswse
swseswswwneswswswswswswswswswswseneswsw
wswnwseswnwneswwnewnenweesw
nwnwwnwnenwnesenwnwwnwnwnwenwsenenenw
swneswswnwseseseseswnew
wswsweswseswswseswswswswswsw
neenenenenwneneneeenenenwsewsenenenene
weswswswwswsewwsweneswseswwswnesw
wnwnwnwwswnewwwwwesewneww
nweneenenenesenwseneeeee
sewseesesesesesewneewsee
eseseseseesewseeseneesesese
eeweeseneenwneweeeseeeeseene
swwwwnenewswwswsenwwswew
swwswswwwswnwwswsenwseswnwweesww
seneneneneneneweswnenenenewnwne
nwsewwenwewsewwnwswnwwnw
weneneneneswsweweseeeswseseeew
neseswseseswseswseseswsesewsewseseene
nenwwnwsenwsenwnwswnwsenwnwnwnenwesw
eeswsweeenwseneeeeeeenenwewe
enweeeeenweeeeeeeseseesesw
eseswseseseseneseseseswswneswsesewswsenw
nwnwnwnwnwwnwnwswnwewnweenwnwnwnwnww
nwwwnwswwnwnwwnewnww
enwsesenenwsenwnwnwnenwswswnwnewnwnwenw
nwnwnwswnenwnwnwnwnenenenenwnwnw
swwnwnwenwnenwwwwwwneswewnwwsw
wswwwswewswswwwwwswswswwe
wswwesesewswwnwwwwnwnewwswwwsw
esewnwesenwsesesweseeeeswenwswnw
enenwnenenenenenewenenenesweeenene
swneeeeeeewneswenwsenwenwsenwsw
nenwnwnenwenwnwnwnwnwnwsenwnwnwnwnww
ewswwseneseswswswswwnewnwnwswswne
swseseseeeseseseseesenwwseseseswsenese
seeeeseweseseseneswesee
neeseeeeeweeneseenwneswweesee
swnwnenwsenenewnweswnwnenwnw
swswswwneswwnwwwwswwsesewnweee
nwwwnwwswnwwwweswsenwwwwwwewnw
wsweewwenwnwnenwneenwnww
nwswnenwnwneswswesenenene
swseseneseeeneweswe
seseseseeeeeseenweeseswe
seswswsenwseswswwswsesesesesweswsewnese
eeeneeeeeneneseewnweneesenesw
swswswswswnwsweswswnweswswswnwsenesw
esweeeneeeenwneeeswenw
nwsenwnewwwnewswwsewnwwnenw
swwenewwwwswswswweswweenwsww
eeeeeneeeeeeew
wwwswseenewewnwswneswswswwswnenese
newneneseenenenwneneneneneneneeswnenene
eenwsenwnwnenwnwnwnenwsewnwseneswwnw
swwneswsenesenwwnwenenwswwnwnwnwnenwww
swseenwseswswenwswswnwneseseswswwswsw
nwnwnwenwwswwnwwseswnewewnwnwnwnw
wewwsenwneswwwnwsewwwwnwneww
nenwnweswnwnenwnenwnwnwnenenenwne
sesesenwwsenwswsesenwenweseseseseesesese
wwwnewwwwwsewwswwewwwww
neeneneneenenenenenweneswweenesenene
swwseeswsesenwseswswswwneswswesw
nenewswwewswwnwwwewwswswwseswe
enwseswnwsesenwneseewswswswnwenwswne
senenwnenwenenwnesewnwnwnwnesenenwwnwsew
wsenwneswswwsenwnwwwwsenenwnewewsw
neneneneneneneswneneneenenwswnenwswnene
wnwnenwnwenwswnwsenwnwnwnwnwnwne
enewswnwnenenenenenenwneseenenewnenwsw
eeewswwsenesewseneseeeseseeseee
wweeswnweneeswenewneeswseeenwnwne
swwseseseseswwneseesesesesesesenesesese
nwnwseswnwnwnwenwnwswnesenwnwwnwnwnenww
eneneneneewweeeswsewweneneeee
nwnwnwnwnwnwwswewnwenwnwnwwwnenwse
eseseseweseeeesewswseenwsenwsee
swswswsweswwnwswswswswseeswseseswswsw
nwnesewnesenenenwsewnenenewnenwnenenenw
swswwneswwswwswwswswwswwnewsww
nwnwnwneenwswwenwwsenw
enenwseseseswseseesesesesesewnww
seswsenwseseswnwswseseseswswswnwseseswne
enesesenesewsesewsesewweseseesesenwsw
swwswesewneseswnenewwewseeswswswne
eeswewweesesesenwswseenesesesene
neswswsweswswnwswswneswseswswswswswswsewsw
senwnesenenewweseswsewenenwseseseew
sweseswsewseseseswneswsesewswsesesenese
neswneneeneneswneneeneneenenenenenew
sweenenewswnweneswesweeneenwnenee
nwnewwnwsesenesesenwnwnwwnwnewwswnww
swwwwnwswswswswswswwsewwsww
nweewneneswsesewswnewwwnewswew
nesweseeeneseswwnwseswnwseswwnweswsenw
esewnwnesenwwswnenwwwnwnewnweswsw
nenwnwsenwnenenenwwsweswswnenenwenenw
esweeeewseeeeseswweeneeenwne
swenwenwwneneswnenweeswnwwnwswsee
nwswswswwswswseswswseswneswseswswesesw
nwswwnesesesweseswseswnewe
nenwnwnwnwewnwnwsenwnwnwnwnwnwwenwnw
enwsewnwwwwnweewnenenwwswwswwsw
wswswswsweswseswseneswswseswsewswswsw
nwnenwnwnwnesenenwnwnenwnenenesenwnenenesw
eeeeseneenwseswswesenwsesenwseee
enenewsewewenewsenenewseenwneswne
neenwnwneswneneswneneswnesenewenwswnee
neneseseeneswnwsenenesenwwwnwneneswnee
nwswnenenenwnenenewnwnwnwenwnwnenwnwe
nwnwnwnwnwnwnenwnwnwnesesenenwnwswnwnwnwe
senwnwnesenwnwsenwswwnwwnesene
swsewenweseeeseseseeseneeseeenw
wnenenwnenwnenenenenese
senwsenwnwwswenwnwenwneswnwnenenwnwsw
neeswswswswnwswswenw
wnewswwwwnewwsewwwwwwwww
wnwnwwnwwwnwwnwswnwnwewnwwnwne
nenenweswnenwenweneeswneseeeeese
sesenenwnenwnwnwnwsewwswswwnewwwe
ewswseswswseswsesenwseseseseseseesese
seseeeseswswswwewseswseswsesesenwsenw
seseseeseesesesesenwseneswsesesenesesw
swswenewswswswswswswnwswswwswswswswswesw
newwwwwwwwwswwnewswswnwwnweenw
swsesewseswswswseeswswneseswswnwswwseswsw
neeenweseneswneenwneswnwsenewswwnwswe
wewneswswswwnwseewsenewnwnenewsese
neneswwesenweneneneswewnwnewnwnenenee
neneesenenesewnenwwnesenwneneneneneswne
wwwwnwenwewwnwswwnwswwnwwnwww
neswnenenenewnenwnenwnenwenwsewnwnenee
nenenwswnwneneenwneswwnenenenenenenenese
neswwwswwwwwwwswwwsweenwswswsw
eneneneeenenwweneswseneneneseeneee
enenesenweenewwneneneeeweeee
sesewsesewswsesenwnweseneeswnwnewese
swswswswwwswnewenwnenenwwswseswwew
sewnewnweswwswswenwewnweenwnwnw
wwewwwwwwswwswwnwewnenwsesw
swsenenenenenwsenenenenwnenenenwneneswne
nwwwnwnwenwwnwnwnwwnwwsesenenewsewne
wnwwnesewnwnwnwsewwnwnwnwnwwnwnwnw
swsweneswswswswwnwswswenwswswswse
eseneswneeenwneeweenweeeenene
nenwewnwswwnwnwsewwwnwwswwwnew
newnwseswwneenenweneesewsw
seseseswseneewswneseseswwseweneseswnwsw
seseseswwnwnwwswwwwsewsesenenewnwne
swnwsewnwnwwnenwwwnwnwnwnesewwwnwwnw
nweeswseneeeeeeeesw
wnwnwnwsenwnwnwnwnwnwnwnwnw
swwnwsewswswweeswnwnwswnwswneewe
swseseseseswseseswneneswseewswsenweswse
swwneeeweeseeneeenenesenenwseenene
neneswnwnenenenenwnenenenenwswnwnene
nwwnwwnwsewwnwwwwenenwwnw
neenwnwwnwwswnwwnwnesewnwwwswnenesw
eeneeeeeweeeseeeeeenwese
seswneseseswseswswwswswswswnenwsesesesesw
eeneseseswsesenwneseswnwseswseseseesese
nwneewswseswwseneseseswneeswnenesese
swenwenesewnwneswneneneneneenenenee
seewswwnwwwneneseswnwwenwswewnw
eeeneeeeeeswesweeseseneswnwse
wwwswwwewesesweeswwwnewsww
enenenenewnenesenewnenwsenenewenene
eeeeenweneseeewseeswwseesesese
seseseseswneseseswsesw
neswneeesweseeeeeenwsweneeeenw
esweeweeeeenweeneeeneee
enwnwnenwnwnwneswnwnwnwnwsewnenwnenwe
swswwswswswnwwswwswswewwnewwswse
senenwnwsweswswseswseswwsw
wnweeseseeeeeseseseeeseeesesw
neseeswseswseseseeseswnewswwnesewsww
seswseswseswseswnwswseweswneeseesewnw
wwsenwsenwnwnenwswnewnwnwnwnenwsenwnwsw
swswswswseswsewswswnwswnwswswsw
ewwwwwswwwnewwwwnwwwewswsesw
eeseseenesewseseeseeseeesese
sesenwwesweeneneewenwesesesweseew
swswnwseswswswseseseswswswsw
neweneenenenwswesene
neneneneneswneneswswneenenenenwnenenenene
wwesesenewswnenwwnweswswswwnwsee
wswnewewnwwnenwswwwnwwswnwnwww
eseewneneewneeeeneswwsenenwwswnee
neneeneneenwneswewnwneswnewswneswenw
nwesewneneeneneeneneswneeeneswnenenwne
seswnwswseswseswswseswwnweesweswwsesw
wnwnwnwswnwnwnwwsenwnewwewwnwsenww
neneneneneneeseesenenwneneswnenenenwnew
eeneeeeneeseeeeeenewewnwe
nwnwswewnwwswswswseneswwswswwswswsese
swswswswseenwnwswswswwswswswswswsww
enwseneseewewenwseeseseneswewsese
wsewneneswswwwnwewswseseseneswnwsw
seswswseneneseseneswswswswswsewswswsese
eseewseneswnwneeseenwe
neswwneseswwseswswsenwswswnwswnwsewnese
swswnwswswswwswneswsesenenesenewswswse
newswswswneswnenwsewseseswswwwseswswne
eswnwnwenwneeseweswweesweenwswe
seeeseseenwesweseeesesesesese
seseseeeeeenwesenwweeeeseeese
eeeeeeenwswweeseeenewesesese
nwnenwnwnenenenenenwswnenwnwnw
nwswneswseswsenewswweeswnwswwseenw
enenwnenenwnwswswnwswswnwnwnwenwnwswnwe
nwwswnwswnwnwnweneswnwnwwne
neswnenenwnwnenwnwneneenwnwnw
nwwsenwnenwnwwnwnwnwwnwneesewnwnwsenenw
nwnwnwwnwnwnwnenwnwnwsesenwnwnwnwnwnwnw
wwnewwwsewwwwewsewwnwwww
wswswwwwwswwnenewswnwwswwwewsw
swswsewswswnenwswseswswwsweswswswsw
senwseesesesweseswseswswswseswseswsww
swenwswseeswswswswwswswseseseseswseswew
nwnenenwwswnwsenenwwnwnwnwswnwnwneswswnw
nwseswnewwnwenwwnwewsenwwswnwww
nwswwwneswnwewwsenwnwnwnwnenwwwse
wwneeeeneeeneeeseeenenenenee
wsewwwnwswwwwwneewwnewswnew
wewseweswwwnwswsewwwwwswswnw
sesewnwseeeseeseneseseeewwenwe
neswswnwswswseeswswswswwswwseswswswse
enwnenenenwnwswnenwwnwnwnwsenenenwnw
eenenenwneneneswneneseneeneesenwene
nwswewwnwnweeswnwnwwnwsenwswewnwsene
eeenwseseswsesenweseeseneneswsewsesw
sewswneeeswseneseeseseswseswnwswnwwne
swseseswseseseseseseseswsesenwsesenwese
nwnwsewsesesesenesesesesesesesese
seswseseswseeseeneswswwswwseeswnwnese
ewnwsenwsewwswwnwwneseswswseneww
nenenwneneneswnenenwneswnwneswneenw
newnwswswswwswswwswswswswwwesw
wnwswneneeeneswnwwnwnenenwnwseenwe
seneeneenenewneneeeene
nwnwswnwwneewenwnwnwwwswnwnwswsenww
sewneswnwswneseseswww
senenwnenewnenenwswneneneseenenenwnenwnw
wswneneswwneseswewnenenwnwswswnenwsw

26
day24/part1.py Normal file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env python3
lines = (x.strip() for x in open("input.txt"))
blacks = set()
for line in lines:
x, y = 0, 0
while len(line):
if line[0] == "n":
y += 1
x += 1 if line[1] == "e" else 0
line = line[2:]
elif line[0] == "s":
y -= 1
x -= 1 if line[1] == "w" else 0
line = line[2:]
else:
x += 1 if line[0] == "e" else -1
line = line[1:]
if (x, y) in blacks:
blacks.discard((x, y))
else:
blacks.add((x, y))
print(len(blacks))

51
day24/part2.py Normal file
View File

@@ -0,0 +1,51 @@
#!/usr/bin/env python3
import numpy as np
from scipy.signal import convolve
lines = (x.strip() for x in open("input.txt"))
blacks = set()
for line in lines:
x, y = 0, 0
while len(line):
if line[0] == "n":
y += 1
x += 1 if line[1] == "e" else 0
line = line[2:]
elif line[0] == "s":
y -= 1
x -= 1 if line[1] == "w" else 0
line = line[2:]
else:
x += 1 if line[0] == "e" else -1
line = line[1:]
if (x, y) in blacks:
blacks.discard((x, y))
else:
blacks.add((x, y))
x = np.array(list([x, y] for x, y in blacks)).T
lower = np.min(x, axis=1)
upper = np.max(x, axis=1)
grid = np.zeros((upper[0]-lower[0]+1, upper[1]-lower[1]+1))
x -= np.array([lower]).T
grid[x[0], x[1]] = 1
kernel = np.array([
[1, 1, 0],
[1, 0, 1],
[0, 1, 1]
])
for _ in range(100):
grid = np.pad(grid, pad_width=1)
neighbors = convolve(grid, kernel, mode='same', method="direct")
set_inactive = np.logical_and(grid == 1, np.logical_or(neighbors == 0, neighbors > 2))
set_active = np.logical_and(grid == 0, neighbors == 2)
grid[set_inactive] = 0
grid[set_active] = 1
a = tuple(slice(np.min(idxs), np.max(idxs)+1) for idxs in np.where(grid == 1))
grid = grid[a]
print(np.sum(grid))

2
day25/input.txt Normal file
View File

@@ -0,0 +1,2 @@
8458505
16050997

19
day25/part1.py Normal file
View File

@@ -0,0 +1,19 @@
#!/usr/bin/env python3
c_pub, d_pub = [int(x.strip()) for x in open("input.txt")]
val = 1
less_loop, less_pub = None, None
for loop in range(1, 20201227):
val = (val*7) % 20201227
if val == c_pub:
less_loop, less_pub = loop, d_pub
break
elif val == d_pub:
less_loop, less_pub = loop, c_pub
break
val = 1
for _ in range(less_loop):
val = (val*less_pub) % 20201227
print(val)