diff --git a/2022/.idea/runConfigurations/Day_03.xml b/2022/.idea/runConfigurations/Day_03.xml
new file mode 100644
index 0000000..577ee0c
--- /dev/null
+++ b/2022/.idea/runConfigurations/Day_03.xml
@@ -0,0 +1,24 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="Day 03" type="PythonConfigurationType" factoryName="Python">
+    <module name="2022" />
+    <option name="INTERPRETER_OPTIONS" value="" />
+    <option name="PARENT_ENVS" value="true" />
+    <envs>
+      <env name="PYTHONUNBUFFERED" value="1" />
+    </envs>
+    <option name="SDK_HOME" value="" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/03" />
+    <option name="IS_MODULE_SDK" value="true" />
+    <option name="ADD_CONTENT_ROOTS" value="true" />
+    <option name="ADD_SOURCE_ROOTS" value="true" />
+    <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
+    <option name="SCRIPT_NAME" value="$PROJECT_DIR$/03/main.py" />
+    <option name="PARAMETERS" value="" />
+    <option name="SHOW_COMMAND_LINE" value="false" />
+    <option name="EMULATE_TERMINAL" value="false" />
+    <option name="MODULE_MODE" value="false" />
+    <option name="REDIRECT_INPUT" value="false" />
+    <option name="INPUT_FILE" value="" />
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/2022/03/input.txt b/2022/03/input.txt
new file mode 100644
index 0000000..0b6d449
--- /dev/null
+++ b/2022/03/input.txt
@@ -0,0 +1,300 @@
+VdzVHmNpdVmBBCpmQLTNfTtMhMJnhFhTTf
+FgqsZbqDDFqRrhhJnsnLMTfhJG
+bRRRPrRRwSwbDqgjvDZbRbQzpzmQVWCzzBdvQBFCzlWV
+GcDdRdvhRssRhGDdShCRtqWjlQzqWgqzNfNjfQWWjt
+mwwnnPFwmVrPmJmzfNzqCjQCbgVlgC
+nPnHHLrHwmJTrCTJpThBscBSdSLGZvZBvRhZ
+RVQQcVlcSRclfZCCCnMJJTSTnC
+NdHwjdwjbBBZrrZrbJDZJJ
+wmhjGGBGwwmjtjtdPlfRcpVQlhRppVJF
+pplbNBPPrppllrFNbpvppSTcwqcWFhTTShhJDTchqd
+RGzRfLjjmZmfmwLftTWhStStJWTdWmDm
+nfsMjQssnpPvNnrPrw
+SjjBgllzlQjBZvlBBgcFbgJHsMhJqbMHPggJbM
+hRLRVDdRRWnJqnnHTqMCnH
+GRfLddRRpVhNVrWSjwQQzSzcGSBQSc
+qMwNqqBdQdnTVBBVVhMVnVFzTHPggTPjGRDzvPTjjmvPDj
+sbSrWJpStrtPtRPttzmmDD
+pfbJJcbsrcLpWLllsnFmcqcwQncnQQqVNQ
+RBTWCMwCwdZThPZcZZ
+pVmVpHLFFFHHVgVmvNmHSQNvddlPPzZJMPcdhclhjczLdZMP
+vnnNnFStGMRDwWnn
+fWDdJTpDJzdBBBdmDSbSRHRwPqbPbHgSbz
+slQtQvNsMVvrrgPRgRglnhwWPH
+sGMMQFrsjvNMfWmdpfFDFZBf
+vnMRMWCMJwWWwwWPjmSdVmLdzvVbLrhL
+HsNfDHQlZpNqfQzbLbrqhjLmVdjd
+dfDZQsNpstHHHptZDDtZWgngtgBMPMMRwCPtBBGW
+HwQwwbwFNWHwHBVFQFLQzRznZnSzcjjjpPbcPpSP
+vTfTJsCmsftJZmTSSdPvzdjRSvPdjd
+TrGtTJfmGDfDhrhJJJsqrZhDBFLHHLLQWFwwlWBVBBVwgLFD
+FFTJRLccQgmTbSsbGm
+PBPPqCvCwqwhQQVhQngmVmSgglmGnHbnmb
+zqthvtQPBfCCzPwQPtwQzPwNLfNRFNLdLRLFRFFNLFdFdW
+nszjQnsPwjznzCCrhJqvjqhmBv
+tFWdHGWFGtctlNNpZBBhmqTrrbWqvTBT
+dlFtcpHDVVVHFdNGHGpGfQgsPDzSMsQwwPwgLLBQ
+TzQqTJGvnnSzqrWTnvfbbcflQcVltfcCMPVM
+jFjNZFFJLpFwmBwblcpptcVtfbbVlR
+jmmJdBBLNdGDWDDrdzqn
+pzddqQmGgbqgGpbJmmdnLZDCRZnZvFlLRZLSlLRT
+rVwchcBBMwVBHhHTZCTSGSCRTZlTDr
+HtccPfjfBhMtVBGHWpNqJdJdpjNJppWz
+WThTWWhtPbZRvvWbbvRTSRMjVRLLgFssgLpVsfSF
+JdwrlJcCwfzdqwwjsjzpLMgVsMFgML
+lQrwHNGJHClvTmfhBmPQmt
+lbRLhcLRpLJzgdGddF
+qvhwqDDCVtBDVhfMVGFnzGGzTBnGzGGgFg
+VjCwCWCMtjVDtChvQhtffcSmHpNWrrcHZHHZpplWbp
+DJVDVdvpmZdPgrCbgbgCJC
+lzczcWwwznGhBgPSvTlCrNgqNC
+wGzzQhzGGsBBGRBcQwGwnwjmmRHpRfmmMpppMjjHDvLL
+HJjJQWjFmmWtFmJTMchghhDwNMhVMWML
+SznPSRfRSSPdrrPSShbDVhbLPwcwGGwVNh
+ddRfzdRrCrRsZDSnFjspvFvqFqFqTvJt
+lflfjQfjvljfbfMLTTDCmHNLNVbL
+HSJnRrrJZJssnGRrnsrcqqRnDCLBMhVCTLVLhVNVJBBBhhBm
+SsrGGqqnSsWSnnqWHSrPfzftvFdvWlwfQgQwWvzz
+nQlsGnFGwwqNJWmJJjpplt
+HMTLPTRdvsTCCThDCZdLdLDNNpJBWJbjJMpBmbtNptBWmm
+DLCzPzTzZDdLdGSGfSGrsnQGzr
+LNPPLHNPHQNQSBFDWDPgggFv
+hszfWCWJhrBMsSSBgvFD
+GGZjfmJTjmZfrJrZrZJRGwNQnlLNHWjLVjlwdVNHpV
+BdNVdTcGVclmTwrTnwPwrHCr
+zttBWzfLsCggHPwDrf
+szsWSMbWzzbqBbzJjtjsvMzzvdmdVpGllpcRNZZhmRpZcGGc
+CjdbMmmmZFnzzgHlttGBVqtBGtsldG
+LvPPWNcFSSRslWhBsllT
+ppccvLPpcSNwLLwrDNNpLvwJHCMDmbCJbFzgmZZmFgbgnM
+TTNRwZqhcTTjsNTTsmrJlvrmmmqqHSrlJH
+fLQCCdtcfCDDVbVVQdFbQbdJHMHrJHrHnMllHdMHPrMdln
+WfQLQWWDbwRTWcRssN
+HQGQWHPDHNjMNQGNWNTWCvZllzqFZqzvvzhCtvFj
+DfgwdgfcFpchztvt
+sRggdwwVdgmnSTnnDBPBNWLn
+WbCZCfTVTTJjSwGdWNDGGw
+MMRqggMsqhlmlhrssHgRnRmRvdzdczvdNGNLzScGDrNzrLNc
+lRqsnRhmqqQnQpgQMlgDqRfBTJVFbJZQtBCbZQJVZFFb
+JnhQcCnmLDsmgmgr
+bbMZppRFGGRPfBMMRGMZssTTrLlLfsLlVLdsLsdn
+GZGSpPGMZtGGPFFRGBCwhvwjjcnJctvQcvHq
+vvrPrHZMGJNRMnqn
+BVChWWcDVWsBwCWwGrJNhRLJJnJtLqnq
+cjDfcfpWWsfWccBsHgPgrPTdpZbbgggv
+GshtVtVtjSCVtVvVGtlVvFZLMvLRZmHmZwbLwZdLdZmR
+JWzNDQzjcgJgQBJgzgMwLLHZZcdPwRLwRdHZ
+QWTppBWfDrrNBTTfffhFCpVSjnhCGsFtsqSl
+nmbCnzHHNzCjCJHJNSCWHLBLrvBrrSGRBDhrDRLrGL
+TVtPllwcgdmTRhLQTQhT
+fdFtccFcpPmggfdfNzHzCMsbCnWnJs
+fMgddvjgRRvjvjVJVdTlZGGtGnrlnqTccNjl
+HHSFSWSmmpbBpZlGncrNGbNtrn
+WDWBDDBDBDCwPBWBDWNQDgzvVvLRvsVLRwvwdJVLwL
+ZSmmvcpsmcJmJvqgBZgZqqtCtZjl
+WhDwhFSDgtBFjnFg
+rTrSTLWTTHNMNwNrMVddwNNhsmJGQcRsRcJGsJzQJsrzPsPm
+GBtLmPsCQqsGqgghZHDzzgLbFz
+zjjVTzTlRjRJfznrvrfpnNhFSghbbNFgHrbHZbDHbH
+vpfcTJVpcVlfcQPMPCGzCBsd
+HMhZNffcPZfNMrzjjFdGcJDjvJ
+VSBVVLlSQQmTVSWpSQzDrHzTTvDvFjFdGGzT
+mQSplVHWbHLSgWQnShNwsZMZPfbsNCRNCt
+MMqvDzLwZzlMqQfdGWPfgPffPglH
+ShTcJshsrRdnrdfrrfHp
+VVRtFhsCJVJVvwQqDdbDQd
+dmnNMlFNvmvljnbpMWNDFQvfQJJGvfPCfHGgQQgcJg
+bRVzLBSSTRBRBBrwTrVtRwCfcGHcsJgJgzgGsggHCzcC
+ZbtVTTrrqrSSVwhqqwBRwFWMDFNdjdZpWjdDDppjMW
+MTzqtbLtwFzJgbHgfbdWWH
+VMNBjNVjvNfhhhhfNPhP
+jmGMvlDZZnVMtzlwzqqCpwFt
+PpzGspGmpPsFLrTnTLzzBg
+QCWvfjfWjRPFZgrvqrBvTg
+wwNRCNQQVNRWjNWfQbHCCClHGDGJdGhpdhtPGhltDlJD
+dhbpGzhllzGlPvnzNcvtNVnc
+gcFMsTJDMMwrZqfjjqvvfnPtqJ
+sWRWTRFwrTgLDDFWgMsTlpSlpbSCdWWdcbmpChGd
+QccdFFFcFbcQPQPHMgpPMp
+NJlNSSMLDfJfmlSqHZRNpRqNBRPRPq
+LlMmJfvDVVTJSmVMscsCFtvwcjWjrjCj
+NVVMGWFSMRVGWSthwhTJWzcJCcJsTs
+jqRLqlfRZcmjcCzT
+rlRRrdrflpdvPbHpflfPlfDBgBMQpGVQMgpVDGMggBDV
+VwRhccRsnQStRhtGQVQVsmjgDgqJdggDjqLDgJlLzmLl
+BWFZpWHBNCBCNBzBNvWBpzHZqqlMqgNdlllDdqDgJDLlfDdd
+pFbTrrrBzbzTtSwStQnnsrVn
+DRfFbFqzbddfPFtsJnJRsnClJRsn
+cgjgQgWvSLVQgmWWgWVjVSSSBTltThLnqJssnTCZsTThntZT
+qjwpSrmWgcSrGMfdFDFdwHFd
+RWjDDWDjDNjjgDtSRRgjcjzFpnzwdFbFNdbFbpnldwFF
+vQfPfTQJbZdThTzL
+PrBQJQsfQqrrbfmPqMBfJbggjRVgWjttsHRSgRctDjSs
+NgqNWqqWWdnJdqpBNFtCmJGCDHttDGDsHsHm
+BjvzhRLTrTBQhTMQRjRRcjPGtmDCZZDZSCmmMSSZmVmSSt
+vQzRvRzQcPcvfQzRnddppFgnFfWwBFlb
+nnPvfvgrtPDHgvvGTRRRPZQGpGCLLV
+FlBsBdbllFdfWpbGMCVMZLVbZQ
+lhchNcqFsJBlBszztvwHjvzgrzmzffgH
+zZhdjTpJJpjmmpPZhvqnnZHqZcggvgMbgv
+tFpFQFSFtBGlFNwFfNMnHfbHcnvcvcfvcqrM
+GBFlNLSNVGVSSGtQSLLBBlNtphDdzpmmPmTPhRmdzdVCCDdR
+rpRCCDLpmnCdJCjn
+vMhSFvgsMGLmnmWMmm
+wVqFFvwvPPHhFhhgHPwHshpqrDDzqlfRbpftRLblrllr
+CRNDzdJCVDWzVgDjdjzRJzWRMTbHsMNZNbZMMbsfhTtMTLMB
+wSlwQcSpqPpcqcqFSqpwslsTfZtLhtlthtBHtTMZ
+SPGFGFFmpcPGDrWDmjDJVffR
+dsmdtJthJphWqHRPnRRsvvnnfR
+cDBMDDDlBZglDZTMDfzVvNRrvNPVHzRRTV
+PGMCCDClBDDbbFqmmhqQdpWGmmWp
+BJjcGhcvCnBdGHsmHSzZDzSDMHmRMQ
+qLWPLVrTwWlwwwrfrFfGDNmDQRMbQMzzmmbQLNMM
+rVWrFlGqlqwVwVGgWGphnvgBBsnvsjdBnCBnBg
+sNNsfBsmcGmgNTcHHSpnTWHnpV
+QlrhlrlMglhDQrdFblvFtMdnDWwSHDWWwnTSjLwVDSwwwT
+QtdMvltZhbFlPPZbQtQthZQdqCsJJGzBqqCBmCNCqgRCBsfP
+SZnQnnHRWRQRVjHnqlJTQPfdlqfJftqG
+pDzmbDBFbBLvvzttfdlTTl
+gsDLLpcmsSZVwlnRsV
+LHsWjwjWqCLsqCHcLsjdLqcdbpMGZPPtBhthbZBpBhMllwPG
+VFnVbbvJSfbgphSpGlhRBBSP
+JrrTgmFgzvNbrmNnmnvzgTLjCQWDLDCsTjssjqcHLc
+QmwwqTqsrdqNNqgtvnVDVcGNNtvv
+WBFBpzzjSJBJzJbfntgPzVzcvPnzDf
+HcpbHZJBFpjpcSZrZsdRQZrCwrwd
+JqmLmbtTWThBTWvWGVSrrVDsSGSG
+wwzRzNjNNbsPVPds
+jfgQRZwpQclQfffHgpRpwpfTcqtLLqCbbFFFLmbmTTBnFB
+fGpcccNNqcctqGMprvMPmbbzFSflSRzPBBlBbS
+JCjnjTZTTGPSGmTFPb
+ZWHhJjHLDVDgHLLDGjnhctsstwqctNwWqNwwQrtv
+sDwQhcwhBDDwrhGsQnRBQHHMHHMNJMZFCFRbCRftMM
+zjjlmjqfdTqlWdzTqmLzlzVjNCHJNHNFMFtbJNZgVNMMCCtN
+vPTfLmPTLWBsPDnSscnS
+ngznwDPPTzhPPDCTQnTTDQBQqHNNrHFVppbbjRFFqFhHqRqr
+tZJtcGsGtLLcctRqVBbbqrspbHNq
+BmZSvGBMdWPzMPgnnz
+MpNWPVNWWZWVVNZHVcvJjgBjJMStMJSjjg
+rzdCzrCTTLRCslvJDSjjdScgDm
+RLhCQzqTCssThRQzRzwGQrrCFffbfWppNpWNWVcHqZbHpVPp
+zQzCVWdSSjCdjpchWcGftflGZcgG
+RwnJTJwmvFHTBFmtBccZZfBGMstllM
+wwvvHRwqDnHFrmqnrSbQVVQfSbqQjbqjbQ
+ttDftStSlftPgSHmJbFwnMnFwzbrLHMMzz
+GqTBqhBqBvppBvMMTznrCbCnLwfr
+RBjjpZZvvZqGcNhjjpNmDPfDcsgfDfgScsQQQg
+rsSFccvBHppHPsvQrSHSprFjnbLGdbzLfbGLLtLjjzLzvl
+JWWJhmwwTDTGtnzlhdbtLG
+CWNqWRNCwnCJVppQFFFFNrgHBB
+MSRVnMjnVRVnPlcsrtMtschgDl
+NWHBwJBwBBQCHHqwWQGBNgdrFFtsthcqdltdDsqttq
+CCTTGCNCCBfNJNNWbGGnvVzDSRfDRSZvLPSzRn
+MpRfjRjWpZzzzRzZSpjzZjTCQcGdHLWNGqdBdcBWWBLccn
+lrbrsPQDPQglDtwggcLCqnCdNNdHBLsqNd
+blwbJggvgbwlvQbvtgwmvVwRfTzfMMjFVfSFjZjMTSTSzj
+ttSGjHWVrwWrWWvhzvhmhDfR
+qMBdNNsccQgfDRzRmqlhRl
+gQJdfJPdQBsMggMjPrTCLjrGrCrtVT
+tGFdlwDwGFdNtStghWWdQFSnTVfCfZhrfVTVCVprnRRhVn
+cLsBPQJsQPmbmPHTnRRnHprCVfns
+MjmvPqqQjPbQzjLwwDWDSlzSlGSgwl
+NSCpFgfbscbZZZwrtgPZJT
+zGCQlVGmmQGVqqJwGtHZGrPHHRTH
+qQvVmvzmqCdhhjzCQLjljLQMnMDSFWcSfnMfpbfnNcFFbFDN
+zFgqjQBmWNlWlfHrHdLc
+wnbCpSSZZTJSJSnmdrtHfGtftlcpltpH
+ZSwhVPPJgNVmNFzs
+WNVJthVHRRfLqpqN
+gdCGcCgJBCrgScRLzbjQQLfRRR
+SCFdGSFvlhTJsnvW
+FFZwFZZwRmFFhHtNLNLGRtsqjLMt
+gbDnnrMbMCffMPbPLNjGNlcppNtspp
+rgbzrzDrgVgnrBzFWMWmWBwHWHShSB
+zjRVjDqzRjvSBnBGGsfsrFsV
+fLccLLZpJMctwJWWWJWpJGCwFwsgnngFBPsCnnTBPT
+LbJlZNWMtpMlHRNHzdfSDfdj
+VGbbnJGSTsVTssTTnVVWMtfBBmvftRHfHBMJJfZp
+ghqtrzgPrjdzQCjmZMHfRHZHBmQmmB
+gltFtDqFVlTVWlTl
+HqNqZDTvNvVTLPSTvzfrfHfdndffwnbdnwrH
+MpSJlFcMJmcpFlmClcMcRnWbWtthrnfwnCGrrWfrwC
+RjcJJmSFMRQpMRFjMNVvTZjNPPvLTBPBBB
+MzClDtlzJzFzNGGm
+bjcLRHlTBsFJGmRm
+HcPSSfTSpLZLbSwtrtvMnlDCDPCl
+gWWgQJCsVhgRLCWsdjpmcBHvfvrrnvCvBB
+TqDtztqtStlbNTPtllqZpvmcFHjNjvjNvHvmrrmj
+ztPPGZqTPSbJgchGgwRQgQ
+wVrdtTqtCCvbNgbNTTDN
+mhGzWhGzMGWGrRmbFLBHZRNHNvZvgB
+hhGhShpnsSrqVCVSSj
+HnlbmGnlHZHnlBcjgwfDVfwLsGLGLDgR
+WhWMWTvQPWPLDMFRCDMsVD
+QdzJQPSPZqJnJRnZ
+TTjTjFBcRBGjwsDTBLmrCftfRVrrCftCVNRP
+WnqbJWnnQJhSqVfVPfDnggfrVN
+hSlDMllvhbQqllZlSWQdSQTBjsFHBjTwGdHBTBszLzcc
+rNWqWDLZWcqFqLLLgQQJnndnQdNzzJVMzd
+cPtsPvChtRsGswHPGbwcPcdVnpzvnmBmVvJBJdJVJdzn
+PfRfRGtsHsSRftbbbbHhwCCsjZgSTgSZWDTcgDZjLqgqFWLq
+BNzPnPJNNMwHJRhBGRWRdjFQddFlFjWd
+npbZrgnLSCSrWFjjdlZGlcDF
+gqtmmngSbmgHJqfqzNBHBJ
+stgzttBPRRRdpSVVpdpS
+WJFcLQmJZHcCFLJmcZLMfbpGSWMNpGftSSpMrb
+mcvvQvHmtLCJmHZQHZHCDHJJnjqPjjPzwvwhnwPqTjPBzPnB
+DDmbbPqgFSbSQPtPQJttrltJ
+CRfcnZWmRRhJNVtsVnQlsp
+fcBvWvWzcZWCzTTCTTvccFMBHGDdSwGFFbqwFSGSmF
+tCRBPCPRjzsJszBmtjmCvSpHcppJpvZdHHHcHZJG
+qbrlLnWlQDQDNvmHHHHcrZZvdm
+nmnWnnWmgQsCFzFCRVCg
+sHMHCDZfcwMcRcLMcZDCRCHMPdJqgjvVdvqgdgfdJbQgvWQb
+FFhTzmzGrnmtjTBjBBprrmFtqGgQqvVdPbbgqQQWJvvWJQqV
+TrNjrnFSlwNZNlNL
+JQGdsdzSzsdFQFSdssnndNlZjNPTJZNljVjTPhVPhT
+GgGLfRmHGLhNVjjNTLhV
+HvGvwpbHHRwpBrvBgSSzSFndtzndCrsFMd
+DptFshMrhDhDwmPPhwSNhmmS
+RLdcdRvBjnvRVcvlcLbCcbCwwpGBwSmfZqqPPPPwzmfqZq
+VlRLvVjCJLnlpvvRdllLcJJWDHgMMHDDHtWFFDDQgH
+SsSdrndpDlCdLftd
+VGPVJgmQrVGHHZfwLlfCTmfwlDlT
+PcJHcGgcWWbJpjRrphRbFpRn
+PdPSMHMLzPPSShBdffMMzMRHQQrpppcqTCQQpCccTGTRCnCQ
+vsbWmFbmJmZFFsmsbfpGVrGnWrrpVpnnVcTV
+JZslstfZNNSSPdlSMwlM
+bLLzRzZLbRqJJrDGGVZdwssDvGQw
+FCtNJlTFtmPfldSvDvQFVVsjSv
+PmCPHBhhPpWLWgzgHJ
+qwmwFHCgPgPPqPwMCrHHFBVVRBttVRRffVfmsjVNNB
+WSvcSnvbSWbhcbjlQbvlSQhlfBGcspVVsVGfVscpzpNcpBtN
+hJSLhlvlTjPFHMLCCq
+bggDpTggncGVVWbQcG
+sRvSwwwFBSpFzvRvMFZqmPmMVqmcmPPVqhqqWq
+SRBBrFZZwrddBFRjlptnLgDnTggdtd
+PPfMcZMflbMQcMllPVfTVMwjWWmZvpWWpWhhjjpdWWww
+sDQNnzsnQgDNsFzFqtGjGmWWSpWrGhdpvphdSW
+nNQNqLBHLqzDnHgnVJfPJPCRBbfCcJlT
+fppppWsjcSDPjjDpGhgwbfTgHTCbHJwbHbTR
+rLBdQnvMNMmFPbLqHqTqgLHCgL
+nrFznvMNMQdttrBcScsDstWcPGtWSc
+lclnRSDnGZtvSwnZDZzhLffqdsCNwTBCBBdNsd
+mPjmjmrFFpmQjMJQjlNdlhCsCLsTlNLs
+ggmrHHVVQVPJpWrgpWScRvzZzGGRnZvlgzZn
+GjGJGQJGcMTVfFDQzNVQzP
+mHqdbmmdnJqVzVhRVNzPbR
+wStmHJsJsLZLjTvM
+QssMbVGdMQjZPjwVwHVZPZClllvgSgvlTgwwSSCgSCtC
+WmmFBmJrcFRBFrJJBFchzWCStgCTgvhvTlfsNqfTlvTv
+sFzzssDLzrBPjDVVddHMQD
+fztDZSGrNrlnbnPTgFFpln
+jvvQMMcLcjJmQwHdJvjQJnnbTbRFRphnnpsWgmFRPR
+vTLHHCQLHBBjJCSZrVCZtSfSfrft
+gHfHffHLjwHrRjLrLRZVMnTdTBsNTBwTVBsBnN
+DWPhqhhDhvSGvWPzSzMBQBQVMMBBmvssvQvQ
+CDGbqCDbChSbWGrHcHRgbcVcfrLJ
+frlTLmtllbbbdpJS
+qFjhzjThjHTFGHTjqhhjMzBhVpVpdbBnSJQRpBnVVdbRRQJd
+vjWPWjWPPPWgwmfCrNvTvZ
diff --git a/2022/03/main.py b/2022/03/main.py
new file mode 100644
index 0000000..3e82655
--- /dev/null
+++ b/2022/03/main.py
@@ -0,0 +1,26 @@
+from itertools import chain
+
+from utils.input import read_input_lines
+
+
+def middle(iterable) -> int:
+    return int(len(iterable) / 2)
+
+
+lines = read_input_lines()
+compartments = ((set(line[middle(line):]), set(line[:middle(line)])) for line in lines)
+misplaced_item_sets = (set.intersection(*compartment) for compartment in compartments)
+misplaced_items = chain.from_iterable(misplaced_item_sets)
+
+
+def get_priority(item: chr) -> int:
+    if 'a' <= item <= 'z':
+        return ord(item) - ord('a') + 1
+    elif 'A' <= item <= 'Z':
+        return ord(item) - ord('A') + 27
+    else:
+        raise ValueError(f"Invalid item: {item}")
+
+
+total_priority = sum(map(get_priority, misplaced_items))
+print(f"Total priority: {total_priority}")
diff --git a/README.md b/README.md
index d0e2a87..f9b2540 100644
--- a/README.md
+++ b/README.md
@@ -60,3 +60,4 @@ The versions should not matter, but I used Visual Studio 2019 with `MSVC v142 (1
 |-----:|----:|----------|
 | 2022 |  01 | Python   |
 | 2022 |  02 | Python   |
+| 2022 |  03 | Python   |