diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..cf644c2 --- /dev/null +++ b/.clang-format @@ -0,0 +1,297 @@ +--- +Language: Cpp +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: true + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseArrows: false + AlignCaseColons: false +AlignConsecutiveTableGenBreakingDAGArgColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveTableGenCondOperatorColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveTableGenDefinitionColons: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionDeclarations: false + AlignFunctionPointers: false + PadOperators: false +AlignEscapedNewlines: Right +AlignOperands: Align +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Never +AllowShortCaseExpressionOnASingleLine: true +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AllowShortNamespacesOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AttributeMacros: + - __capability +BinPackArguments: true +BinPackLongBracedList: true +BinPackParameters: BinPack +BitFieldColonSpacing: Both +BracedInitializerIndentWidth: -1 +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakAfterReturnType: None +BreakArrays: true +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: Attach +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTemplateCloser: false +BreakBeforeTernaryOperators: true +BreakBinaryOperations: Never +BreakConstructorInitializers: BeforeColon +BreakFunctionDefinitionParameters: false +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +BreakTemplateDeclarations: MultiLine +ColumnLimit: 120 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +EnumTrailingComma: Leave +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExportBlock: true +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLines: + AtEndOfFile: false + AtStartOfBlock: true + AtStartOfFile: true +KeepFormFeed: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MainIncludeChar: Quote +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +OneLineFormatOffRegex: '' +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakBeforeMemberAccess: 150 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: Always +RemoveBracesLLVM: false +RemoveEmptyLinesInUnwrappedLines: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: + Enabled: true + IgnoreCase: false +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterOperatorKeyword: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterNot: false + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + ExceptDoubleParentheses: false + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TableGenBreakInsideDAGArg: DontBreak +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +WrapNamespaceBodyWithEmptyLines: Leave +... + diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..96d691c --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,18 @@ +# We explicitly enable checks with '*' and disable noisy ones with '-' +Checks: > + -*, + bugprone-*, + modernize-*, + performance-*, + readability-*, + cppcoreguidelines-*, + misc-*, + # Disable these specifically if they are too annoying + -modernize-use-trailing-return-type, + -llvmlibc-* + +# Treat warnings as errors (optional, good for strict discipline) +WarningsAsErrors: '' + +# This ensures clang-tidy sees the same headers as your compiler +# It will read the compile_commands.json automatically \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..6590d35 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,25 @@ +FROM xianpengshen/clang-tools:21 + +# Install development tools (cmake, ninja, build essentials) +USER root +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + cmake \ + ninja-build \ + build-essential \ + libc++-dev \ + libc++abi-dev \ + git \ + python3 \ + python3-pip \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Create workspace folder (VS Code devcontainer convention) +ARG WORKSPACE_FOLDER=/workspaces/aoc25 +RUN mkdir -p ${WORKSPACE_FOLDER} && chown -R root:root ${WORKSPACE_FOLDER} +WORKDIR ${WORKSPACE_FOLDER} + +ENV SHELL=/bin/bash + +CMD ["bash"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..9f3dd8d --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,20 @@ +{ + "name": "aoc25-clang21", + "build": { + "dockerfile": "Dockerfile" + }, + "workspaceFolder": "/workspaces/aoc25", + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/aoc25,type=bind,consistency=cached", + "settings": { + "C_Cpp.default.compilerPath": "/usr/bin/clang++-21", + "C_Cpp.default.intelliSenseMode": "linux-clang-x64", + "clang-format.executable": "/usr/bin/clang-format-21" + }, + "extensions": [ + "ms-vscode.cpptools", + "ms-vscode.cmake-tools", + "llvm-vs-code-extensions.vscode-clangd", + "xaver.clang-format" + ], + "postCreateCommand": "cmake -S . -B build || true" +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..3b61161 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "type": "lldb", + "request": "launch", + "program": "${command:cmake.launchTargetPath}", + "args": [], + // CHANGE THIS LINE: + // Point the working directory to the folder containing the executable + "cwd": "${command:cmake.launchTargetDirectory}", + "preLaunchTask": "CMake: build" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5ff1ece --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "C_Cpp.intelliSenseEngine": "disabled", + "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd", + "editor.formatOnSave": true, + "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", + "cmake.configureOnOpen": false, + "cmake.generator": "Ninja", + "clangd.arguments": [ + "--background-index", + "--compile-commands-dir=${workspaceFolder}/build", + "--header-insertion=iwyu", + "--clang-tidy", + "--completion-style=detailed" + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..a74761c --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,24 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "CMake: build", + "type": "shell", + "command": "/usr/bin/cmake", + "args": [ + "--build", + "${workspaceFolder}/build", + "--config", + "Debug", + "--target", + "${command:cmake.buildTargetName}" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": "$gcc", + "detail": "Builds the target currently selected in the CMake status bar" + } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index ea14dde..ec35a8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,41 @@ cmake_minimum_required(VERSION 3.10.0) + +# Set compilers before project() to ensure they're used +set(CMAKE_C_COMPILER /usr/bin/clang-21) +set(CMAKE_CXX_COMPILER /usr/bin/clang++-21) + project(aoc25 VERSION 0.1.0 LANGUAGES C CXX) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# Helper to add AoC day targets and auto-copy any input files +function(aoc_add_day name src_dir) + # remaining args are source files + set(sources ${ARGN}) + + add_executable(${name} ${sources}) + set_target_properties(${name} PROPERTIES CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON) + + target_compile_options(${name} PRIVATE -stdlib=libc++) + target_link_options(${name} PRIVATE -stdlib=libc++) + + # Gather common input files in the source directory + file(GLOB INPUT_FILES + "${src_dir}/*_input" + "${src_dir}/puzzle_input" + "${src_dir}/test_input" + ) + + foreach(f IN LISTS INPUT_FILES) + get_filename_component(fname ${f} NAME) + add_custom_command(TARGET ${name} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${f} $/${fname} + COMMENT "Copying ${fname} to build directory for ${name}" + ) + endforeach() +endfunction() # Per-day subprojects (example: day1) add_subdirectory(day1) +add_subdirectory(day2) +add_subdirectory(day3) +add_subdirectory(day4) diff --git a/day1/CMakeLists.txt b/day1/CMakeLists.txt index acb5852..623d629 100644 --- a/day1/CMakeLists.txt +++ b/day1/CMakeLists.txt @@ -1,2 +1,2 @@ -add_executable(day1 main.cpp) -set_target_properties(day1 PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON) + # Use top-level helper to add the target and copy input files + aoc_add_day(day1 "${CMAKE_CURRENT_SOURCE_DIR}" main.cpp) diff --git a/day1/day1_input b/day1/day1_input index e69de29..0af6e27 100644 --- a/day1/day1_input +++ b/day1/day1_input @@ -0,0 +1,4446 @@ +R41 +R17 +L15 +L2 +L41 +L47 +L42 +R8 +R29 +L32 +L14 +R26 +R28 +L35 +R2 +L4 +L27 +R37 +L14 +R2 +R50 +R12 +L13 +L3 +L29 +L37 +L6 +R43 +R13 +L26 +L24 +R23 +R29 +R18 +R8 +R20 +R50 +L23 +L24 +R25 +R31 +R6 +L19 +L25 +R6 +L43 +R21 +L15 +R3 +L38 +R94 +L11 +R27 +R38 +R19 +L73 +L94 +L9 +R74 +R73 +L23 +R93 +R92 +R40 +R17 +L57 +L33 +R53 +L98 +L25 +L71 +L26 +R89 +L30 +R66 +L88 +L37 +L42 +L58 +L53 +L40 +L7 +R96 +L56 +R60 +L59 +L14 +L11 +L49 +L24 +R38 +R19 +L62 +L38 +L93 +L7 +R30 +R31 +L3 +L13 +R9 +L563 +R75 +R34 +L4 +L34 +L162 +L3 +R146 +L97 +R94 +L49 +L99 +L992 +R93 +R4 +L6 +L91 +L27 +R86 +R50 +R66 +R57 +L59 +R27 +L38 +R15 +R23 +L65 +L77 +L996 +R98 +L6 +R27 +L929 +R103 +L78 +L77 +R80 +R972 +L94 +L36 +R7 +R28 +R43 +L72 +R72 +L621 +L323 +L56 +R87 +R23 +L110 +L93 +L731 +R42 +L18 +L9 +R9 +L72 +R9 +R14 +R69 +R34 +L454 +L41 +L82 +R7 +L66 +R5 +L672 +R31 +L13 +R531 +R89 +R31 +L25 +L73 +L922 +L47 +L316 +R13 +R84 +L34 +R647 +R92 +L8 +R69 +R135 +R60 +R5 +L464 +L99 +R63 +L19 +R907 +L78 +R90 +R38 +R62 +R66 +L466 +R462 +L762 +L287 +R678 +L91 +R72 +R81 +L356 +L859 +R63 +L28 +L69 +L4 +L877 +L23 +L1 +L2 +L897 +L54 +L49 +R15 +R89 +R10 +L21 +R11 +L46 +L832 +R57 +L43 +L70 +L859 +L8 +R19 +R81 +L32 +R1 +L83 +R33 +L19 +R19 +L19 +R10 +L27 +L83 +L57 +L57 +R14 +R31 +L97 +R66 +R147 +L747 +L52 +R392 +L65 +R97 +L99 +R20 +R13 +L80 +L43 +L90 +L190 +R797 +L89 +R992 +R997 +L89 +L37 +R77 +R49 +R86 +R214 +L13 +L689 +R17 +R59 +L48 +L24 +R98 +L74 +R15 +L766 +L670 +L5 +R645 +L445 +L76 +R76 +R53 +L60 +L93 +R71 +R668 +L39 +R450 +R288 +R76 +L14 +R9 +L9 +R43 +L66 +R67 +R572 +L63 +R658 +R89 +L18 +R747 +L211 +R13 +R41 +L44 +L16 +R188 +L576 +R76 +L464 +R364 +L154 +L38 +R65 +R2 +L70 +L705 +L56 +R256 +L56 +L44 +L5 +L95 +L897 +L16 +L19 +L647 +R4 +L78 +L80 +R58 +L75 +L50 +R16 +R614 +R70 +L48 +R48 +L47 +R74 +L38 +L89 +R548 +R52 +R23 +L22 +L20 +R274 +R525 +L82 +L76 +L90 +R68 +L649 +L61 +R12 +L97 +R95 +L10 +R510 +R274 +R26 +L34 +L66 +R18 +L25 +L54 +R29 +R32 +R59 +R578 +L937 +R91 +L252 +R84 +R77 +R27 +R77 +L26 +R3 +L81 +R91 +L40 +L23 +L81 +R753 +L78 +L338 +R9 +R1 +R873 +R10 +R85 +R80 +R358 +R45 +R430 +L3 +L60 +R621 +R67 +R69 +R56 +R97 +L51 +R183 +L580 +R69 +L79 +R68 +R811 +R57 +R7 +L14 +L29 +R36 +L391 +L109 +L2 +R2 +L95 +R18 +L23 +L79 +R79 +L71 +R696 +L34 +R73 +R528 +L782 +R271 +R29 +L310 +L17 +L383 +R59 +R75 +R84 +R162 +R520 +R92 +R266 +R363 +R247 +L32 +L50 +L86 +L27 +L73 +L7 +R880 +R331 +R96 +L35 +L65 +R42 +R34 +L176 +L372 +L54 +R26 +L64 +R64 +R412 +R83 +L95 +R22 +R78 +R60 +R54 +L14 +R85 +L985 +L57 +R72 +L15 +L2 +R51 +L24 +R38 +L3 +R93 +L53 +R73 +R16 +R44 +L33 +L46 +L305 +R51 +L77 +L18 +L795 +R361 +L64 +R353 +L88 +L598 +R6 +L50 +L24 +R94 +R87 +L916 +L45 +L26 +L630 +L18 +L52 +L75 +R7 +L32 +R25 +R75 +L75 +R35 +L60 +L70 +R70 +R34 +R36 +L87 +R94 +R23 +L67 +R667 +R16 +R84 +L8 +R96 +L26 +R84 +R54 +L61 +L15 +L48 +R63 +L49 +L10 +R37 +R183 +R951 +L51 +L342 +R208 +R695 +L61 +R80 +R20 +L80 +L570 +L350 +R40 +L922 +R703 +L61 +R40 +R760 +R703 +R40 +L3 +L842 +R976 +L53 +R98 +R49 +L75 +R64 +L17 +R89 +R65 +L54 +R2 +R98 +R896 +L96 +R49 +R651 +L15 +R15 +R64 +R14 +L78 +R86 +R3 +R39 +R172 +L69 +R70 +L601 +R18 +L307 +L11 +L59 +L41 +L92 +L8 +R78 +R107 +L85 +L90 +L10 +L6 +L994 +R27 +R30 +R43 +L139 +L7 +R46 +L2 +R2 +L719 +R58 +L39 +L948 +L52 +R29 +L91 +L46 +L92 +R42 +L58 +L84 +L31 +L29 +L65 +R41 +L110 +L81 +L64 +L50 +L74 +L98 +R61 +R73 +L73 +L3 +L621 +L876 +R25 +L49 +R8 +R16 +L58 +L91 +L988 +R37 +L82 +R82 +L55 +R558 +L22 +L90 +L91 +R94 +R6 +L92 +L8 +L99 +L1 +R97 +R105 +R741 +L70 +R94 +L85 +R577 +R11 +R730 +L291 +L9 +R48 +R1 +L630 +L10 +R85 +R218 +L12 +L347 +L53 +R664 +L57 +L65 +L42 +L90 +L93 +L859 +R48 +R394 +R60 +L49 +R63 +L55 +R20 +L5 +R17 +R19 +R30 +L75 +L21 +L50 +L40 +R86 +R15 +R22 +R983 +R12 +L32 +R4 +L4 +L48 +L16 +L83 +L25 +L49 +L86 +L93 +L34 +L40 +R185 +L11 +R54 +L29 +L826 +L75 +R1 +L47 +R122 +L64 +L36 +L22 +R59 +L80 +L257 +L80 +R1 +L621 +R25 +L84 +R2 +R57 +R61 +R39 +R474 +R26 +R291 +L50 +R15 +R39 +R2 +L56 +L41 +R695 +L160 +R95 +R46 +L76 +L95 +R95 +R9 +R361 +R3 +R722 +R86 +L81 +L73 +L87 +L553 +R66 +L71 +R934 +L60 +R37 +L59 +R75 +R54 +L692 +R45 +R84 +R23 +L12 +R66 +R23 +R925 +L66 +R46 +R7 +R88 +R32 +L97 +L19 +R35 +R45 +L96 +R53 +L454 +L98 +L101 +L85 +R85 +L20 +L646 +L94 +R370 +L10 +L90 +L45 +R940 +R95 +R15 +R561 +R80 +R44 +L25 +R89 +L64 +L20 +L893 +L87 +R65 +L32 +R42 +R25 +L328 +L76 +L79 +L17 +R327 +L27 +L27 +L551 +R12 +R881 +L71 +L96 +R89 +R63 +L57 +L94 +R93 +L42 +L54 +L31 +R483 +R102 +R89 +R59 +R24 +L60 +L12 +R62 +R38 +L21 +R21 +R74 +R20 +R6 +R20 +R72 +L37 +L55 +L63 +L37 +R96 +R63 +L59 +L14 +R82 +L468 +L51 +R25 +R26 +R44 +R57 +L72 +R923 +R80 +R99 +L66 +L265 +L94 +L73 +R466 +L99 +L27 +R27 +R30 +L67 +R33 +R31 +R88 +R255 +L70 +R627 +R383 +R724 +R99 +L911 +R53 +R81 +R19 +R94 +L983 +L56 +R70 +L87 +L85 +R31 +L23 +R464 +L63 +L63 +R26 +L65 +L37 +L98 +L234 +L66 +L378 +R122 +L64 +R20 +L31 +R822 +R9 +L68 +R68 +R74 +L42 +R928 +R979 +R61 +R678 +L78 +R75 +L475 +L85 +R7 +L31 +L91 +L62 +L85 +R71 +L84 +L35 +L34 +R40 +L11 +R88 +R87 +R42 +R57 +L58 +L716 +R34 +R60 +R206 +L38 +R72 +L39 +L20 +L95 +L234 +R476 +R57 +R221 +R44 +L44 +R522 +R49 +L71 +R13 +L495 +R20 +L83 +R45 +R81 +L56 +L25 +R14 +R976 +R340 +R82 +L12 +L34 +L77 +R460 +L38 +R86 +L97 +L60 +L530 +R80 +R49 +L39 +R74 +R847 +L7 +L57 +R52 +R86 +R8 +L3 +R37 +L37 +L58 +L42 +L947 +R47 +L5 +R805 +R47 +R53 +L81 +R4 +L93 +R91 +R70 +L91 +L15 +L485 +R15 +L15 +L42 +R4 +L50 +R473 +L66 +R99 +L96 +R4 +L26 +R58 +R3 +L78 +R38 +L8 +R61 +R21 +L48 +L47 +R34 +R20 +R81 +L32 +L3 +L40 +R93 +R79 +L70 +R15 +L72 +L99 +L71 +R25 +R40 +L19 +L78 +L3 +R79 +R19 +R11 +R691 +R619 +R81 +L95 +L55 +R41 +R9 +R636 +L75 +L7 +L94 +R740 +R64 +R36 +R32 +R68 +R332 +R68 +R14 +R81 +L12 +R11 +R6 +L38 +R70 +L397 +R68 +L47 +L87 +R31 +L75 +R49 +R87 +L13 +L92 +R46 +L602 +R58 +L58 +R692 +L456 +R98 +L92 +R58 +R65 +L565 +R49 +L73 +L763 +R660 +R96 +L17 +R16 +R74 +L542 +L19 +L20 +L48 +L13 +L28 +R28 +L18 +R52 +R66 +R61 +L94 +R33 +R55 +L55 +L45 +R70 +L51 +R26 +R383 +R17 +L96 +R28 +R98 +L20 +R875 +L77 +L208 +R27 +L128 +L199 +L38 +R43 +L38 +L69 +R28 +L24 +L17 +R99 +L84 +R42 +L95 +L56 +L148 +L66 +R4 +R16 +L95 +L261 +R18 +R53 +L12 +L628 +L72 +L81 +R59 +L36 +R46 +L23 +L65 +R12 +R2 +L79 +R65 +R89 +R34 +R8 +L31 +L12 +L5 +R77 +L37 +L46 +L426 +R49 +L41 +L37 +L36 +L86 +L667 +L82 +R88 +R764 +L3 +R333 +L7 +L40 +L86 +R679 +R796 +L29 +L46 +R737 +L37 +R53 +L89 +L64 +R63 +L63 +L38 +R838 +L58 +L42 +L55 +R55 +L64 +R99 +R72 +L392 +L75 +R560 +R88 +L64 +R76 +R77 +L82 +L61 +L94 +R82 +L76 +L96 +L273 +L29 +R18 +L66 +R74 +L877 +R73 +R52 +L22 +R21 +L80 +L59 +L23 +L430 +L429 +L73 +R73 +L1 +L995 +L638 +R419 +L71 +R75 +R10 +R601 +R63 +L63 +R98 +L32 +L21 +R55 +R37 +L535 +R98 +L75 +R722 +R89 +L36 +R90 +R7 +L35 +L62 +R34 +R62 +L32 +L18 +L46 +R880 +L84 +R4 +L81 +R44 +R86 +L49 +L131 +L69 +R587 +L87 +L65 +R18 +R64 +R98 +R884 +R50 +R14 +R8 +R29 +L71 +R54 +L21 +L362 +R49 +L57 +L79 +R74 +R13 +R280 +L597 +R17 +R67 +R37 +R96 +L35 +L83 +L82 +L28 +R28 +L48 +R48 +L91 +R70 +R68 +L47 +L54 +L21 +L25 +L137 +L49 +R20 +R66 +L95 +L5 +R86 +R89 +R61 +R910 +L46 +R90 +L60 +L84 +L16 +L28 +L362 +L940 +L75 +R93 +L820 +L99 +L9 +L93 +R45 +R34 +R324 +R94 +L194 +L77 +R77 +R34 +L34 +R89 +R267 +L45 +L15 +L89 +R79 +R52 +R74 +R88 +R18 +L57 +R89 +L50 +R89 +R58 +L85 +L45 +R71 +R12 +R344 +R51 +R17 +L14 +R25 +R62 +R12 +R703 +R38 +R362 +L90 +L10 +L656 +L735 +R57 +R94 +L60 +L90 +L49 +L33 +R92 +L77 +L43 +R91 +L51 +R62 +L2 +L34 +L25 +R28 +R31 +R8 +R44 +R86 +L224 +L78 +R64 +R89 +L89 +L55 +R99 +L28 +L20 +L33 +L63 +L60 +L562 +L21 +L557 +L87 +L84 +R9 +R81 +L696 +R91 +R95 +R91 +L26 +L74 +R15 +L15 +L60 +L40 +R8 +R92 +L89 +L76 +L67 +L468 +L360 +R65 +L5 +R80 +L80 +L33 +R98 +R31 +R104 +L32 +R152 +L17 +L3 +R1 +L337 +R67 +L33 +R83 +R719 +L30 +R189 +R34 +L93 +R31 +R669 +R28 +L56 +R28 +R55 +R45 +L93 +L7 +R72 +R29 +L951 +L1 +L31 +R615 +R18 +L17 +L23 +R89 +R70 +R47 +R83 +L18 +R18 +R4 +L4 +R88 +R77 +L65 +R54 +R51 +R33 +R74 +R65 +R30 +L15 +R94 +L186 +L912 +L95 +R477 +R87 +L257 +R24 +R22 +L46 +R70 +L70 +R58 +L682 +R24 +L58 +R40 +R18 +R6 +L6 +L62 +R34 +R75 +R53 +L628 +L179 +R7 +L92 +R92 +L21 +R53 +L63 +L50 +L219 +L4 +R14 +R90 +R53 +R15 +L68 +R18 +R82 +L82 +R91 +R91 +L41 +R41 +L923 +R23 +L98 +L15 +R67 +R81 +R24 +L40 +L19 +L689 +R8 +R17 +R38 +L66 +L8 +R73 +R30 +R35 +R909 +L447 +L72 +R72 +L527 +R7 +R27 +R78 +L86 +L99 +L65 +R79 +L45 +L61 +R93 +L223 +R36 +R77 +L91 +L81 +L419 +L37 +R72 +L35 +L63 +R31 +R96 +L44 +L20 +L219 +L84 +L69 +L34 +R79 +L74 +L34 +R35 +L12 +L88 +L38 +R838 +L882 +L919 +R22 +L680 +L41 +L88 +L85 +R23 +L50 +R57 +L57 +R77 +R99 +L976 +R60 +R40 +L72 +L28 +L17 +L16 +R78 +R49 +L30 +R136 +L735 +L65 +L39 +L961 +R16 +R83 +R73 +R18 +L90 +L36 +R36 +R552 +R48 +L937 +R37 +R37 +R4 +R233 +R26 +L70 +L30 +L98 +L2 +R8 +R44 +L52 +R14 +L663 +R49 +R93 +R907 +L36 +R36 +R589 +L11 +R1 +R927 +R98 +L4 +R35 +L435 +L6 +R817 +R3 +L314 +L41 +R941 +R61 +L34 +R795 +R62 +R382 +R46 +L87 +L25 +L91 +L63 +R54 +R10 +R88 +R669 +R733 +L7 +L93 +R43 +R97 +R1 +L77 +L64 +R12 +L331 +L581 +L13 +R13 +L21 +L79 +R17 +R42 +R41 +R3 +R97 +L977 +L923 +R54 +R30 +R16 +R82 +R71 +L53 +L821 +L46 +R567 +L386 +L287 +L54 +L56 +L17 +R93 +R98 +L91 +R8 +L8 +L20 +R20 +R88 +R48 +L475 +L158 +L90 +L15 +L75 +R37 +L260 +L44 +L44 +L584 +L34 +R98 +L92 +L67 +R50 +R26 +L11 +R2 +R180 +R80 +L578 +L13 +R31 +R72 +R52 +L9 +L91 +L94 +L30 +L82 +R86 +R196 +L326 +R92 +L66 +R24 +L24 +R30 +R170 +L13 +L96 +R9 +R2 +R998 +L9 +R47 +L57 +R319 +R13 +R29 +L2 +R18 +L658 +L25 +L35 +L10 +L79 +R71 +L22 +R641 +L20 +R16 +L57 +L80 +L391 +R91 +L12 +R712 +L64 +R811 +R53 +L95 +L66 +R90 +R78 +L7 +L45 +L55 +L102 +R2 +L454 +L31 +R1 +R98 +R86 +L76 +L28 +L54 +L86 +R16 +R128 +L972 +R472 +R19 +R81 +L41 +L687 +L34 +L91 +L183 +L364 +R42 +R8 +R508 +L10 +R20 +R743 +L53 +L12 +R854 +R35 +L35 +R578 +R538 +L16 +R37 +R71 +L8 +L79 +R79 +R77 +R723 +R66 +R34 +L6 +L40 +L54 +R24 +R24 +R43 +L76 +L72 +R57 +R59 +L85 +R49 +L32 +R39 +R48 +L78 +L99 +L98 +L99 +R96 +R11 +L94 +L45 +R85 +R843 +L819 +R19 +L88 +R88 +L20 +R417 +R3 +R51 +R49 +R69 +L69 +L4 +L412 +L46 +L5 +R38 +L44 +L63 +R265 +R37 +L67 +L84 +L33 +L104 +R302 +R64 +L16 +R72 +R80 +R461 +R83 +R76 +L4 +R83 +L34 +R966 +R615 +L35 +R248 +L441 +R903 +R42 +R46 +L14 +R25 +R708 +L47 +L61 +L602 +L72 +R29 +R88 +R27 +L761 +L227 +R705 +R13 +L85 +R180 +R8 +R97 +L97 +R38 +R59 +R11 +R606 +L48 +R9 +R305 +R17 +R66 +L16 +R13 +L63 +R9 +L47 +R38 +L363 +L37 +R11 +R88 +R98 +R3 +L33 +R88 +L555 +R80 +R17 +L97 +L453 +R28 +R256 +R92 +L23 +L42 +L51 +R854 +R39 +L8 +R67 +L52 +R704 +R84 +R518 +R66 +L18 +R13 +R26 +R70 +R30 +L371 +R16 +L98 +R36 +R989 +R16 +R59 +L747 +R12 +R53 +L245 +L143 +L77 +R67 +R193 +R40 +L53 +R53 +L24 +L452 +R3 +L22 +L45 +L60 +R82 +R18 +R14 +L79 +L17 +R9 +R26 +R47 +L247 +L781 +L72 +L9 +L85 +R23 +R534 +L63 +L808 +R20 +L46 +L250 +L316 +L708 +R8 +L70 +L42 +L1 +R62 +L263 +R11 +L84 +R87 +R38 +R210 +R52 +R28 +R72 +R81 +R19 +L34 +R88 +L402 +L452 +R2 +L64 +R65 +R19 +R78 +R5 +L11 +L49 +R55 +R10 +L14 +L96 +L69 +L2 +R88 +L58 +R41 +L79 +L21 +R89 +L97 +R708 +L207 +R61 +L54 +L68 +L27 +L85 +L2 +R18 +R60 +R4 +R812 +L84 +L15 +L13 +R78 +L31 +L12 +R46 +L42 +L14 +L51 +R66 +L40 +L411 +R11 +L46 +R978 +L91 +R59 +R19 +R38 +L57 +R1 +R99 +R70 +L899 +R48 +R53 +R3 +R82 +R459 +R8 +L80 +R58 +L2 +L60 +R360 +L43 +R743 +R97 +R833 +R72 +L84 +R88 +R63 +R10 +L33 +R2 +L21 +R6 +L328 +L18 +R331 +R81 +R60 +R82 +L36 +L78 +L55 +L40 +L21 +L78 +L18 +L15 +R82 +L122 +L63 +R3 +R3 +R89 +L92 +R456 +R44 +R11 +R54 +L8 +R43 +L574 +L10 +R84 +L28 +R685 +L62 +R905 +R50 +R91 +R59 +L36 +R354 +R82 +L226 +R9 +L83 +L80 +R290 +R34 +L721 +L47 +L76 +R451 +R49 +R51 +R81 +R34 +L366 +R33 +L50 +R17 +R52 +L49 +L3 +L426 +L63 +L65 +L946 +R92 +R37 +L29 +R75 +L475 +R1 +R67 +R61 +R86 +L37 +R34 +L39 +L27 +R254 +R414 +L29 +L52 +R96 +L829 +L74 +R56 +R34 +L65 +R329 +R55 +L59 +L43 +R67 +R52 +L653 +L43 +L56 +R73 +R37 +R6 +R80 +R504 +R63 +L759 +L30 +L65 +R58 +R33 +R304 +R20 +R85 +L14 +L10 +L658 +L6 +R79 +R78 +R22 +R75 +L159 +R35 +L791 +R669 +R571 +L25 +L62 +L13 +L39 +R112 +R73 +R54 +R549 +R39 +L83 +L45 +L75 +L19 +R661 +R37 +R14 +R22 +R10 +R90 +L909 +L863 +L28 +R36 +R8 +R811 +R45 +L81 +L19 +L92 +R92 +L868 +L732 +L47 +L5 +L48 +L31 +L89 +L80 +R642 +L986 +L41 +R217 +R11 +R69 +R88 +R979 +L79 +R37 +R48 +R15 +L33 +L67 +R14 +R60 +L87 +R19 +L6 +R981 +L81 +L33 +L71 +R13 +L719 +R36 +L31 +L95 +L94 +R23 +L88 +L41 +R17 +R73 +L90 +L29 +R89 +R84 +L59 +R7 +L66 +R41 +R71 +R62 +L50 +L76 +L618 +R44 +R78 +L44 +R66 +L61 +L39 +L64 +L98 +R62 +R440 +L78 +R38 +L48 +L50 +R683 +L40 +L21 +R76 +R71 +L71 +L63 +L53 +R84 +R332 +R94 +L8 +L32 +L44 +R90 +R7 +R93 +L637 +L821 +L87 +L17 +L83 +L6 +R51 +R4 +L74 +R70 +R185 +L36 +L208 +L41 +L16 +L34 +L85 +R28 +R7 +R903 +L3 +R289 +R11 +L98 +L2 +R1 +R99 +R88 +R12 +L34 +R96 +R12 +L74 +R23 +L23 +R44 +R54 +L19 +R21 +L25 +R804 +L10 +L13 +R44 +R67 +R738 +R56 +L43 +L18 +L25 +L47 +L28 +R13 +R954 +R733 +R80 +L35 +R55 +L56 +L26 +R682 +R5 +L73 +L71 +L61 +R57 +R724 +R35 +L3 +L54 +R741 +L27 +R84 +R43 +R689 +L89 +L31 +R23 +L8 +L84 +L55 +L45 +R34 +R66 +L995 +R26 +L7 +L50 +L640 +R66 +R92 +R55 +R4 +R835 +L36 +L14 +R201 +L5 +L58 +L265 +L31 +R22 +R6 +R94 +L90 +R69 +L79 +L29 +L831 +L404 +L70 +R94 +L60 +L367 +L426 +R693 +L429 +R305 +L20 +L56 +R56 +R44 +L49 +R649 +R15 +R985 +R277 +R923 +L56 +R902 +L24 +R412 +L34 +R27 +L75 +R48 +L98 +R98 +L65 +L35 +R39 +L39 +R19 +R445 +L54 +R90 +L81 +R81 +L52 +R52 +L32 +L814 +L15 +R38 +R21 +R35 +R28 +R39 +R97 +L781 +L10 +L53 +L53 +R385 +R758 +R1 +L35 +L35 +L74 +R32 +R73 +R11 +L79 +L437 +R13 +L46 +L87 +L80 +R13 +L39 +L774 +R64 +R306 +R30 +L61 +R661 +R166 +R34 +L122 +L78 +R63 +R33 +L96 +L51 +R51 +R65 +R26 +L63 +L906 +R778 +L726 +R73 +R53 +L63 +R784 +R83 +L4 +L26 +L56 +L9 +L99 +R80 +L90 +R677 +L77 +L13 +R13 +R33 +R267 +R98 +R52 +R250 +L59 +L44 +L97 +L86 +L72 +L42 +L454 +R54 +R4 +L15 +R42 +L42 +R10 +R1 +R28 +L88 +L16 +R76 +L28 +L75 +L97 +R45 +R55 +L29 +R29 +R18 +R55 +R27 +L298 +L2 +L692 +R81 +L823 +L34 +L32 +R596 +L1 +L95 +R355 +L48 +R7 +R35 +L55 +L511 +L14 +L78 +L91 +R82 +L48 +L32 +L40 +R95 +R77 +R36 +R30 +L79 +L626 +R32 +R24 +R49 +R6 +L6 +L48 +R8 +R40 +R41 +R1 +R920 +L19 +R57 +R13 +L13 +R51 +L51 +R23 +L3 +L20 +L92 +R512 +L34 +R3 +L9 +L46 +R666 +L69 +R69 +L80 +R20 +L54 +R14 +R62 +L862 +R79 +R64 +L80 +L24 +L671 +L12 +L588 +L68 +R448 +L95 +L35 +L218 +R31 +L496 +R65 +L49 +L2 +R39 +R710 +L98 +R79 +R921 +L45 +L55 +L35 +R47 +L49 +L563 +R579 +R21 +R40 +L556 +L84 +L25 +R56 +R66 +R14 +L44 +R454 +R79 +L81 +L680 +R40 +R45 +L24 +R28 +R97 +R75 +R92 +L92 +L30 +L850 +R80 +R26 +R74 +R57 +R34 +R456 +R53 +L17 +R40 +L623 +R34 +R37 +L51 +L72 +L217 +L34 +L22 +R25 +R83 +L83 +R18 +L18 +L90 +L89 +R72 +L96 +L88 +R48 +R745 +R98 +R9 +R91 +R47 +L338 +R91 +R40 +L40 +L47 +R63 +R84 +L158 +L869 +L573 +L53 +L78 +R31 +R45 +R14 +L2 +R60 +R68 +R68 +L88 +L28 +L37 +L7 +L24 +R454 +L50 +R327 +L89 +R621 +R568 +L31 +L69 +L41 +L98 +R639 +L64 +R574 +R57 +R71 +R677 +R14 +L715 +L14 +R4 +R96 +R2 +L2 +R4 +R22 +L126 +R54 +R54 +R103 +R96 +L22 +R625 +L310 +L87 +R34 +L533 +R71 +R18 +R89 +L92 +R662 +L78 +R55 +L74 +R35 +R667 +R133 +R829 +L29 +R15 +R85 +L72 +R30 +R42 +R33 +L71 +L85 +R23 +R72 +L13 +R41 +L616 +R82 +R37 +L3 +R40 +L40 +L2 +R81 +L11 +L11 +L21 +R64 +R50 +R181 +R69 +R69 +R31 +L48 +L45 +R93 +L57 +L43 +R1 +L1 +L80 +L26 +L28 +R38 +R960 +L479 +L56 +L29 +L65 +R72 +R46 +R47 +R34 +R270 +R88 +R8 +L477 +L37 +L95 +L7 +L84 +R64 +R136 +R66 +R69 +R90 +L93 +L12 +L20 +L32 +R27 +R37 +L28 +R96 +R43 +L543 +R97 +L165 +L591 +R620 +R439 +R39 +L68 +L151 +R680 +R97 +R84 +R19 +L51 +L399 +L50 +L27 +L50 +L191 +R37 +L21 +L49 +R89 +L88 +L7 +L93 +L90 +R416 +R68 +R53 +R26 +R38 +L85 +L60 +L60 +L13 +L93 +R44 +L62 +L58 +R9 +L65 +L56 +R654 +R34 +L69 +L7 +L24 +R42 +L542 +R99 +R1 +L89 +L94 +L21 +R1 +R627 +L324 +R55 +R792 +L75 +L191 +R6 +L87 +R89 +R24 +R22 +L35 +R922 +L22 +L762 +R11 +L616 +R67 +L58 +R60 +R98 +L321 +R21 +R19 +L419 +R675 +R31 +L6 +L5 +L95 +R84 +L78 +R19 +L22 +L3 +L79 +L76 +L138 +L51 +R59 +R13 +L42 +R95 +L39 +L11 +R86 +L91 +R18 +L344 +L50 +L63 +R738 +R75 +R81 +R44 +R875 +L40 +R347 +R77 +L284 +L83 +L217 +L783 +R83 +L20 +R91 +L43 +L17 +R89 +R75 +R25 +L4 +R38 +R19 +L67 +R940 +L2 +L24 +R10 +R43 +L467 +R14 +L37 +R872 +L35 +L63 +R66 +L88 +L846 +R16 +R95 +L91 +L41 +L3 +R52 +R603 +R48 +L9 +R65 +L4 +R48 +L9 +R86 +R75 +R91 +R90 +L81 +L88 +L11 +R99 +L10 +L90 +R871 +L21 +L7 +R57 +R25 +L8 +R87 +L4 +L59 +R59 +R72 +R18 +R10 +L29 +R29 +L908 +R75 +R33 +L92 +L908 +L82 +L77 +R84 +L25 +R89 +L67 +R951 +L73 +L25 +R31 +L43 +R7 +L70 +R104 +R77 +R98 +L33 +R254 +R17 +R83 +R989 +L89 +R79 +R21 +R68 +L755 +L17 +L693 +L63 +L40 +L58 +L42 +L86 +R86 +L61 +R361 +L24 +R25 +L93 +R79 +R56 +R99 +L42 +R44 +L92 +R37 +R11 +L48 +L764 +L854 +L834 +R4 +R482 +L406 +R20 +R76 +R38 +L54 +L60 +L59 +L82 +L59 +R64 +R41 +L82 +R77 +L37 +R78 +R55 +L79 +L57 +R144 +L741 +L50 +L63 +L25 +L25 +L42 +L32 +R86 +R86 +L57 +L90 +L99 +R90 +L67 +L577 +L46 +L52 +L8 +L92 +L916 +R33 +R33 +R61 +L11 +R6 +R93 +R14 +R87 +R57 +L58 +L94 +R95 +R32 +R68 +R436 +L723 +R187 +L551 +L10 +R19 +L48 +R90 +L663 +L37 +L175 +L54 +L321 +R751 +R25 +L60 +L341 +R75 +R887 +L187 +R330 +L47 +R7 +L58 +R68 +L48 +L438 +L89 +R75 +L4 +L73 +L16 +R593 +R7 +R85 +R8 +R46 +L6 +L20 +L70 +R50 +R22 +L22 +L54 +L283 +L58 +R42 +R271 +R7 +L723 +R98 +R29 +R84 +L15 +L98 +L82 +R98 +L71 +R13 +R30 +L47 +R59 +L52 +R60 +L8 +L56 +R86 +L30 +R7 +L7 +L29 +L70 +R10 +L33 +R70 +R11 +L59 +R74 +L834 +R60 +L3 +L35 +R38 +L70 +R143 +R258 +L22 +L97 +L79 +R394 +R73 +L48 +R31 +R17 +L91 +L9 +L47 +R47 +R446 +R10 +R87 +L72 +R29 +R775 +R225 +L43 +R35 +R629 +L21 +L98 +R98 +L56 +L44 +R15 +R5 +L80 +R60 +R63 +L63 +R34 +L34 +R29 +R49 +R17 +L117 +R22 +R690 +L51 +R38 +L777 +L81 +R59 +R622 +L67 +R99 +R68 +L92 +R99 +R26 +L33 +L38 +R60 +R78 +L57 +L43 +L30 +L70 +R55 +L87 +L60 +L61 +L47 +L67 +L508 +L25 +L6 +L52 +L42 +R66 +R34 +L86 +R57 +R574 +R19 +L64 +R69 +L195 +R726 +L62 +L90 +L41 +R93 +L129 +L96 +R885 +R931 +R9 +R66 +R47 +L13 +L59 +L315 +L26 +R1 +R99 +R47 +L55 +L592 +R45 +R955 +L677 +L823 +R91 +L73 +R82 +L856 +R56 +R157 +L89 +L68 +R18 +R25 +R57 +R94 +R106 +L70 +L88 +L42 +L90 +L99 +L34 +R65 +L78 +L64 +R62 +L262 +R4 +L20 +R34 +R73 +R9 +L34 +R71 +R3 +L37 +R843 +L46 +R8 +L8 +R2 +R47 +R51 +R934 +L34 +L32 +R932 +R65 +L45 +R87 +L81 +L173 +R84 +L737 +R36 +R33 +R25 +L94 +L54 +L38 +R76 +R11 +L99 +R40 +L94 +R58 +L48 +L252 +R4 +R551 +L78 +R23 +L56 +R56 +R57 +L77 +L71 +L9 +R78 +R22 +L93 +L43 +L64 +L10 +L39 +L67 +L84 +L18 +R718 +R15 +L15 +L264 +R62 +L98 +L43 +R43 +L632 +R9 +L77 +L24 +L39 +R63 +L52 +L15 +L33 +R795 +R93 +R804 +R97 +L48 +R953 +L36 +L6 +R160 +R88 +L25 +L75 +L33 +R26 +L354 +L44 +L93 +L48 +L54 +R894 +R6 +R50 +R61 +L72 +R85 +R76 +L84 +L12 +R593 +L97 +L57 +L21 +L66 +L56 +L48 +L458 +R85 +L34 +L45 +R33 +L93 +L11 +L8 +L935 +R14 +R55 +R39 +R6 +R56 +L56 +L2 +R2 +R144 +L32 +L213 +R876 +L4 +R29 +L48 +L52 +L2 +R77 +R49 +R76 +R70 +L70 +R52 +L36 +L27 +L83 +R85 +L8 +R12 +R24 +R304 +R77 +R21 +R90 +R77 +R12 +R52 +L7 +R55 +L37 +L30 +L92 +L6 +R65 +L7 +R66 +L89 +R66 +L8 +L86 +L42 +R17 +R83 +R201 +L56 +R8 +L75 +R99 +L77 +R30 +L57 +L49 +L24 +R72 +L947 +R61 +R163 +L49 +R81 +R563 +L44 +R73 +L73 +L87 +L873 +L40 +R45 +L13 +L8 +L24 +L37 +L45 +R956 +L74 +R43 +L43 +L88 +R29 +L47 +L94 +L19 +R97 +R31 +L28 +R71 +L48 +L93 +L62 +R51 +L61 +L45 +L94 +R22 +R32 +L54 +R89 +L607 +R18 +R493 +L93 +L54 +L80 +R64 +R677 +R93 +L11 +L89 +L33 +L10 +L16 +L80 +L79 +R18 +R72 +R37 +R83 +R30 +L22 +L3 +L97 +L76 +R76 +L68 +L74 +L84 +L74 +L79 +R46 +L17 +R8 +L14 +L78 +L17 +R74 +L368 +L787 +R32 +L16 +L38 +R54 +R38 +L11 +R427 +R26 +L80 +L54 +L46 +L17 +L10 +R27 +L99 +L1 +L121 +R28 +R93 +L82 +R95 +R65 +L21 +R43 +L83 +L877 +R109 +L8 +R83 +R76 +L9 +R9 +L50 +R92 +R81 +R77 +R64 +L64 +L94 +R736 +L55 +L58 +R71 +R21 +R67 +L36 +R798 +R40 +L48 +R58 +R70 +R66 +L10 +R250 +R87 +L78 +R315 +L68 +R960 +R8 +R91 +L75 +L7 +R91 +L18 +L39 +L43 +L52 +R26 +R669 +L43 +R949 +L24 +L925 +L1 +L62 +L837 +R54 +L154 +R11 +L11 +L65 +R272 +L7 +L76 +L80 +L64 +R10 +R270 +L32 +R62 +R10 +R325 +L26 +R1 +R363 +R437 +L64 +R11 +R53 +L48 +R748 +R21 +R16 +R547 +R74 +L505 +L53 +R302 +R962 +L11 +R2 +R45 +R98 +L29 +R31 +R75 +L55 +L584 +R64 +L54 +R54 +R79 +R637 +R34 +L60 +L30 +R118 +R97 +R25 +L81 +R949 +R76 +L96 +L51 +L25 +R586 +L87 +R331 +R61 +L91 +L854 +L18 +R97 +R986 +L83 +R60 +L160 +L712 +R6 +R45 +R418 +L90 +L20 +R92 +L83 +R644 +L50 +R50 +R26 +R974 +L154 +L66 +L80 +R34 +L504 +L980 +L35 +R49 +R95 +R741 +R57 +L12 +L111 +R66 +L44 +R83 +R35 +L272 +L402 +R413 +L55 +R62 +R80 +R299 +L223 +L811 +L94 +R29 +R43 +R58 +R92 +R7 +L51 +L8 +L41 +R63 +L63 +R421 +L50 +R74 +L4 +R59 +L76 +L193 +L908 +L36 +L238 +R51 +L87 +L63 +R53 +L56 +R11 +L72 +R935 +L21 +L90 +R6 +L53 +L963 +R94 +R66 +R40 +L92 +L94 +L54 +R95 +R81 +R1 +L37 +R50 +R50 +R11 +R89 +R18 +L568 +R90 +R160 +R32 +L32 +R79 +L79 +R77 +L77 +L68 +L234 +R52 +R371 +L221 +R24 +R64 +L67 +L9 +L292 +R80 +L93 +R95 +L13 +L89 +R68 +R32 +L56 +L44 +L106 +L392 +L2 +L170 +R88 +L18 +R258 +R73 +R2 +R42 +R76 +L85 +R34 +L49 +R270 +L13 +L94 +R214 +R4 +L32 +R58 +R42 +L836 +R736 +R414 +L587 +L27 +L12 +L3 +R79 +L64 +R61 +L19 +R846 +R75 +R64 +L585 +L57 +L254 +L6 +R22 +L664 +L87 +R94 +L81 +L94 +R575 +R810 +R83 +L242 +R87 +L68 +R49 +R54 +R43 +L13 +L24 +R31 +L6 +R54 +R62 +L99 +R89 +R21 +L21 +L795 +R95 +L40 +R79 +R69 +R721 +L82 +R53 +L6 +R76 +R30 +L676 +R76 +L634 +L452 +L398 +R84 +L32 +R32 +R85 +R9 +R52 +R60 +R94 +R3 +R94 +R225 +R21 +R50 +R70 +L269 +L80 +L92 +L33 +L944 +L45 +L25 +R125 +L8 +L92 +L56 +R351 +L46 +L50 +L91 +R956 +R80 +L5 +R366 +R24 +R71 +R44 +L70 +R32 +R94 +R23 +L23 +L43 +L18 +L29 +L8 +R59 +R39 +R69 +L69 +L72 +L55 +L44 +L3 +R14 +L35 +R695 +L26 +R26 +L211 +L40 +L826 +R77 +R25 +L25 +L45 +R77 +R34 +R25 +R6 +R69 +R34 +L46 +R663 +L17 +L93 +R93 +L54 +L5 +L14 +R73 +R644 +L139 +R73 +L833 +R55 +R60 +R43 +R5 +R92 +L63 +L88 +R51 +L670 +L941 +R89 +L78 +L45 +R7 +R38 +R26 +R64 +L90 +L70 +R943 +L631 +L86 +L456 +R46 +R30 +R50 +L26 +L62 +R62 +L99 +L1 +R34 +L41 +R76 +R31 +R72 +L63 +R91 +R559 +L514 +R91 +R82 +R73 +R2 +L42 +R56 +R21 +L71 +L75 +R18 +R62 +R58 +R24 +R420 +R23 +R77 +L64 +L84 +L87 +R33 +L56 +L606 +L78 +R31 +R57 +L76 +R2 +L36 +R31 +R69 +L374 +L19 +L11 +R160 +L56 +L8 +R95 +L87 +R3 +L3 +L34 +L66 +R31 +L331 +L839 +R60 +L921 +L894 +R23 +L63 +R45 +L11 +R24 +R76 +R60 +L47 +L13 +R28 +R36 +L964 +L77 +R45 +R6 +R42 +R84 +R921 +L221 +L14 +R89 +R82 +L57 +R65 +L591 +L725 +L49 +L922 +R22 +R64 +R307 +L96 +R13 +R12 +R84 +L212 +L772 +L7 +L346 +R46 +L46 +R45 +L592 +R80 +R145 +L93 +L214 +R82 +L696 +L4 +L58 +R30 +R89 +R45 +L34 +L72 +R86 +L38 +L48 +L35 +R7 +R28 +R63 +L63 +R46 +L46 +R38 +L38 +R12 +R93 +L47 +R42 +L55 +R23 +R77 +R55 +R56 +R547 +L86 +R83 +R87 +R73 +R50 +R35 +R55 +R54 +L89 +R88 +R57 +R90 +L19 +R43 +L24 +L70 +L30 +L1 +L97 +R81 +L95 +R81 +R16 +L85 +L89 +R60 +R7 +L47 +R69 +R45 +L45 +L97 +R97 +L47 +L53 +L12 +L1 +R13 +R37 +R87 +R67 +L54 +R63 +R96 +R4 +R65 +R63 +L28 +R70 +L20 +L55 +R72 +R59 +R62 +L78 +R89 +L87 +R88 +R54 +R46 +R70 +L70 +R63 +L63 +R12 +L12 +L99 +R99 +R46 +L46 +L36 +R7 +L12 +L5 +L31 +L34 +R36 +R42 +R41 +L10 +R17 +L21 +R18 +L16 +L33 +L9 +L33 +L13 +L50 +L36 +R20 +R15 +L29 +R16 +R31 +L2 +L12 +L40 +R41 +R47 +R8 +L42 +L48 +R45 +L29 +R42 +R20 +L33 +L7 +R22 +R32 +L20 +L14 +L28 +L17 +R33 +R6 +R39 +R47 +R9 +L5 diff --git a/day1/main.cpp b/day1/main.cpp index dc519e2..2c152fe 100644 --- a/day1/main.cpp +++ b/day1/main.cpp @@ -1,5 +1,111 @@ #include +#include +#include +#include +#include -int main(int, char**){ - std::cout << "Hello, from aoc25 day1!\n"; +struct DialRotation { + char direction; + int distance; +}; + +auto parseRotations(const std::string& filename) -> std::expected, std::string> { + std::ifstream inputF {filename}; + + if (!inputF){ + + return std::unexpected{"Some file open error.\n"}; + } + std::vector dialRotations{}; + DialRotation curDial{}; + while ( inputF >> curDial.direction >> curDial.distance) + { + //std::println("{} : {}", curDial.direction, curDial.distance); + dialRotations.push_back(curDial); + } + + return std::move(dialRotations); +} +constexpr int dialStart = 50; +constexpr int maxDial = 100 ; + +auto executeSafeCrack(const std::vector& dialRotations){ + int dial {dialStart}; + std::cout << "The dial starts by pointing at " << dial << "\n"; + int countZero = 0; + + for (const auto& curDial : dialRotations){ + int fullRotations = curDial.distance / maxDial; + int modulo = curDial.distance % maxDial; + + if (fullRotations > 0){ + std::cout << "Big number! Passed " << "" << fullRotations << " times through 0!\n"; + countZero += fullRotations; + } + + if(curDial.direction == 'L'){ + int prevDial = dial; + dial -= modulo; + if (dial < 0){ + dial += maxDial; + if (prevDial != 0) { + std::cout << "Passed through 0 from a L rotation! Count++!\n"; + countZero++; + } + } + if (dial == 0){ + std::cout << "Stopped at 0! Count++!\n"; + countZero++; + } + } + else{ + dial += modulo; + if (dial >= maxDial){ + dial -= maxDial; + countZero++; + std::cout << "Passed through 0 from a R rotation! Count++!\n"; + } + } + + std::println("{} : {:3}, Dial now at: {:5} cnt: {}", curDial.direction, curDial.distance, dial, countZero); + if (dial < 0){ + std::cout << "Shit's fucked!\n"; + break; + } + if (dial >= maxDial){ + std::cout << "Shit's fucked!\n"; + break; + } + } + std::print("Zeros: {}\n", countZero); + return countZero; +} + +auto main(int, char**) -> int { + auto retval = parseRotations("day1_input"); + + std::vector testCase = { + {'L', 68}, + {'L', 30}, + {'R', 48}, + {'L', 5}, + {'R', 60}, + {'L', 55}, + {'L', 1}, + {'L', 99}, + {'R', 14}, + {'L', 82}, + {'L', 1000}, + }; + + if(retval) { + auto realResult = executeSafeCrack(*retval); + auto result = executeSafeCrack(testCase); + std::println("Testcase result: {}", result); + std::println("Total result: {}", realResult); + } + else{ + std::print("{}\n", retval.error()); + } + return 0; } diff --git a/day2/CMakeLists.txt b/day2/CMakeLists.txt new file mode 100644 index 0000000..ebc71e2 --- /dev/null +++ b/day2/CMakeLists.txt @@ -0,0 +1,2 @@ + # Use top-level helper to add the target and copy input files + aoc_add_day(day2 "${CMAKE_CURRENT_SOURCE_DIR}" main.cpp) \ No newline at end of file diff --git a/day2/main.cpp b/day2/main.cpp new file mode 100644 index 0000000..f139552 --- /dev/null +++ b/day2/main.cpp @@ -0,0 +1,153 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct IDRange { + long leftRange; + long rightRange; +}; + +auto parseRanges(const std::string& filename) -> std::expected, std::string> { + std::ifstream inputF {filename}; + + if (!inputF){ + return std::unexpected{"Some file open error.\n"}; + } + std::vector idRanges{}; + + std::string bigString{}; + std::getline(inputF,bigString); + auto ranges = std::ranges::to>(std::views::split(bigString, ',')); + + for(const auto& range : ranges){ + auto subParts = std::ranges::to>(std::views::split(range, '-')); + idRanges.emplace_back(std::stol(subParts[0]), std::stol(subParts[1])); + } + + inputF.close(); + + return std::move(idRanges); +} + + +auto countDoubles(const std::vector& idRanges) { + long doubles{}; + for(const auto& rng : idRanges){ + //std::println("{}-{}", rng.leftRange, rng.rightRange); + for( long i = rng.leftRange; i <= rng.rightRange; i++){ + auto str_version = std::to_string(i) ; + auto str_len = str_version.size(); + //std::print("Checking {}. Length: {}", str_version, str_version.size()); + if (str_len % 2 == 0) { + //std::print(" Divisible by two, splitting..."); + std::string_view left_half = std::string_view(str_version).substr(0, str_len/2); + std::string_view right_half = std::string_view(str_version).substr(str_len/2, str_len); + //std::print("Halves: {}/{}",left_half, right_half); + if(left_half == right_half){ + //std::print(" EQUAL!"); + doubles += i; + } + } + //std::println(); + } + } + return doubles; +} + + + +auto calculatePossibleSplits(int length) -> std::vector{ + //std::println("Possible ways to split a str of length {}: ", length); + std::vector returnVec{}; + for(auto toCheck : std::views::iota(2, length+1)){ + if(length % toCheck == 0) + { + //std::println("{}", toCheck); + returnVec.push_back(toCheck); + } + } + return std::move(returnVec); +} +std::unordered_map> splitMap{}; +auto getPossibleSplits(int length) -> const std::vector&{ + if(!splitMap.contains(length)){ + //std::println("Caching {}",length); + splitMap[length] = calculatePossibleSplits(length); + } + return splitMap.at(length); +} + +auto countRepeats(const std::vector& idRanges) { + long doubles{}; + for(const auto& rng : idRanges){ + //std::println("{}-{}", rng.leftRange, rng.rightRange); + for( long i = rng.leftRange; i <= rng.rightRange; i++){ + auto str_version = std::to_string(i) ; + auto str_len = str_version.size(); + //std::print("Checking {}. Length: {} ", str_version, str_version.size()); + + std::vector numsToCheck = getPossibleSplits(str_len); + //std::println("Possible splits: {}", numsToCheck); + for (int checkNum : numsToCheck) + { + //std::print("Splitting in {}: ", checkNum); + std::vector splits(checkNum); + for(auto toCheck : std::views::iota(0, checkNum)){ + auto window = str_len/checkNum; + splits[toCheck] = std::string_view(str_version).substr(toCheck*window, window); + //std::print("[{}]: {} /{} ", toCheck, splits[toCheck], window); + } + + if(std::equal(splits.begin() + 1, splits.end(), splits.begin())){ + //std::print(" EQUAL!"); + doubles += i; + break; + } + + //std::println(); + } + //std::println(); + } + //std::println(); + } + return doubles; +} + +auto main() -> int { + + + auto testCase = parseRanges("test_input"); + if(testCase) { + auto testResult = countDoubles(*testCase); + auto testResultP2 = countRepeats(*testCase); + std::println("P1 Testcase result: {}", testResult); + std::println("P2 Testcase result: {}", testResultP2); + } + else{ + std::print("{}\n", testCase.error()); + } + + + auto realRanges = parseRanges("puzzle_input"); + if(realRanges) { + //auto realResult = countDoubles(*realRanges); + auto realResultP2 = countRepeats(*realRanges); + //std::println("P1 Real result: {}", realResult); + std::println("P2 Real result: {}", realResultP2); + } + else{ + std::print("{}\n", realRanges.error()); + } + + return 0; +} diff --git a/day2/puzzle_input b/day2/puzzle_input new file mode 100644 index 0000000..28ec75c --- /dev/null +++ b/day2/puzzle_input @@ -0,0 +1 @@ +9191906840-9191941337,7671-13230,2669677096-2669816099,2-12,229599-392092,48403409-48523311,96763-229430,1919163519-1919240770,74928-96389,638049-668065,34781-73835,736781-819688,831765539-831907263,5615884-5749554,14101091-14196519,7134383-7169141,413340-625418,849755289-849920418,7745350-7815119,16717-26267,4396832-4549887,87161544-87241541,4747436629-4747494891,335-549,867623-929630,53-77,1414-3089,940604-1043283,3444659-3500714,3629-7368,79-129,5488908-5597446,97922755-98097602,182-281,8336644992-8336729448,24-47,613-1077 \ No newline at end of file diff --git a/day2/test_input b/day2/test_input new file mode 100644 index 0000000..bd04584 --- /dev/null +++ b/day2/test_input @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124 \ No newline at end of file diff --git a/day3/CMakeLists.txt b/day3/CMakeLists.txt new file mode 100644 index 0000000..04836a0 --- /dev/null +++ b/day3/CMakeLists.txt @@ -0,0 +1,2 @@ + # Use top-level helper to add the target and copy input files + aoc_add_day(day3 "${CMAKE_CURRENT_SOURCE_DIR}" main.cpp) \ No newline at end of file diff --git a/day3/main.cpp b/day3/main.cpp new file mode 100644 index 0000000..aab3028 --- /dev/null +++ b/day3/main.cpp @@ -0,0 +1,168 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct IDRange { + long leftRange; + long rightRange; +}; + +auto parseBanks(const std::string& filename) -> std::expected>, std::string> { + std::ifstream inputF {filename}; + + if (!inputF){ + return std::unexpected{"Some file open error.\n"}; + } + std::vector> banks{}; + + std::string bankLine{}; + while(std::getline(inputF,bankLine)){ + banks.emplace_back(bankLine + | std::views::transform([](char c){ return c - '0';}) + | std::ranges::to>()); + } + + + + inputF.close(); + + return std::move(banks); +} + +auto calculateJoltage(const std::vector& bank) -> long{ + auto curIt = bank.begin(); + auto rightIt = bank.end(); + //int leftMax = 0; + + auto leftBound = bank.begin(); + + // First find biggest number with that is not the last + while(curIt != rightIt-1){ + if(*curIt > *leftBound ){ + leftBound = curIt; + } + //std::println("Cur: {}, lMax: {}", *curIt, *leftBound); + curIt++; + } + + int rightMax = 0; + while(leftBound != rightIt) { + rightMax = std::max(rightMax, *rightIt); + rightIt--; + } + + + std::println("LMax: {}, rMax: {}", *leftBound, rightMax); + return (*leftBound)*10 +rightMax; +} + +auto countJoltages(const std::vector>& banks) { + long totalJoltage{}; + for(const auto& bank : banks){ + std::println("Bank: {}", bank); + totalJoltage += calculateJoltage(bank); + } + return totalJoltage; +} + +auto calculateJoltageP2(const std::vector& bank) -> long long{ + const int TO_TAKE = 12; + std::vector takenNumbers{}; + + auto curIt = bank.begin(); + auto rightIt = bank.end(); + + auto leftBound = bank.begin(); + + while(takenNumbers.size() != TO_TAKE){ + + // First find biggest number with that is not in the last 12 + while(curIt != (rightIt +1 - TO_TAKE + takenNumbers.size())){ + if(*curIt > *leftBound ){ + leftBound = curIt; + } + curIt++; + } + takenNumbers.push_back(*leftBound); + + curIt = leftBound+1; + leftBound = curIt; + } + + long long intRepr = std::ranges::fold_left(takenNumbers, 0, [](long long x, long long y) -> long long{ + return (x*10) + y; + }); + return intRepr; +} + +auto calculateJoltageP2_Optimized(const std::vector& bank) -> long long { + const int TO_TAKE = 12; + + if (bank.size() < TO_TAKE) { return 0; } + + long long result = 0; + auto current_start = bank.begin(); + + for (int i = 0; i < TO_TAKE; ++i) { + + + int items_needed_after_this = (TO_TAKE - 1) - i; + auto search_end = bank.end() - items_needed_after_this; + + auto max_it = std::max_element(current_start, search_end); + + result = (result * 10) + *max_it; + + current_start = max_it + 1; + } + + return result; +} + +auto countJoltagesP2(const std::vector>& banks) { + long totalJoltage{}; + for(const auto& bank : banks){ + totalJoltage += calculateJoltageP2_Optimized(bank); + } + return totalJoltage; +} + +auto main() -> int { + + + auto testCase = parseBanks("test_input"); + if(testCase) { + //auto testResult = countJoltages(*testCase); + auto testResultP2 = countJoltagesP2(*testCase); + //std::println("P1 Testcase result: {}", testResult); + std::println("P2 Testcase result: {}", testResultP2); + } + else{ + std::print("{}\n", testCase.error()); + } + + + auto realPuzzle = parseBanks("puzzle_input"); + if(realPuzzle) { + //auto realResult = countJoltages(*realPuzzle); + auto realResultP2 = countJoltagesP2(*realPuzzle); + //std::println("P1 Real result: {}", realResult); + std::println("P2 Real result: {}", realResultP2); + } + else{ + std::print("{}\n", realPuzzle.error()); + } + + return 0; +} diff --git a/day3/puzzle_input b/day3/puzzle_input new file mode 100644 index 0000000..f6136ac --- /dev/null +++ b/day3/puzzle_input @@ -0,0 +1,200 @@ +1222222312332225132221222322223222212123112122221122321222132212122312222221212112222322211112122222 +1345446423422232333442846252125241622734244225359323445433441754253232142272634482426733122226243425 +4577785646656747466375765575483456466553659534557243455743516567366564563657487644966426447385374456 +8222241222244832332283327241231524722223244352322232213522125242245322283224432151246355541722522324 +5635743334524945473375734334333434335143733447653334825456648464763377423445683323144636458153553242 +3232232312232332323212122223223233223321211222211132312332324232222232322523312323232163333222323322 +2472322324223274543733231232327134352234642232134332324474422235367263242723634682312212321627217212 +2322173432233122122222222213121212122322122223443222342522222222251411222236234224413232123242322223 +3652868667537452366966235765333245635664416546663245643298725986543622252758383653626463865737627748 +3253353434242444324342234443345354345254334442434394133446153443846544445463344442443434235445352234 +5525553365254244555275437345525352655555522746447455432455324534325535325273245541464725355252535575 +2214425229352326112252442232322442223322421533421422132524224245252242545214333222331524435255222223 +2234124522332123154444451131323344345334231233643452432242214434344233242231242332234344421524422232 +3236463384444313444333424423252643421343424424235323434132354443426454435344525454443465344534334423 +4543423346942324444333211221223212242324282444324344223441284163344472232231533442334222493142444332 +2252414424434323225422335355623444534443242223425454222114434323343422333232215262245342315322124145 +2122646344333414322344334235233373362531215643422331422265651312416332422214424426224243324542223642 +3847153424154522215342336613544333655363532363224243424235531432231232223355334226233328533731422324 +4213313279221255132733337332676783336438397722223623627143243336265323866272222383326952231117437536 +3232133691332323342527227744573324433247223253622233171323332113722323235353712225334322234221572332 +3445335444436434327374244374433344434442444442144443444264833443473634342344644763335344533673334344 +6333292325523633354384344331338332264312366653353246484744834445326665525233525441397563944365838662 +1422232212232134233341212239222212422322511212211252221221221311232212122322342312122222212222232242 +4545663443455345754454364437755673136355444555752453744637424434742134442237535355363587654542364464 +3723323233422393333326837768263333265213832212132322233392861423235237313423222323336342333932322332 +2349332626622312523226252359247213331622422325232223293333234249496222352453182422439533232324235293 +3252554344223424221332333445133334222243533523322421453434312323722222434332343535223326331431344432 +3224323455245243765446462354444354565156446364328331212243352324112326343383442623343643333324452114 +2563171155451654324562512247376555764275624737724434776266221511514262446463627513517271167474535589 +2323221323223322223334221233241223231111213213212232232222332211322222532111222323231232322222332225 +7424783332616784611422874441346688443382343661511421287338824445411353727864326752163275477222364319 +3354533332333324343135355544433311324132422234444325333334323542434333323236543423444343227424343334 +3732574422333334533553366332367433652284326723242266162436673434447364637354732463774564353343333173 +4212223242312223221423321222214221222221122222221223322432331232222222224221234124112233123122123224 +3233434633732743545124537434234653353464343242543244546323364447233333572534344434245434343234545544 +2225242525223643221254336142222234373343222332224343332434265232343412424722166322326213372423448325 +2432322533332432732522234451432243624223143437138244633421392233224232322224425221313425321446222431 +2114424325322242324512124415314222144242143241432626422134224363342352224534344271233533532423443323 +3223224211211258211121421231242223222222212132732212251212221332224232244332223232225222224212212382 +1423131332321213313231313222233122533323233422232242231222232333331522222332121323333322232212122213 +5655554636456633545666665465556655366655654365545555366536746474736775544563574766645543646465536663 +3252755647445345577525346257335542222374212663671322343546264454567666534555544522382675823433726252 +3244651472243442224343562543518331333224445441454272421314953422141242425435544454532935313335535434 +2342333332321232221552333333344324343334632333232535253353445333332221242352242142233322232333422342 +2942122243614122123433252121292245182224241221326222442224135558253129224221315828732241442331372126 +2242122222421262311324444533242264443193322114222232212321121222333224312122336224333123333222223323 +2522362222253223782132236734313213411233672343453425332393384438633251253243217453314522213171123341 +3322333394423945242354443527243254144453523323423533223344254426635332443365444262334236433353624145 +5144363655544353445575456545535555553435557475538345539433254564335654546565526555535346264443556655 +4412333212122253112332322213222234222143332423432321112245112221351222222253323232332321222333225514 +3212222333233323121322222232232322322222242222321232223232232413312623341322221232223233333332222312 +4655445445664456554455544425246365545456565443544665558564474465663555525545635534355556553546655464 +2221222262232642433342264243612222222254241322526435265474324262242262225124422365221321532222154524 +2244433336631854623226311233223251314433322432662162666122313213414532223622223323213322546422123325 +4222312324252212332222243163152524432335321226244344335543522253343222457323243342432525242222421143 +2223412144354332412133131421325233214154422322322223722333232512232232222264544312122352221441252941 +2222221222122222231166235212214217222224221227372222222621824225245122264782122371422422335232432511 +2335334342152363523314422243422312212223332322222633242654124622542232252333244421322333332323523213 +3297973276668316426221924925275762549257228394533832343394336485363134743218173242447539267433384546 +2222222223241824142225222211232261221341411222325331212222124932222521262222262522322322312232224244 +5455444375585253144452424554354432563465462783446535754146493443556344763543324646447516433845365456 +7225186565757383564548236146446656162154835755533443468783467345345528846865233738243576443545572276 +2432421122244344436232458835283613273272427567343262433273623255234353365532232377243247762225352224 +2244342451422331233454232333223212312311311322383442232211321323342122213323223324312322143432432224 +2124143431323222541232225222831262336222224232324222152222213313222152232246222252241321243122532324 +1653932264143262633447653566243653172332634272456212343345236352214843653833315745321244346234693568 +4319388539655436758264786843998954433446458665333836836736414628834358479866434924575444337233445547 +2332231223223122222323232132233212233212234222222452122311132241223232332343322111312251321212322222 +4334224233223132312223235323241144632322423352522324241333313222232722243422222233322242332422321322 +7325143833445522342253575533545239454636574276452453545428245255572262258745258255454354382256551147 +4313428332343335133253313633363753222432332233333223332323723434364223323322222332332333222143433243 +5221121211554122623411335422212282122231242322432225222231274222222221214622142153252554222521322221 +2533453653533433392736235246324663763457254654283346375627342355332223273342643242236342734633533883 +2326222212232223211151222223272253222322312222113331222122322342232242222221222321122222222222222122 +3254324143436364232642544433433113754463332513334433382133427353556232328232343213563352335224252422 +5532336124222222122362223222331532245222452114229322142354133451222222225222222422222226346262114222 +3422333321332331222122212212122222323132213222333133332242415315232233334422222226223223122232712232 +6466753623243634686665566555555556355557555746645476598476241646166355284655667645578651566452676376 +2863222611313324322633232242323175743363253754241522221363826251688324435122232632233229595553333333 +2631233111213234235423624117353313342321331412232236313363532122713534332222638232343323223231252147 +5734565454654684242455752875976553556762545674431465458856453456455676355556642665623546935661758526 +2124241122142243325226342626232322442222331225222322441223224222113141221341221222322323222244512242 +3323363333335333333533333422153533332323343333133353333233355132623333243333333333323233333543434323 +4545332344521233543441821132432217333232244232243441433422234235444144223344442436353342244242813642 +2245923758623329723677234255242626666247532456252435328826343327323255732266648272923456765867424523 +4242291532296955862224621235693222398688563224642267272435923551221826272762227694597582694864322741 +4525587925524756326254523845567633246353344322646355766862772549423535466234795457673626979237357587 +3524846433553444343353453444363434435434444454344343344923334445343344335673454342334443344434442233 +8632541534343456944443234544136653215426833324325564653222554352446552339454613554345351352224452552 +4146136335256231436411256352635624365143261533236364343154432523235115664366615642155165465254523789 +3337736245234343333623443435363723345343534343634383323443536464133443524362323475553435333373454234 +2243332223561223133313332632353167233512223321222222262373312353422337333224222222331224233222322332 +3342542757535443656354333347363535753345534333748323566223343397533576647364333799332452333497334735 +6214212222222221221722423222282233322221321322232114725542222222324222214326272222322112112122323232 +4566422331332323636343525522334543323323224333366434353355255332433333323327323333533336353233313345 +4934444334224443372221124142644262554522744457423252263443334244444343254241357354442425444244434244 +3533348344333432323395883523342323533555649546624154416673456585151454523532567353929363642354224842 +3272221132643232822215223335523322212622393333432322222322423233132324328323223322951223334322323233 +2112622221212122222321221212422211222332251223332222363313122222322111321112324232722228272121113129 +3232523113123332333334231322321314263322131442422331323231323235332235325362312423223322534321321132 +9358556673766458329644599557567935658745257592867335543536146444655376355865957353876686234678366352 +5242223355523353224244441422243464324293371233324331534321421331422266422544235333234323433212338322 +4653544535233343446354247333541445343474243434444143415343444434446434444524374336434443343444554245 +3235533232523263225253363754561433453672725343534134563353661342643372341354333546566443434572133646 +3137934345454194326447323243223235254632424543945232242332331273362453447323238335823314153439633343 +2331232412262312322342322325313227322221622222176124215422231242122332221321222252713422217762621322 +3515124353432543135154424243432114341133552541554315213344351351553141444244535355115221354215426789 +2222222222223121112432132623144222214132252223222312331222222222221322222211222124322222181222234332 +2733222222212122218223325243113392232212227226222111241242232222212321223224322112232132222333321222 +7423253663522632216327236216426125525225336622341265352432225232222342252128632248522882222244423223 +5656839457566364549863875929783786563887555255788384646782785655752768663427235647423543444667545663 +2244224173242422144239447473244346231442242229441244124422561238512214226319427848248254394249239222 +3134324244123434411111341421211242342343321332244231123443213414121333144312141321414144241432456789 +2123222222532222331122223122122232122222282222352223152332321231223233322132223233212512221222222222 +3433337723687313343343341333333232233143333333333444326633324332322344333435732373333339332334344633 +4734552425421133624242225432756414442452344421683389322143423264864536194533224324143235262457432334 +5743642663548353363383344322233736237347332333663496653345433667377423173776724473546743337486434338 +6745464734746655363746438358445664347243384434547446379696644668564594954298936645584647643645765174 +5562557343335352722313258363233214252223526572225225223224641266122232332222116335672252525223512224 +5324226433351356545237253335433342535112223443325322434552591322233564453223344426491342444723513325 +2822323232432122331246221323232343332554293136122333138422323347433214333342132232242221233462232312 +3553334326333124133333333443313223333332333321325323333333423333324131233344332433233325343333334332 +3553328424442352323424221244423162245575433454736413256577364757365434564463335553523652256352344234 +4333423333322333233333331436323413243123352333623334333532342324242332521353623132232333533142332332 +2222235323113243332323253332263323232313333332332325333223422233223322242333123343333132222223333232 +5432334223333385363332322423354481633343433663433346341253542549375343333235363317433343343345273233 +1211122221212523421414252524222232212242522223222173212122222222233222251223212432122221222222232222 +5555341373369287553554338535578346252454585441333387475853443447548553955539636382737338684853648324 +3444423436833333536435333469436413441544344643358423523832535336444252855433235443347434334335334353 +4652433245373392351734541444434543592364584448349324446637446349426369323434633725425423434523353232 +1613212122723622242278212221272232412222223221222123223141422438212222321217383212222222524151328272 +2322312221422422243251342312132233222332232522132292212222421416224432224454211322142523242421242213 +2453552449355335353333455534312653322433129233223542244232317324523453324362443644654232245354535355 +3223432424314542311234346543245354543943325442344248556333321343354834323744433333325273223323236444 +3273322242922222234141213432233322333233323233223332331233321362321232132213232213221182122223213132 +4321354552542622325322616522523522526222253343721322354523641942223223225346435225323225616272146222 +2222132222222314211222121112121222222422412332512312212238221233253221213322222225231322322222223212 +3625623123174243241432662232234224452322223242162366253323442226423214114235521213214745343323445724 +2533233634253623433464437438242224623365332366323247348625873244236133936564534554336313622223133233 +8878788898777877487699888978898898777977877887887878896888888878889887889848788977988888888887598668 +3322373372422425244333245533554547334164541333434725333551323235552289432536533452254363344345231312 +1432436353334323233332333434434434433424332432323444344144364343344333333323243543333323344433453343 +3321443243342233121332332324222232332123333322232343123332343442222335114332322333333322212213223233 +2532352313412243222233523334241232345232323333312424323324232228332434414314322322135333233423343333 +6656264513224552455562413226315265366634632353552262256444251544424652563522513324454612351466422455 +3352334352963332363533134343333333333331733354223333334623335333332333343273513443333313333335523354 +7234732263333313357336744324735447533332634323323355352393353854644514337353133337532334948735433414 +8448646669263527951633858664544365767593846387636872455643647447578868665723215245346326842854666246 +2221322254222333253532212133222723212212241322223221222224323212222221222212121223111222231222211262 +1311333211332114227262347322122123232233222342227242633244212241214232121232342233132332222333228342 +2433433332444244212341442233154233443534424344443252433444434434432444323414342412342522233224444234 +2332233231464331642112543243233233321333362333542212223229243331222423322623331222724383423154246213 +3685536668666666766346582753666677876666572767446566666855463675556368366662476666652966456454677355 +1542215351142422327152324432222223322261222322114323522354322122262433432214242222241414222323352726 +3343413121222324251423224222122622143221233122324132222222421215121222412121412525311221242124252342 +2431163523214342142332232422413226164322332525241262222322223244236132224241222224224214264235323172 +8772463943137885373335252784576835477612752314166627355584276345334339636258711682416362866626727333 +1222222221421213222122273213222222222122622122225312225221122222132122322645422222621635224223112215 +3532213535352425264677454321235222442623242524167515217734513234215222242343961435525732355576335421 +3223214224342353422322222841224212214234222222933232633222455122323445332223455222223342651232421224 +7115343354233333232372323253132342221232232311226422321722136322525334224424223223321312222223333232 +4357663662356634546546765162524356556634434553343632666244395322153624565646225555345655566333465356 +2434343323323343342133252224322722324433333334422225233327143133352225134332374235484355434423321374 +1222252522232132523226226225267532752122243221523212222122224321337666223242631221222122242226252622 +2327332235127463626626621337227622858425364527752132212321323245321645326236343171423221625251761627 +5143312422222264523313532221243252242262241221552323712434423533212231135242225373522222333252243414 +2233873448923333213233237234315234232333333433353463333123337333633333332733322355224533333773372694 +6342346344334456623423254555234952146436432456242565674356553445434543524446245423534532524355535842 +3231222524241322342342223321233231332222634322332314231223212323232436223372353212431121252233352322 +4333335332232322233333231333232333333332354364223353434331233243323223533253632332333623513123322312 +2212212222223222321121322222321125232226121222222322222224221222222222322222221221222221232511212222 +3122221222121222544224224252252241122232222112223323231212134233131122224112214222225212222122232422 +3211356356222122215133526332233222322311255422224221241321336132223233242237246223926142867353622623 +2331443223411422242214536224213122324724332231312222222234322331132333313232222232322442631342122212 +2221335223943374316123324235452224332232224324331562434433253432121353332529322122244445424445254222 +6573934424747346565665565666563655546652665666364255554665696265663763456632338556367633652946366667 +2121122324322222212122232125111223322232124363222232311432332233211222312223313321232212213421322232 +5255884695277765342363572543544553876324623533752442343727423412433746382453326451584533733454633395 +3638831234162153683163343733723333358337317391373322323532733343162133633642433523433237486722337372 +1223333523332243233132232332232223335335322323525322321334253333332323332533333517335353454323533223 +4341437444333434323332333383423324432334353314128323534343344343334432154544343354162334333334354223 +3226222346642252223631222337433121222224221622216145222252232446252342322122222234222322222325222341 +2322154512252221221222213714342421221422226227211322247212222252224232222312312223421222234221532221 +4277666476564646666636626617632542654642124484356434552454644676322636365366654435524567623648665645 +4326224251324511325445265235322123123134324131225323445323442349342222222355534412243223435424754223 +2322222132112221222122212212222522252222722242222224214422222223264222222222252222233222222221112222 +2324232122242332222222242221332221213324334323232222412222222222222222224223222142222212222212321212 +5311236232323322323422313262214232324232532322334323342351243423323223336232323332331123223222222212 +3266355733331546543725353338633394673355295863352513444433679544569528558382293953841353213138855383 +5221322222122222722222362222222112747121221212222222331224721222422242221825322222252212222222517222 +1225242246213315532223222232331732223421223323116522132322122232231532233133121222822222462132133232 +2221326812226423812362221223211116525411823421279171513527321224217226242124244542225824262212224351 +4453425564443325353335233324434534363336223333422622636323343533343244433436456533432334323233334362 +3224232512141532361423211324223522252221342256222223212234123221322422322242321222232222247422253222 +6125122313322332232213332221223133535333332422313523321243243222232215243223221535432223335333234523 +1351678243754931425378943558344359229876853933447853352374345385533544635655973754647345363157934433 +4244122244422342343123435242374137343342123432243334242222123211312232244453344324374231231324554252 +2322353332422513334235125325633252242233252413323412222522323325155334324223233211523224223352123324 +5313436256323342326122534332142462233522466423222235523454546145825561325814532466226535435225486422 +5434443545444364645323442442456213744146245265734444415252259444643332333464442244443545345639431334 diff --git a/day3/test_input b/day3/test_input new file mode 100644 index 0000000..a7353bc --- /dev/null +++ b/day3/test_input @@ -0,0 +1,4 @@ +818181911112111 +987654321111111 +811111111111119 +234234234234278 \ No newline at end of file diff --git a/day4/CMakeLists.txt b/day4/CMakeLists.txt new file mode 100644 index 0000000..bfeffed --- /dev/null +++ b/day4/CMakeLists.txt @@ -0,0 +1,2 @@ + # Use top-level helper to add the target and copy input files + aoc_add_day(day4 "${CMAKE_CURRENT_SOURCE_DIR}" main.cpp) \ No newline at end of file diff --git a/day4/main.cpp b/day4/main.cpp new file mode 100644 index 0000000..572cb64 --- /dev/null +++ b/day4/main.cpp @@ -0,0 +1,166 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct Diagram { + std::vector data; + size_t width; + size_t height; + + using GridView = std::mdspan>; + + auto grid() { return GridView(data.data(), height, width); } +}; + +namespace { +auto printMap(Diagram &diagram) { + auto grid = diagram.grid(); + for (auto row = 0UZ; row != grid.extent(0); row++) { + for (auto col = 0UZ; col != grid.extent(1); col++) { + std::print("{}", grid[row, col]); + } + std::println(); + } + // std::println("Map: {}", diagram.data); + std::println("Width: {}", diagram.width); + std::println("Height: {}", diagram.height); +} +auto parseMap(const std::string &filename) -> std::expected { + std::ifstream inputF{filename}; + + if (!inputF) { + return std::unexpected{"Some file open error.\n"}; + } + Diagram diagram{}; + + std::string puzzleLine{}; + while (std::getline(inputF, puzzleLine)) { + // std::println("{:3}: {}", diagram.height, puzzleLine); + diagram.data.push_back(0); + diagram.data.append_range(puzzleLine | std::views::transform([](char c) -> int { return c == '.' ? 0 : 1; })); + diagram.data.push_back(0); + diagram.height++; + + // ugly + diagram.width = puzzleLine.length() + 2; + } + + // also ugly, bound it with 0s + diagram.data.append_range(std::vector(diagram.width, 0)); + diagram.data.insert_range(diagram.data.begin(), std::vector(diagram.width, 0)); + diagram.height += 2; + + // printMap(diagram); + // auto ms2 = std::mdspan(diagram.data.data(), diagram.width, diagram.height); + return std::move(diagram); +} + +auto countMovablePaper(Diagram &diagram) -> long { + long nMovablePaper{}; + auto grid = diagram.grid(); + for (auto row = 1UZ; row != grid.extent(0) - 1; row++) { + for (auto col = 1UZ; col != grid.extent(1) - 1; col++) { + + if (grid[row, col] == 1) { + // std::print("checking [{},{}]:", row, col); + // shitty kernel + int upLeft = grid[row - 1, col - 1]; + int up = grid[row - 1, col]; + int upRight = grid[row - 1, col + 1]; + + int left = grid[row, col - 1]; + int right = grid[row, col + 1]; + + int downLeft = grid[row + 1, col - 1]; + int down = grid[row + 1, col]; + int downRight = grid[row + 1, col + 1]; + + // caveman shit + if ((upLeft + up + upRight + left + right + downLeft + down + downRight) < 4) { + + // std::println("Found"); + nMovablePaper++; + } + } + // std::println(); + } + } + return nMovablePaper; +} + +auto moveMoveablePaper(Diagram &diagram) -> long { + long totalPaperRemoved{}; + + auto grid = diagram.grid(); + constexpr std::array, 8> offsets = { + {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}}; + + while (true) { + long currentPaperRemoved = 0; + for (auto row = 1UZ; row != grid.extent(0) - 1; row++) { + for (auto col = 1UZ; col != grid.extent(1) - 1; col++) { + if (grid[row, col] != 1) { + continue; + } + // std::print("checking [{},{}]:", row, col); + + // shitty kernal + int neighbors{0}; + for (auto [dr, dc] : offsets) { + // mdspan allows [x, y] indexing natively + neighbors += grid[row + dr, col + dc]; + } + + if (neighbors < 4) { + grid[row, col] = 0; + // std::println("Found"); + currentPaperRemoved++; + } + } + // std::println(); + } + + if (currentPaperRemoved == 0) { + std::println("Didn't remove any more paper this iteration! Stopping."); + break; + } + totalPaperRemoved += currentPaperRemoved; + // printMap(diagram); + } + + return totalPaperRemoved; +} +} // namespace +auto main() -> int { + auto testCase = parseMap("test_input"); + if (testCase) { + + // auto testResult = countMovablePaper(*testCase); + // std::println("P1 Testcase result: {}", testResult); + + auto testResultP2 = moveMoveablePaper(*testCase); + std::println("P2 Testcase result: {}", testResultP2); + } else { + std::print("{}\n", testCase.error()); + } + + auto realPuzzle = parseMap("puzzle_input"); + if (realPuzzle) { + // auto realResult = countMovablePaper(*realPuzzle); + // std::println("P1 Real result: {}", realResult); + + auto realResultP2 = moveMoveablePaper(*realPuzzle); + std::println("P2 Real result: {}", realResultP2); + } else { + std::print("{}\n", realPuzzle.error()); + } + + return 0; +} diff --git a/day4/puzzle_input b/day4/puzzle_input new file mode 100644 index 0000000..37b8d1c --- /dev/null +++ b/day4/puzzle_input @@ -0,0 +1,137 @@ +.@@@.@@@@@.@@.@@@@.@@@@.@@@@..@@@@.@@@...@@@@.@.@@.@@@.@@@@@@@@@...@.@@@@@@..@..@@@.@@@.@@.@@@@@@.@@@@.@..@@@@@.@@@....@@@@@@..@.@@.@.@@@ +@@.@@@@.@.@@.@@...@.@..@@.@.@.@....@.@@@.@@.@.......@@..@.@..@@@@@.@@.@..@@....@@@.@@@.@@@@...@.@.@@.@@@.@@@@@@@@@@..@.@@.@@.@.@@..@@@... +@..@..@@@@@@@.@@@@.@.@@.@@..@@.@@@@@@@@@@@@@@@@@@@.@.@@...@.@..@@@@.@@.@..@@@@@.@@@@..@@.@@@@@@@..@.@@@@@@@@@@@..@@@@.@@@.@@.@@@...@@.@@@ +@@@.@@@@@@..@@@@.@@@@@@...@..@@@@.@..@.@@..@@@@..@@@.@@@..@.@@@@....@.@@@..@@.@.@.@@..@@@@@@.@@...@..@@@@@@@@@@.@@@@@...@..@@@.@@..@@@.@. +.@@@@@@.@@.@..@.@@.@@@@@@@@@@@@@@@@@@@@@.@@@@@@@.@@.@..@@@@@...@@@.@@@@.@..@@@...@..@@.@@@@@@..@@@@@.@...@@.@.@@......@..@@@@.@..@.@@@.@. +@@@@.@@@@.@@@.@@..@.@.@@..@@.@@@@....@.@@.@@.@@@@@.@@@.@@@@@@@.@.@..@@@@@@@@@.@@@@@@@@..@.@@@@@..@.@@.@.@.@...@@@.@@@@@..@....@@@@.@.@@@@ +@@@@@@@@..@@@..@@@@@@@.@@@@..@@@.@..@@@.@...@..@..@@.@.@@@.@.@@...@@...@.@.@..@@@@...@@..@@.@@.@...@@@..@@@@.@@.@..@@@.@@@.@..@..@@.@...@ +.@@.@@@@@@@@..@@@@@@.@@.@..@.@.@@@.@@@@.@@.@@...@@@.@@.@@..@@..@.@.@@@..@@.@@@@....@.@..@@@@.@@@@@.@@@..@@..@..@.@.@@.@@@@..@@...@@@.@@@@ +@@@@@@.@.@@@@@@@...@@@@@@.@@.@@@@@.@..@@@@..@@@@@@.@@@@..@@.@@.@@@..@@@.@@@@@@@...@@@@@.@.@.@.@@@@@@.@@@@@@@@@.@..@@@@@@@@.@.@@.@@.@.@@@. +@...@@@@@@@@@@@@.@@@......@@@.@.@.@.@@.@@..@@@@@.@@@@@.@@.@....@@@.@.@@@@@@@@@...@@@@.@@@..@@@.@@..@@@@...@.@..@@@...@.@@..@..@.@@@@@..@. +@@.@@@....@@@.@@@@@.@@@.@@@@.@@@@.@@@@@.@@@.@@.@..@.@@@@..@...@.@@@@@...@@.@@..@..@@.@.@@.@@@@.@@.@.@.@@.@@@.@@@@@@@@@@@@@@..@..@@@..@@@. +@..@.@@.@@@@.@@.@@@@..@@@@..@@.@@.@..@.@@@@@.@..@.@..@@@.@@.@@@..@@.@.@@@@@@@@.@@@.@@@.@@@.@@@@.@@...@@@.@.@@.@@..@@..@.@.@@.@@@...@@@@@@ +@@@.@@@@.@@.@@@.@@@@.@@@.@@@.@@@@.@@@@@@....@@@...@@.@.@.@.@@@.@.@@@....@.@@@@@..@@@@@@@.@..@@@.@..@@@@.@@@.@@@@@@.@.@..@@@@@@@@@@..@@@@. +.@@.@..@.@.@@@.@@@@.@@@@@.@@@.@@@@@@...@@@@..@@@.@@@.@@.@@.@@..@.@@..@@@@.@@@@.@@@@@@.@..@.@.@@@....@@..@@@@@.....@@@.@.@@.@@@.@.@@..@@.. +.@@@@.@@@@....@.@@.@@..@@@.@@..@.@..@@.@@@.@.@@@..@...@.@..@@.@@@@.@.@.@@@..@@@.@@@@.@@@@.@.@@@@@@@@.@.@@..@.@@@@.@.@@.@.@.@...@.@@@@@... +@@@@..@@.@@@..@...@@..@@@@.@@.@.@..@.@.@@@@@.@.@@.@@@@..@@@..@.@@@@@@...@.@.@@@@..@@...@..@@@.@..@@@@@@@.@@@@.@@@@..@...@@@.....@@....@.@ +@@.@@.@@@@@@@.@.@.@.@..@@@@.@@@@...@...@@.@..@..@@.@.@.@.@.@@@@@@@@..@@.@@@@@@@@..@@@@.@@@...@.....@@.@.@.@.@@@@.@@@@..@..@.....@@@@.@@@@ +@@@@@@@@.@@@@..@@@@@@@@@.@@@..@@.@@@@@@.@@@.@@.@@@@@@@@..@@.@@.@.@@.@@@.@@.@@....@@.@.@.@@@.@@.@..@@@@.@.@@@@@..@@@.@@@@@@@@@@@...@@...@@ +.@@..@@@@@.@@@@@.@@.@..@@@..@@@@@@@@..@@....@@.@.@@@@@.@@@.@@@@..@..@@...@.@@@.@@@.@@..@@@@.@.@@@@...@.@.@@.@@..@@@@@@@@@.@@..@.@@@.@@@@@ +@.@@.@@.@..@.@@@@.@@@@.@@..@@.@.@...@@@@@@@@@..@@@@.@@@@@.@@.@@@@.@@@@@.@@.@.@@@.@...@@.@..@@@...@@@...@@@@@.@.@@@.@@@@..@@@@..@@@.@@@@@. +@@@..@@.@@@@@@@@@.@@@.@@@@@.@.@@@@.@.@.@@@@.@.@.@@.@.@@..@@@..@@@..@.@@.@@..@.@.@@@@..@..@.@@@@@@@@@@@...@.@@....@.@..@@..@@.@..@.@@@@@.. +@.@.@@@@@@@.@.@.@@@.@@.@@@@@@@@@@@.@@@@@.@..@@@@@@@..@@@@@.@.@@@..@@@@@.@..@@..@.@@@@@@@.@@@..@.@@@.@@@@.@@.@@.@@@@@@..@@@.@@.@..@@@@.@@. +.@.@@@@@@...@@@.@@@@.@@@@@@@@@@@.@@@@.@@@@.@@.@@...@@...@@@@.@..@@@@.@@...@.@..@@@@@@.@@@@.@.@@...@@@.@.@..@.@.@@@@.@@@....@@@@.@@.@.@@.. +@..@@@...@....@@@@@@@.@@.@@@@@@@.@@@@@@.@@@.@@@.@..@@.@@@.@.@@.@.@@@@@@@@@@.@@@@.@@@@@.@@.@..@@@@.@@..@..@...@@@..@.@...@..@@@@.@@@.@@@@@ +.@@..@..@...@@@@..@.@.@@...@.@@@@@.@@@@@.@@@...@.@..@@@..@.@..@....@@.@@.@@@@@@@.@.@@@.@@@@@.@@@.@@@.@.@@@@.@@@@@@@.@@@@@@@..@...@@.@.@@@ +@@@@@@.@@@@...@.@@@...@@@.@@.@@@..@@@.@.@@...@@@.....@@@.@@@@.@@@@.@.@@@.@@@@@...@@.@@.@@@.@@@@@@.@@@@.@@.@@@@@@@@@@@..@.@@.@@@@@.@@.@@@@ +.@.@@@@.@@@@@@@.@@..@@@@@@@@....@@@...@@..@.@@@.@@.@.@.@@@@..@@...@.@@@@.@...@..@@..@@@.@@@@.@.@@@....@..@@.@@@@@@...@@@@@@@..@@@..@.@@.@ +@@.@.@@@@@...@@@@@.@.@@@@@@.@@@@.@@..@@......@.@@@..@..@@@@@@.@@@@@@@.@..@@@@@@@@@@.@@@@@..@@@@...@.@@@.@@@@@.@..@@@@.@@@@@@.@@@@.@@@@... +@@.@.@..@.@@@@@@@.@.@@.@..@@@@@@...@@@@.@@@@@@@@.@@@@@@@.@@.@@@@@.@@@@.@@.@@@@...@.@.@@.@.@..@@@@@.@.@@.@@@@@@@.@..@@..@@.@@..@..@.@@@.@. +@@.@@@@@@...@@@@@@@..@.@@@.@..@...@@@.@@..@@@.@.@@.@@@@@........@@.@@.@.@.@.@@@@@@@@@@@.@.@@.@@@@@@@.@.@@@.@@@.@@@@@.@@.@@..@@..@@.@@@@.@ +..@.@@.@@..@.@@..@@@@@.@@.@@@@..@.@.@@@@@@.@@@.@@@@@@..@.@@@@@@.@.@@@@@@.@.@.@@@@@@.@@..@.@.@@@@.@.@@@.@..@@@.@@@@.@@.....@.@.@.....@@@@. +.@@@@.@@@@@.@@.@@@@@@.@@@.@@@...@@.@.@@.@@@@@@....@@@@.@@.@@.@@.@@@@.@@.@@@@@...@@@@@.@@@@@..@..@@@@....@@@@..@.@@@@@.@.@@..@..@..@@@@@@. +@@@@@@.@.@@@..@..@@@.@@@.@..@.@@@@@@@@@@@.@.@@@@@..@@@.@..@@.@@....@@@.@@.@....@@@@@@@.@@.@@@@.@.@.@@..@.@@@@@...@.@@@@@@...@@..@.@@@@@.. +@.@@@@@@.@.@.@.@@@..@@@@@.@@@.@@@@@..@.@.@@.@@.@@@.@@@@@@@@.@.@@@@@@.@@@@.@@.@@.@@.@.@@@@@@@@.@@.@@.@@.@@@@@@@@..@@@@..@@@......@@..@.@@@ +.@@@@@.@@@@.@@@@@@.@@.@@@@.@@.@@@@.@.@@.@.@@@@@...@.@.@@@.@@@@@@.@@..@@@@@@@@@@@.@@@@.@@@..@@@@@@..@.@@@@.@@@.@.@@.@@.@@@@@@..@.@..@.@... +.@@....@.@.@.@@@.@@.@@@@@@@..@..@@..@@@....@....@@....@.@@.@.@@.@@@@@@@@@@@@..@.@@@@@.@.@@@@..@.@.@@.@@@@@..@@@@@@@@@.@.@@..@@@@..@@@..@@ +@..@@@@@@.@@@@.@@@.@..@.@@@@.@@.@@@@@.@@.@.@@@@@@@..@..@.@@.@.@@..@@..@@@@@.@@@.@@@..@@@@@@@.@@@@@.@@.@@@@@@@@@@.@@@.@.@@@@@.@@@@@.@@..@@ +@@.@..@.@@@@@.....@@.@@@@@@.@@@.@..@@@.@@@@.@@@..@.@@..@.@...@@@@@@@@.@@.@@..@@@@@.@@@@.@@.@..@@@.@@@@@@@@@...@@@@.@@@@@@@@@@.@@@@..@@@.@ +@..@@@@.@.@@...@@@@..@@@.@@@@.@..@.@...@@@@@..@@@.@@@.@..@@..@@@@@@@.@@...@@.@@@@@.@.....@@@..@@...@.@....@@....@@@@@@@@@@@..@@@@@.@@@.@@ +..@.....@@.@@@@@.@.@@@@@@.@@..@..@@..@@.@@@.@@.@.@@.@@@@@@.@@.@@@.@@@@...@.@.@.@@.@.@@..@@.@@@@..@@@@@.@.@.@@@@@.@@@@@@@.@@@@@@.@@@@.@@.. +.@..@@@@@@@@@@.@.@.@.@@@.@@.@@@@@@@@@@.@@@.@.@...@.@@.@@@.@...@@.@@@@@@@.@@@.@@@...@@@.@@.@@@.@@@@@@@..@@....@.@.@@.@@@@.@.@.@@@.@@@@..@@ +@.@....@@@@.@@.@.@@@@..@@@.@@.@@@@..@@@@@@..@@.@...@...@@@@@.@@@@@.@.@.@.@.@@.@@.@.@.@@..@.@@@.@@@.@...@@@.@.@@..@@@..@@...@@@@@@@@@@@.@. +@@@@.@.@@..@@.@..@@@@@@..@@....@..@@@@@@.@@...@@@@.@@@@.....@.@@.@.@@@@@@..@@.@...@..@@.@@@@@@.@@.@@@..@@@@@.@@@@@..@@.@@@.@@@@@@@..@@@@@ +..@.@@@@@@.@.@.@@@.@@.@@@@@@..@.@.@.@@.@@@.@@@@...@@.@@.@.@@@..@@.@.@.@@@.@@@..@@@@@@@@@@@@.@@@@@@@@@@..@.@.@.@@@@@@@@@@@@.@@.@@.@.@.@@@@ +.@..@@@@@.@..@@@.@@@@@@@..@@.@@...@@.@@@@@@@@@@..@.@@.@@.@@@@@@@...@@@.@.@@@.@@@@.@@@@@.@.@@.@.@@@@..@@@..@..@@@.@@@.@@.@.@@@@@@.@@@@@.@. +...@@.@@@..@@@@.@@@.@..@@@@@.@@@.@.@@.@@.@.@@@@....@@.@@..@@@.@@@..@.@@....@@.@@@@@@@@@@.@@@@.@@..@..@@@..@.....@..@..@@@@@@@.@@@@@@@.@@@ +@@@@.@..@@@.@..@.@.@...@@@..@@@.@.@..@@.@@@..@@@@@@..@.@.....@.@@@@@.@@.@@@@.@@@@@@@@.@@@@@@@@@@...@.@@@.@.@@@@.@..@@.@@.@@@@.@@@@..@@.@. +@..@....@@@..@@@@@@@@@..@@@@@@@@.@.@@@@@@@@@@.@.@@@@...@@.@@@@@@...@.@.@@@....@@...@@@@@.@..@@.@.@@.@@.@.@.@@@.@@@@@@@.@@.@@@.@@@.@.@@@@. +@.@.@@@@.@...@@.@@@@.@@@..@@@.@@.@.@.@@.@@@.@@.@@....@@@@.@@@@.@.@.@.@@@@..@@.@@....@@@@@.@@@@@.@..@@@@.@.@@..@.@@@@.....@.@.@@@@@@.@@@@@ +.@.@@@@.@...@@@.@@@.@@.@..@@@@.@@.@@@..@@@@..@.@@@@.@@..@@@@.@.@@.@@@.@@@..@@@@@.@@@@@@@@@.@@@.@@@..@.@.@.@@@.@..@@@..@...@..@...@.@...@@ +@@@@@@@.@@.@.@.@@@.@@.@@@.@....@@.@@.@.@@@.@.@@.@.@@.@@@.@@@@@@@@@...@@.@.@@.@@..@.@@@..@..@.@..@@@@@@..@.@.@@@@@@.@@@...@@@@.@@.@@@@.@@. +@.@@@@..@.@.@.@.@@.@.@@@.@@@@..@@.@.@@@.@@@.@@@@@@@@.@.@@@@..@....@@..@@.@@..@@@@.@@.@@@@..@@@@...@@.@@@@@.@.@@@@.@@..@@@@@.@@@..@@@@.@@@ +@@..@@.@@@.@..@..@@@.@@...@@@@@@@@@@.@..@.@.@@@@@.@@@@.@@@@@@.@@...@.....@@@@.@@@@@@@@@.......@@@.@@.@@..@@@@.@@@@..@@@@@@..@@..@@@@@@.@@ +..@@@@@.@.@@@@@@@@@....@@.@.@.@.@@@....@@.....@.@@@@@@@@.@.@.@@@..@@@.@@.@@.@@@...@@@..@@..@@@.@@@@@@@.@@@@.@@....@@@@@..@..@@@.@.@...@@@ +@@@@@@..@...@.@..@@@....@.@@@@@@@@.@.@@@.@@@@@@@@@.@@@.@@.@@..@.@@.@...@.@@@@.@@@@@@.@@@@@.@.@@.@@.@@@.@.@@@@.@@@@.@@.@@.@.@@.@..@@.@@@@@ +@..@@.@.@@@@@.@....@@..@@@@@@@@.@@@@@@..@@@..@...@.@@@..@.@.@@.@@.....@.@...@@@@.@@.@.@@.@.@@@@.@@.@@.@@@.@@.@..@@@.@.@@@@..@@..@@.@@.... +.@@.@.@@@@@@@@@..@.@@@.@@@@@.@@@.@.@@@@@..@@@@.@@@@@.@@@@@@@@@@.@.@@@@.@@.@.@@@@.@@@@@@@@..@@@..@@.@@.@@@.@.@.@@..@@@.@.@@@@.@@@.@@@.@@@. +@@@..@.@@.@@@..@@...@..@@@@@@@@@@@.....@.@@..@@.@.@..@@@@.@@.@...@@@.@@@@..@@@@..@.@@@.@@@@@@@.@.@@..@@@@@@@@@@@@.@.@@...@@@@@.@@@......@ +@@@@.@@@@@@.@@.@...@@@...@@@@...@.@.@@.@.@@..@@..@@@.@@.@@.@@@.....@@@@@.@..@@@...@.....@@@@@.@@.@@.@@.@.@.@@@@@@@@.@.@.@.@@@@@@@.@@..@@. +@@.@@@..@@..@@..@@@@@@@@@@@..@.@@...@..@@@@@.@@.@...@@@@..@@@.@@@@.@@@..@@.@@....@@..@@@@.@@@@.@@..@@@@.@@@.@..@@@@..@....@@...@@@@@@@@.. +.@.@.@@@..@..@@.@.@@@@@@..@@@@.@@@@....@@@@@@.@@.@@@.@.@@....@.@@.@@@.@.@@.@@.@@.@..@@@.@@@.@.@.@@@.@@@@@@.@..@@@..@.@..@@@@@@@@@@@@@@@@@ +..@@.@.@@.@@@@@.@@@@@@..@@@@@@.@.@.@@@..@@@@@@.@@@@@@@@...@@..@@@@@@@@@@..@@.@.@@.@@@@@..@.@@@@.@@@.@@@@@@@@.@@.@@@@.@..@@..@.@@..@@@@@@. +@..@.@@@@@@.@@@..@@..@@..@@..@@@@.@.@@.@@@@@.@..@@@@..@..@@.@@@@.@@@...@...@.@.@@.@@..@@.@@@@.@.@.@@@@.@.@..@@@.@@.@.@@.@@..@@@@@@@..@@@@ +@@.@@@@@.@@@.@@@..@@.@@..@.@@..@@@@.@@@..@..@@@@@@.@@@@.@.@@@@@@@.@..@@.@...@@...@@@@@...@@@@@@@.@@@@.@@.@@@@@@.@@@@@@@.@@.@..@@.@@@@@.@@ +@@@@@.@@....@@@.@@@.@.@.@.@@@@@@@@@@@@@.@@@@@@.@..@@@@@.@.@@.@.@@@@..@@@@.@@..@@..@.@@...@@.@.@@.@@@@@.@@.@@@@@@.@@.@.@...@..@..@@@@@@@@. +.@@@..@.@..@@@@@@.@@..@.@@@.@@@..@.@.@.@@@.@.@..@@@@@@.@@@@@.@@@.@@@@..@.@@.@@@@@@@...@@@.@@....@@.@@@..@.@.@@@@.@@@..@@@.@.@@..@..@@.@@@ +@@@.@@@@@@.@@@.@@@.@.@@@@.@@.@.@...@@.@.@.@@@...@@@.@..@@@@@@.@.@.@@@@@@@@@@@@..@@@@@.@@.@.@.@@@@..@@@@.@@..@..@....@.@@@.@..@@@@@..@@@@@ +@@.@..@@@..@@.@@@@@@@.@@.@..@@@.....@@@@.@@@.@.@@.@@..@@.@@@.@@.@@..@@@.@@@@.@@@@..@.@@.@.@@@@@@@.@@@..@.@.@@@@..@@..@@@@@@.@@.@@@@.@@@@. +@..@@@.@..@@.@@.@@.@.@.@@@.@..@@@@@.@@.@@......@@@.@@.@...@@@.......@@..@@...@@@@@.@@@@@@@...@@@@..@@..@.@@.@@@@@.@.@..@@@@@.@@@@@.@..@.@ +@@@.@.@.@@@@@.@.@@...@@@.@.@@@.@@@@@@.@@.@@.@@.@@@.@.@@.@@...@@@@@@@@@....@@@.@.@@.@..@@.@@@.@.@.@.@@@@@..@@@..@.@@.@.@@@@@.@.@@..@.@.@@@ +@.@@@@.@.@@@@@@.@.@.@@@@@@...@@@@..@@@.@..@.@@@@@@.@@@....@@@@.@.@@@@@.@@@.@@@@.@@@@@..@.@..@..@.@@@..@@..@..@.@@..@@..@..@@.@@@@......@@ +@.@@.@@@.@@@@@.@@@@@@.@@@@.@@@@@.@.@@.@.@@@.@.@....@.@@..@@@@@@.@.@..@..@@.@@@.@@@@....@@@.@@.@...@.@@@@.@@@@..@@@.@.@@@..@.@....@.@@@..@ +@...@..@..@@.@.@@@....@@@.@@@@@@@@@.@@.@@@@..@@.@.@@..@@..@@@@@...@@...@@@.@..@@.@@@@.@.....@.@.@@.@@@@@@.@.@@@@@@..@@.@.@@@..@.@...@@@@@ +.@@@@@...@.@@..@..@.@@@@@@....@@@@@@@@@@@@@@@@.@@@...@..@@.@..@@@@...@.@.@@@@..@.@@.@@.@.@@.@.@@.@.@.@@@@@@.@@@.@@..@.@@@@@..@@@@..@@@@.. +.@@@@@@@@.@.@@@@@@.@.@.@@@@.@@.@@.@.@@@.@@@..@.@@..@....@..@.@@...@@@@@@@@@@.@.@.@@@..@@@@@@.@@@@@.@@....@@@@@@@@@@.@.@..@@....@@@@@@@@.@ +@.@@@..@@@@.@.@@.@...@.@@..@.@@@@@@@.@@@.@@.@@.@..@@.@@@.@....@@@@..@.@.@..@@@@@@..@@@@@@@.@.@@@@@.@.@.@.@@.@....@@@..@@..@@@@.@@@.@@.... +.@.@.@@@.@@@@@@@@.@@@.@@.@@@.@@@@@@.@@..@.@@@@@@@@@@.....@@.@@@.@@@@@..@@@@.@@.@@.@@@@@@@.@@.....@..@@@@@@@@@@@@.@.@@@@@@.@@.@.@@@.@.@@.@ +@....@..@.@..@....@@.@@@.@@..@@.@@@@@.@@@@@@..@@@..@@.@...@....@.@..@.@@@@@@@...@@@@.@@@@@@@@@.@.@@..@@@@@@@@@.@..@.@@.@@@@@@@.@@@@..@@@. +@@@@@@.@.@@@@@@.@@..@@..@.@.@@.@.@.@@..@.@@..@@@.@@@@@@@@...@....@.@.@@@.@..@.@.@.@@.@...@@..@....@@.@.@@@@.@..@..@.@@.@@@@@@...@@@@@@@@. +@@..@@@.@@@@@@.@@@@.@@@@@...@@...@@..@@@@@..@@@.@@@.@.@@..@@..@@@@.@.@.@@@.@@@@.@@.@..@@...@.@@..@@.@.@@@@...@.@@@@@@@@..@@@@.@.@@@...@.@ +.@@@@..@.@@...@.@.@@@@@@@@..@@@.@@@@.@@..@..@..@.@@@.@.@.@@.@....@@.@..@@.@.@@..@.@@.@@@@.@@@@..@...@@@@.@@@@@.@@@.@@..@@@.@@@.@@@@@@@@@. +@@@@@@..@.@.@@@@@.@@@@@@..@@@@@.@@@@.@..@@@.@@@..@@....@.@@.@@@@@..@@.@.@@@@@.@.....@@@.@@@@.@..@@@.@@@@.@.@@.@@@@.@@@@..@@.@@.@@..@@@@@@ +@@@..@@.@....@@.@@....@@...@.@..@..@@@@@.@...@@...@.@@@@.@@..@@.@@@@@@@.@@@@@@.@@@@@..@@@@@@..@..@....@...@.@.@...@@@.@@@@.@@....@@..@@.. +@.@..@@.@@.@@@..@@@.@..@@..@..@@.@.@@@.@@@@@@@@.@..@.@@@...@@@@.@@@@@@...@.@@@@@@.@@@@@.@@@@@@@..@@@.@.@@@@@@@@@.@@@@...@.@@@@@.@@@@.@@.@ +@@.@@@..@.@@@@@@@@.@..@.@.@.@@@.@@.@@.@@@@...@@.@@@@@.@@@...@..@@..@@@.@@..@@@@@.@..@@@@@@@...@@.@.@@@@@@.@@@@@.@@@@.@.@@@@@@.@.@@@.@..@@ +.@.@.@@@..@.@.@.@@..@@@@@.@@@@@@@...@@@.@@@@@@.@@.@@.@@@@@.@.@@@.@...@.@@.@.@...@......@@@@@@@@@..@@...@@@@@.@@.@@@@..@@@@@@.@..@@@@@@@@@ +.@@@.@.@..@@@@.@@@@@.@@@.@@...@@@@..@@@@@.@@.@@@.@@@..@@@.@@@@..@.@.@@@@@@.@@@.@.@@@@@@.@@@.@@@.@@@.@@@..@..@.@@@@@@@@@..@@.@@@@.@@.@@@.. +.@..@..@.@@.@@.@@@@@@.@.@@@@.@..@.@..@.@..@@.@@..@@@.@.@.@.@..@..@.@@....@.@.@@@.@@@@@..@@@.@@.@@@@@@@@@@@@.@@@.@.@.@..@@@@@.@@@@@@@@@@@. +.@@.@@@@@@@.@...@@.@@@@....@....@@@.@.@.@@..@@....@.@@@.@...@.@@...@@..@@@.@..@@..@.@@.@@.@@.@@.@..@@@..@@.@.@@@@.@.@@@@@@.@@@@@@@@@@@.@@ +@@@.@@.@@@.@.@@@@@@@..@@@@@@@@..@@@.@@@@@.@@@@.@@@.@@@...@.@.@@@.@.@.@@@@@.@.@@.@@..@@@@.@@@@@@.@@..@@@@@@@@@@.@@@.@..@.@@@@@@@.@@@@@@@@. +@.@.@@@.@@@@@......@@@.@@.@.@@@@@.@@.@@..@.@@.@@....@@@@@@.@.@@.@...@@.@@@@.@@@@@@@@@@@@@@@@@.@...@@@@.@@@@@@@.@.@@@.@@.@@@...@.@@..@.@@@ +@..@@@@@@@@.@.@.@@@..@@@@@.@@..@.@@.@@@@@@@@@@.@@..@.@@..@.@@@@.@@.@@@.@@.@@@@@@.@@@..@.@@@@@@@@@..@.@@@.@@..@@@@@@@@.@@@@.@@@@@@.@..@@@@ +.@@@@.....@.@..@@@..@@.@@@@...@.@@@@@.@....@@@@@.@...@.@..@....@.@@@@.@@@@@@@..@@..@.@@@@@@.@.@@@@@..@.....@.@.@@@@@@@@@.@..@@.@..@..@.@@ +@@@.@@@.@..@@@@.@@..@@@@@.@@..@...@.@...@@@@....@@@.@@.@@@@..@@@@@.@@@@@@..@@@.@@@.@.@@@@@@@@.@@.@@.@.@.@@@.@.@@..@@@@..@@@@.@@.@@@.@@.@@ +..@@.@.@.@@@@@.@@@@.@.@.@....@@.@@.@@@.@@.@@.@@.@.@..@@@@...@..@.@@@.@.@..@@.@@@@.@@@.@@.@@@.@@.@@..@...@@..@..@@@..@.@@.@...@@@@@.@.@@.. +@@@@@.@@@@@@@@@@..@@.@@@....@@.@@@.@..@..@.@...@@@@@.@@.@@@.@.@.@@.@@.@..@@..@@@@@@@@.@..@@@.@.@@..@@@@@@@@.....@@.@@@.@@@@@..@......@@@@ +@@.....@....@@@@.@..@@@@.@@@.@@@@@@@@@...@@.@@..@..@.@.@@..@@@..@@@@@@@.@.@@@.@.@@@@.@.@.@@@.@@@@@.@@@.@..@..@@.@@@@@@@@@...@@@@.@.@.@@@@ +.@@@@..@.@@@.@.@.@@@@.@.@..@@.@@@@.@@@@@@@@@@@@@@@@.@.@@..@....@..@@@.@@@@@@@@.@@@@@.@@@@@.@.@@....@..@@@.@@..@....@@@@@@.@@@@....@@..@@@ +@@@.@.@@@@......@@...@.@.@@.@@@..@@@.@.@.@.@@@@@@.@@@.@@..@@@.@@@@....@@@@.@@@@..@@.@@@.@@@@.@@@@@@@.@@@..@@.@.@@.@.@@@@@..@@..@@..@.@@.@ +@..@@@@..@..@.@@@.@@@..@@@@@..@@.@@@.@.@..@..@@.@.@@@@@@@@@@.@@.@@..@..@@@.@@@.@@@@@....@@@..@@.@.@@@.@@.@@@.@@...@@..@.......@.@@@@@@.@. +@@.@@@@.@..@..@.@@@..@.@@@@@@.@.@..@..@.....@@@..@@@..@..@.@@.@@@.@.@@.@.@@.@....@@..@@@@@@@@@@@@...@@.@@@..@@.@@@@.@.@@..@@@@@@@.@@@.@@@ +@@@@@..@.@@@@@@...@.@@@@@.@@@.@@.@.@@@.@.@@.@@@@.@...@@@.@..@@.@@.@..@@@@.@.@@.@@@@..@@@@@@@.@@@@.@.@@@@...@.@@@@@@...@..@.@@@.@@....@.@@ +.@@.....@@@@@.@.....@@.@.@.@..@@.@..@@.@..@@.@.@.@@@@.@.@@@@@.@@@@@@.@..@.@.@@@@@@@@...@@@@.@@.@@@@@@@@@@@@.@@...@...@@.@@...@@.@.@@.@@@. +@....@@@@@.@..@..@..@@.....@@@@..@@.@..@@@@@@.@.@@@@@.@@@.@@..@@@.@...@@..@.@@@.@.@@..@....@.@@@..@@@@.@@@..@@..@@@@...@@@@.@...@@@.@@@@@ +@@.@..@..@.@..@@@..@@@@.@@@@..@@......@@@.@.@@@...@@.@@@@@@@@@@.@.@@..@@..@@..@@@@@@@@@@@@@.@...@.@.@@@@.@@.@.@@...@..@.@.@...@@@@@.@@@@@ +@@@@...@@@@..@@@..@...@@.@@@.@@@@@..@@@@.@..@.@@@@@......@@.@@...@@.@@@@.@@.@..@.@@@.@@@@@.@@@.@@..@@@..@@@@..@.@.@@.@@@@@...@.@...@...@. +@.@@@..@@.@.@@@@@..@..@.@@.@@@@.@@.@.@@..@@@@@@@@..@.@@..@..@.@@..@..@@..@@..@@@@.@.@.@.@.@@.@@@..@.@@@.@....@.@@@@@...@.@@.@...@@...@@.. +.@@.@@@...@@@..@@.@@..@@.@.@@..@@@......@@.@@@....@@@@@.@@@@..@@.@....@@@..@@@@@.@@@...@@@.@@.@@@.@.@@@@@.@.@.@@@@@@.@.@@@@@..@@..@@...@@ +@@@@@@@@...@@...@@@@@@@.@.@@.@@@.@.@.@@..@.@@..@.@.@.@@@@@@..@@@@.@@@@@...@@....@@@@.@@.@@.@..@.@@.@@..@@@@.@@@@.@@.@.@@...@@@.@@@..@@@.. +@...@..@@@@@..@@...@.@@@@.@.@.@@@@@@.@@.@.@@...@.@..@@@@@.@.@.@@.@.@.@@@.@@.@@@@@@@@.@@@.@..@.@@@.@@@@@@.@@.@@.@@..@@.@@.@@@..@.@@.@@@@@. +.@@@.@@....@@@@@@.@@@@@@@@@@@.@.@.@@@.@@@@@@@@..@@@@@.@@@@@.@@.@@@.@@@.@..@.@@...@@...@@.....@.@@@@.@@.@@.@@@.@.@..@.@@@..@..@@@.@.@@.@.@ +@.@@.@@@@.@.@.@@..@..@@@@..@@.@@@@@.@@@..@..@@@@.@@.@@@...@@@@@@@@@.@@@@@@...@@@.@..@@@@.....@.@@@@@..@.@..@@@..@.@@@.@@@.@@@@@..@.@@@... +.@.@@@.@.@...@.@@@.@.@@@@@@@@@@.@@...@..@@@.@.@@@.@.@@@@@..@@@@@@@@@@@.@@@@..@.@@@@@@@@..@@..@@@@@@@@..@@...@@@@@@@@.@.@@@@@..@@@.@.@@@@@ +..@@.@..@@.@@@.@@@@.@.@.@@..@@.@@...@.@.@@@@@.@...@@@@...@@@..@...@@@....@@@@@.@@@@.@@@@@@.@.@@@@.@.@@@.@@@.@@.@.@@.@@.....@@@...@.@@@@@@ +@@@@.@@@@@.@@.@.@.@@@@@@@@@..@@@@@@@@@..@.@@@.@@@.@@@@@.@@@@@.@.@@@@.....@.@.@@@@@@.....@@.@.@@.@..@@@@@.@..@.@..@...@@@.@..@.@@@@.@.@@@@ +@@@@.@@@..@@@.@@@@@@@@@.@@@@@@@..@.@@.@@@@.@@@..@.@..@@.@@...@@@@@.@.@@...@..@@@..@@.@.@@@@.@@@@@@@@@@@....@@.@@.@@@...@.@.@@@@.@@@.@@@.@ +@@@.@..@@@@@.@@.@@..@.@@@..@@@@@@@.@@@.@@@@@@.@@.@...@@@.@@..@@@@@.@@..@@@@@@@@.@@....@@....@@@@@@@@.@.@.@@@.@@.@.@@@@@.@.@@.@@@.@@@@.@.@ +.@@.@@@@..@@@.@.@.@@@@@@@@@@@..@..@@@@@@@@@@@..@@@.....@@@@.@@@@@@@..@@..@@@..@@@@@@..@@.@@@@@..@@@@.@.@@@@..@@@@@...@.@@@.@@@@@@.@@@.@@@ +@@..@.@.@@@@@.@@@.@@@@@@.@...@.@@.@@@..@..@.@@@@.@@.@@@@@@@..@.@@@@@@@@.@..@.@@@...@@@.@@.@@@@@@.@@@@@@..@...@@@@.@@.@@.@.@.@@.@@.@@.@.@@ +@.@@..@@...@@@@@.@@.@..@@@@@@.@@@.@.@@.@@@@@@@..@@@@@@.@@@@.....@@.@@@@..@@@...@@..@..@@@@.@@@@@@@@@..@.@@@@@..@@@.@@.@@@.@..@@@@@@.@@@@@ +@@@@@@@@@@..@.@.@@@@@..@@@@..@@.@@@@@..@@@@.@.@@@@@@@.@@@@@.@@@@.@.@@@@@@@@@@@@@@@..@@@@@@.@@@@@.@@@@@....@.@@.@@.@...@@@@@@@@.@.@@.@..@@ +..@..@@@@@.@@@@@.@@@@@@@.@@..@.@@.@@@@.@@@@@..@.@.@.@@.@@...@@@@@@@@...@..@..@..@.@@@...@@...@@.@@..@@@@.@....@@@@@.@@@@.@@@@@.@@.@@@@@.@ +@@@.@.@@...@@......@.@..@@@.@@@.@.@@.@@@..@@@@.@.@@@@.@@.@.@.@@@@.@@@@@@.@@@@@@.@@@..@@......@@@@@@@.@@@@@@@@.@@@@@@@..@.@@@..@.@..@@@.@@ +@@@@.@@...@@..@@@@@@@.@@@...@.@@.@.@@@@@@@@@@@@@@@.@@.@@.@@@..@..@..@@.@.@.@@@@@@@....@@.@@@@.@.@@@.@@@@@@..@.@@.@@@...@.@@@.@@@..@@@@..@ +.@@.@.@@@.@....@@.@@@@..@@@@..@@@.@@@...@@..@@@@..@.@.@@@@@@@.@@@@.@.@@.@@....@@.@@@@.@@@@.@.@.@@....@.@@@...@.@...@...@..@.@@@@@..@@@.@. +..@@@@@@@.@@.@..@@@..@.@....@@..@@@@@.@@@..@@@.@@@..@@.@@@.@@@@@@@.@.@@..@@@@.@.@@@......@@..@@@.@@@@...@@..@@@@@.@.@@@@@..@.@@..@..@@@@@ +.@@@.@.@.@.@.@@@@.@.@.@@..@@.@@@.@.@@@@@.@.@..@@@@@.@.@@.@@@@@@@@..@@..@@@@@@.@.@@@@.@@...@@@.@@...@@@@@@@@@.@@.@@@.@@.@@.@@...@@.@@.@.@. +@.@@@@.@@@.@@@..@..@..@@@@@.@.@.@@@@@@@.@..@@@.@.@.@@.@@@@...@@@.@.@@@@..@.@@....@@@@.@@@@.@.@.@@@@@@@.@@.@@@@..@.@@@.@@@@@@.@@@@@@@@.@.@ +.@@@@@.@@@@..@@.@.@@@.@.@@@@@@@..@@.@@.@@.@.@.@.@@@@@@@@@...@.@@@@@@@..@@@.@.@.@.@@@@.@@@.@.@@@@@@@@@@@@@@@@.@@.@@@@@.@.@..@@..@@.@@@@.@. +.@@.@@@@@@..@@.@.@@@......@@@@..@@@.@@@.@@..@@@@@.@@..@.@@@.@@.@@@@@..@@@@.@.@@..@.@.@@.@@@.@@@@@@@..@@.@.@...@@@.@..@.@@.@@@@.@..@@@@@.. +@.@@@@..@.@.@@@@@@@@@...@@@@..@.@@@..@@@@@..@..@.@@.@@.@@.@@@@.@@.@.@@@@@.@@@...@.@@..@.@@.@@@@@@@@@@@@@.@@@@@.@@.@@@..@@@@.@@@@..@@@@@@@ +@@@@@@...@..@.@@@..@@.@@@@.@@..@@@.@.@@@.@@@@@@@.@@@@..@@@@@.@.@.@@@@@@.@@.@@@..@.@.@.@...@@@..@@@@@....@@@@@@@@@@...@@@.@.@.@@@.@.@@@..@ +@.@.@@@.@@@.@.@.@@@@.@..@.@....@@..@@@@.@..@..@@@@@@@.@@@@@.@@@@@..@@.@...@@..@@.@@@@@@@@@.@.@@@@@@@.....@@@@@@@.@@@.@..@@.@@.@.@@.@@.@.. +..@@..@.@@@.@@@@.@@.@@..@@.@.@@.@....@@@@@@...@.@..@@@@@@@...@...@..@....@@@.@..@@@@@@.....@@@@@.@@@..@.@@@@@@.@@@@.@@@.@@.@@@..@@@@@..@@ +@..@.@@.@@@.@@@..@@@...@..@.@@@@@@.@.@@...@.@@..@..@@.@@....@....@@@.@@@@@.@.@@@.@.@.@@@@.@.@.@...@@@@@@@@...@@@@@@..@@@@@@@.@@@.@.@@@.@. +@@.@.@.@.@@.@.@@@@..@@@@@@@.@@..@@.@@@@@@@@.@.@@.@.@.@...@@.@.@@.@.@@@@@@@@@@@@@@.@..@.@.@@.@.@@@@.@@@@@@@@..@..@...@.@@@..@@@@.@.@@@@@@. +.@.@@@@@@.@..@@...@@@.@@@.@@@@@@.@@@.@@@@@..@@.@.@.@@@..@@@.@@..@.@.@@@@@.@..@@.@@..@@@@@@@.@..@@@@@@.@@.@@@@@.@.@@.@.@.@.@@@@@@@...@.@@. diff --git a/day4/test_input b/day4/test_input new file mode 100644 index 0000000..9ad769d --- /dev/null +++ b/day4/test_input @@ -0,0 +1,10 @@ +..@@.@@@@. +@@@.@.@.@@ +@@@@@.@.@@ +@.@@@@..@. +@@.@@@@.@@ +.@@@@@@@.@ +.@.@.@.@@@ +@.@@@.@@@@ +.@@@@@@@@. +@.@.@@@.@. \ No newline at end of file