diff --git a/bin/d3/dune b/bin/d3/dune new file mode 100644 index 0000000..41343f8 --- /dev/null +++ b/bin/d3/dune @@ -0,0 +1,4 @@ +(executable + (public_name d3) + (name main) + (libraries core utils)) diff --git a/bin/d3/input.txt b/bin/d3/input.txt new file mode 100644 index 0000000..0e4ee5e --- /dev/null +++ b/bin/d3/input.txt @@ -0,0 +1,300 @@ +dtddvvhwttHJhwdhJPddhwJGppmGjgpQgTjQplQpTljwpg +BfzSzRSVVMVNRMDDNBSNSnfBmbrglGQbmNpQggFjpgpbQlQb +ZSBffLnVZdCCPJjhhL +RGCZpWWWFlHQQbgvFssg +jLnMzjnrnjjNjhrjdwbHscsVVgDVQPvPwh +nfJnLMLzjJMtnjNnnBbZtBWBqqbTTTBRpT +nddlhBtqTBqTVSlBtmCmVcRVmZggfWbcZc +jDjvPrPSNPwrDNRWbbgWCjRRCcWm +DzDwSpFrvrvFPQLzQnsqztBthTJnGJqlsJ +gssGmzwgRgsNmTsqgDnDJnbDHHhhzFdDDh +WQVFjMWrVQrVvVVjVctSSLSMZhnJZPBnbdnhbnHZZBDJBh +VCtcccVQLrfvrSlGmfTfNgfmlFgm +DsmfsBbNNZhDWsbmWmNbbPDHLFjcctjjGcnZGzncnctcGH +SwVQJrjVwpgSVRpjpVRrlTMCFFCLCFFcHzzGMcHrtHHH +ppVwTwSwpwvSlSlJTjVVbPhsvvBssWsNfsqWPvWs +BJwqwJtqqDDDrGDnPFzPFfpphD +TgZscCHQLSHgZcfMzpjFFjzsshfj +LcNlTVQCCVLLZTLNvpRtpvBBvRJmNB +bDBGQBBCTTNPGPPwPzcHfVHrDtLWLVrWVjjHWr +gpssqqsqlMFfLZQWftjVpr +lvqqFMRlFcQvbzCNCG +fhhMDdPhWMJMWvhhSfwRSGlzFbSFNlzw +LcqTCqcgZqjTggVjcwbFRwbDBTzbRGRwTS +cHLpZgnCHpQsDdsmQp +jwStJjJhtgJStpgwJMggQWqQTNTfNTWfbNNMCCNG +zRZnFPRZPVncPGVFRlRmGHCTqfCCPCHHfLfbTQCbTq +lnVmFZRZDnRVBFZcrZlhjpggvppthGhphpwprS +lcttSptHHllQbMcsrltSQGpvNBzpgWBBBDDGWzvgLz +PdjPVRFhFqFjRRCjzvRWnWLBLgbBBLzg +hhCCFbPTmjPdhZjhPhZCmTjjMsrJSfHrcmHJrHHmlcJSsmft +WhWnLZSSnSzQQhfLLNSfmDHrCFDDHtpjGGtTGQCG +gJbJBcMVwJlRRdbwvwJBVtjdtHHTmptpHTCtTFrFCp +JwwgvRMJlvJwgqgvqRMcnWWhLPzzsqfnZWnfWWnj +zdwTSvzHMvVSzDCtZhtGmbTGhm +lcBHfFjjgtsmDCgshD +cJPBnqNFnLfHJFPqljclqJzQvSSVWvSnMwvSzSWWdMWM +pNJMcZrsZDLDcbcccMpQffHqvgdwdFFmdmqwvqmgmzsw +hhnWjTTStRCGSMgvvgvdqvdFjvVz +hCTSWhPGttTCGBWMRlTCMSnPBDJpbDfDpNpbbNJfJDJbpJpN +lbcQcSNFchhQNqHLLqhLqrMpqM +WfsnsszPWfBBVpHdprrpdnGL +WTzWfwjtTBzwwBDzmfSSQmmbFZcpQNcbZZbv +PwSJSlmtPPgwgmHhPPvRvGHLRLQRBQGCQVGb +rnsFDnnfGGRWQRnW +dfTTfTFdfrfFFFzQFPJPSSlhqtllNPzgwS +MMbTFZrcrGZMDqNStWScDtzS +dvWmhQggQvCnfnqPqDnDjnfP +lgvdvLClWCQlgdhlrMBBHpGlwbHHGH +CQHgQpPdCQpsCpzRwSVRSzRZwZ +JbNBbcbrJvbJnqVznwwTzrzz +wNbfLvvfDNNBHPFLhddFsQss +VVzqvwzpqvzqNVVHGNqjHpNfSQDWdWwJdPWrWccdQrWrrDdd +nLcbtBRtBhcnWSJQlJSgll +tFbLLLRRhMtsBMtRCRsLCMBVjjvHTNjHHjzcvFFppGHzTT +QCPrPWNPlWjGGZqGmvdPGd +JgpHpSfphhfpVmBSgnTvdtddGvZVdvddDv +LhphBfHpSwSwfHcMgfpmBWWWbsNCjFWsljNbbjlLjb +QJmQbRmdfmdSQRQZSJltTltNvTrtDtrlftDD +wpZcHVwwMgBpWMVgWpHLphztDvvGvDPlnGvDLlNrDPnNPl +McgWFWHHHzVpMgZQFqbjsdjqqRCq +JPhLFfMJDLQnjNCvWWpdjjdM +crSwnwVnwSRBcNBNjjWCdC +GlbTGbsSzrtbmbfhnJQP +fDLSWVDRHHfVWHgPcZlDlZbbQhBcZQbb +jrmFmprTpFztmddjdjrpvBQlQZGhQbTsQbGcQbcbQs +nvqdpmjFnwpLSWlfnVNnWl +nZBRbBJzznNNCnJZwnBSCJMcpcTpcwhcqhmsmWMwFWLL +jQfvjgtfvPlHHqWpvWThpWqWch +VljjjgjQjrTDlDgrHtVCbnJZzNzNbnRNNJZrJR +MQtJnttlMLlJQsNhQrVVrFVWRRbbVFdJDD +vGjvzmjzgHqSjjSzmSGHTWbfDFWrbFzFfdDVrfRWDb +qPRqvTSPggqGgHCmllnCNLtnhcnnsnnw +zrlZsQMFrsgQFMMjMCbjVDCTCW +NqHNRdBppcJJcTpdmRfHThpdDWDtvbWVtbLjWbttWqqCCbLt +mhJpJHTJmBhcJhwhgwzsQwSSlzQQzGlZ +TvsszlvnzRRVTqzVrqrjjZGPfQPFqPqG +mcNhDNchppWmWSNhdSmSCQNjPFjrfGjrgPFCrgFPgPgrLf +SDddWpdMWSwNDmMNwlJRQwJlsVRRvzlsHt +DTtggjsFFFTlPJhvctBqBqSRmSMBSRnmnRcm +fGfwZdrbHVLdbGdHHwwQGVwBBCMMfvCNRNSMMMSRBmmRCN +dGZzGHGVVbvHvHwbzpGbHLrwFDDFTtsglhFspgJshslTDJjT +CbzspssWwCPcvvplrfqfDCJrDqdllB +LjttnjNTNGgQQJdBrffTwB +nVtLSgggjFwtMczhvzpZbSZW +HCzCHHvWthWFHhssWCVmnqZrnqVrmrmgnbrqmN +wPPGBjQQGwGbSlSLwgnpnrBZnBBmnMNnMN +jTTbJlJjPPLPGHHTthhhHcFWTT +qRdvvPDrCpzPHzcdrrcRqtbJJgjhgtWjJgbWJtgCFb +GTwGwNscLllGTZmGSTZGlSBMnhggjbgtgbtbsgWFFMhbMF +ZSQBSmlmzcrdQRqz +cSpTRphwwghRfgSScqPpnDqDCjDjJJJJDvDLCvvn +BVmmQFQBQVNBVmsWlbQFGBBlCHTJznzHLHvvCnjjNLHJDLHD +MFsZZMbBGblbQTmQsFsQMMfPcPcwSpwtStgPphZtctPc +QZbbZBdjPBjbQQbZnSSltlfwWvlvwNtNjwFMMN +DLVqTJqpSVtfsptwfWpv +rcRRVVTSbPQBPrBZ +tjSgSjLFSnVjDWRsQj +lcdqhfFpqZGpZqznrVRWPrnWRVBsVG +FHddNNNHwTHMHvvS +qCSDSQlwBHNbgJrHnLJH +GRpRpRfnmRWWVWgVrF +jhdZjpnvGfTZZQPlCtqQQSsS +FMZSGWWBrZjMBZMrBWMGjjZDnCRqpgPnbRwPbFnvvqFnDR +QHcpfVVslfdVlQclcctqRgqgbsCwbCwPCCCPwD +NLHfLhclmmhdfNNpfQMBmZWBrJMmZWBzMrjj +pBMpRgBMQwzRthmzLC +HPcJvrvDbjvrFDcvWrHfHfWHmdddtdTLztmtdtfllmNdNhNz +DvPFDvnPJLngQsggMGGQ +BbcFHvbhhDbbTSvZmwwgJPPlDlZldd +prCrNLMNgWWJBdrJ +fQMLCfLLtpqsNNMnnfBhcBSVGbhhhcqVbcjc +ZchcZZjmmNpgmJtgmM +RLrHllWrQZQGlBpbGFGFFM +RQnLHrqPLnZHzqjfVPcvVTfCvPTC +fMtwjfMwrbjfGrtrpPGrwpNNVNVqcbdVqHZTFNbcHSNL +mgzvDnJmnJhFJHSTNqZLHncHLS +vRzhzslJFhRffPPQMjGtGl +VMMNjWppQVwzNWrZdrrtMCMZCtMT +ngDScLcvPPgDPDGhGDPGSHVbHTHmZtTSrBHZbZBmBb +LhlglLghnVlplswJjs +bGJQZZTQQLJJbQZlTZLjCGQTsDhWFhmshhvjWVFVVrgtDsst +NScqwHcwwnnzBwqPqqsmVNhgsDDVtsghrFFg +pcrcwnpcffrcBzfbCRLpRLMMRlRLQl +hzCzCzpRgCzzzCctNsNWNqsZqZhPqNPb +TdBwmdrrrDmvwTvqNsSRssPlsWsq +FDBRRHDMTmBfmrmngnpjGgVptMgLCp +ZPLLnSPMFGvFZMSvHhDhqHfqvfqbDW +GgcppCgBcrQBBgplrVddhDqqqfdHgWdfqb +CcCjQszmGBQjrcCwCmCccPwPTPnMPTnMJSMMRZSPJL +LcVVcqqSHRLzRnCfNnGzNW +LZPPdljlCggMjgNM +PTvwlPtwtlJvZTQvbcHppFLHVVTcFssF +fpWzvzNgWJBVfBJzWzBVJNzWbZcbHhlbthjlrrPrjZZPHZhJ +hRDmGCFDwQnStncrjnccHcMP +GmmsGRmFTsFwSCsRQDsCSqqpfvfgzddWggvqdpfBWzVh +wjRBFljJGDFwwlGGpBSjGDtwTVtTgHHHsHHsVTVzsHqq +CPLNPdbWvbMWbcmvPNdLVqtsHqgCqHChZhhsVsHt +PWcPfPvmvNQbbWdWpJjJBDptGnDFjftn +mFFmJpDMmmnJFjWDVclsSpcflSsQwSsc +HrjNNjHNfVwLNSSl +tdZbhjHZHPbdCTvbbhhrGbbHMFmRMvnRRFmmvJMDmgJDJMnq +szJZhshbsfZJjbttchPctdTnWnRWVWMMnBdLRpMnBz +SrNwvDSwrCmnVRvjpWLBBn +ggGmgNFrgSDwmNgrCmtPsZPsjQGsqPcsqqJP +gjSWSjJSWrWzppzW +MCMzHNGNqHfscsFtrtwscVcr +qGHNGNHLCnLmTCHfMMmNTzzldzgJlJZZgJljgTdD +QGTQtQzTmdTsGTLcdFTGzdtBBjtwvBBJDvDMHJgjJvww +lPlqsZWnDJjZvZgV +ShCfCRnWGFsRRRrF +lwGtndCrrmGCwdmhzQrBzrHvLVggPgHv +fjMjDZJqSDJfJqDNDjJffjZLHPHHFvVFzHBLgLFpFpBSgL +MsTZWRNZfJZZqMGVGhhlhhccRnhC +MMvncqvcHcSnsdzzgvdfQjpljpQVTdDQDRTRlVpQ +wLCrNtBFFHHThRlH +bPJtHmCWssqgGPvq +LvTLsmDWvTWqTsmqjRTmjwgdwgnMHMMFgdtHmBmFVn +rlSCJzCSfpGGlhznQdnwFhtHgBFwtV +SGZJJSSrVfCbGJLjPsWbvjRsPTqR +pNqVVDCMVMBpqJVdMNHrccGHrtNtTFFFrQ +hwmllWbvvbnPvbSvtrFhhJzzHztcTztT +WSnbnPbbbvlWlRvnsqqMgLRMjLgVLCJdRV +GphVTGVMtQwtJmtCJP +FRRsBBsFqRNZNNrgqBdRfCZvbmPgmQzJQPnmJbJmQPJPPmwj +RNqsFrRfZZsZWvNqWRFvrBZvWhhCGVplhlWTlTpSCLpMhWMD +RZRjgbZHjjhsSnRsZstDRStsTVpFhBqFphMqPPpTFQVMPFTM +zrcGJwNNdwJrfNdJWvGdJzdTlTFlqTVPFTVFPPBpqNTbBP +WwLdLGfrRLStCZbD +mrmTqJWTvDDppTDb +DGzBfCzNDzdMwnLlbn +FVZPFZFFZPgjmWZsDtsq +TpnFTnFRCgRgldMRnDnRcrcdbdPBHbtPqbVcccrH +WNWLfQQmfhhSNwmrcbSVqPtbZDZcPb +LQhwLQvQvNfJhJRDMGFRlCMDMD +vLFTDmjVvLgnNHPphN +lMClGCmsRdCnPzCccngCpz +dlGZwRsRrRwswGsdSbbZSbVDrVBmDWWWFJrTrFvFTmqV +SGsZRqGLWLLtZRHRRcLHGTlJjzgJpjzTpNTNJNWpTm +MPMPvFFvFBrPPDPMQMPChjgpNpSNTmmmpNlTDljlTz +vnhrvMvnhSRqqLqnfn +mGFrlBmFQNQFljhqqqqbmHMsTPRbWWCsLMWRsb +wnwtvpwVzDVpvzzwZppnctMLtMPWWCstTsWTsTLffRRW +vwDJgZnvZJFqgLBFGqgl +QdGltnWNWqTdqQWvWsMJcrTcFcrgshJRMs +BzPLCDPzzzzCCLLfCBzfSDmLMrDJMglrcRbbhRsFhMrRJcsM +fjSzwwHfSzPzfCVBHlpdjGnZqnZptqQWjGvG +VbJZbgVzvzmhQpQWpQzhDp +tHPPcGcFBlCctCGtGcBBNlDLMGfMLwWfwwqMLLJwQWwp +dCHTPTPJdTBFPdrZjgsjrjnmdgms +JJpBvJQBZVvcFqqnsWdWvjsn +DCfbDbTtbgfCSHqqNdFMPhPDFnPPDWsPjM +bTmzTNCTNmfqTgJQcpLrpZLzVlVL +dtTLntTjzTftnmwnqGGQHNmm +SWbShCPMBgBRRFSFtRZZmm +DlJPCJCgPWhttzpvdjcpVl +WdzsNvWMzNsMHWddWCVffqmSmScLPvLPgLgLPplrrPmL +BtnzbnBhbwttwtZlmmlgcwSrLgmmpm +bFhQtbGBTnjBBbjTtFBbVDzddDDfjdDDqNWVjWHj +ppmtpgLLZLCbMQvQQThdtrvPhV +BBlHBwHRjHqBzzbHHqjjQdDQTDhPQDvnQlrQDQvr +HGjFzwHNczbzRFcGzHGFSJSpspsmpssMLLSZCppmfs +MpGrMMMcTsHMVHcvbwwmmcRSmDmDmv +zCNptqCBQQLCNLCzbfvSvbSzSDRDSmSv +CNNqNgNQJNgQtCqLlllZdZhTrThsnHpVVssPTsGP +jhSGcShDrLcLLFcw +MVzQvQNZVLHvHPdhLW +qzhhQlVbgqjmSjJDsgmR +CFzSPCgcsVVzFgzSCsBJwjdwJtNllnwglJlp +QrvbqWvvLbmvDMMmbdwFWpNNwwwwptjJWn +RZRZZqvvvDbDHCRTGchHFSGG +SszgPSPPVltDlqtz +WfTdTBdQdFnWBBBhBhNjVJtpNsVlDDDHHJWp +hQhrLFsBwdQPggbRgPwRMg +frRppMMDMpDnJfprnZhrrhpzWgvvGCvvFzWFvzvVVWFGJB +TcmLwTsccqwqbPwsdwqdTPSvBvzzztvggVvQCGWQCLBvCv +sswNjscwmqjwSssjdZNMfHHlHhfrnrgnfR +JpBJBdmdzZzzpngmbCnlqnNbNM +MMTHGccLTLvwRMlRnnQnbblnRnSs +vVGtvMcjLVGHfHDrPPWZppBpJpfZZZ +FGJtlttPdPtGFldlPRGpJTVzSBSSggHgJjVmBMHjJm +rhbvqrQLrWqrWLLfqbjjgNmVNSgzTmNgNS +hsffZQqnqCfZzlPPGlRlcwDs +HDDdZpcFwHFRFcZqDctpRDHpwTCVwjrBTQTBLBLBJJBjjQTJ +ldlMzhlPshPbLrrVrQQCMQjB +glzNfWlvbHqSdNNNcF +jZCMtnZZHCZwBWMwCwtMmfPFfvHDvzHFLPmFDfvh +RcrQdRRdGTzGvDGmfgjh +TsQscdQsQNTNqQQpRrRVCCBMMJJWMMVNVjnNJM +zVPWhVzLzWBWHZnlqBllqlpRbGNdffscGNdbDRnNSfcG +MtvSFQQwMcpsGRNGFR +vvTwJJSgmCSMmjVPPJWWhzllWLVV +RjdfnJfmbVvVJVFQcs +rZDZGBBZVvLZLHFW +qPzTDPlVrjNgfCdmPd +bcjmQPrnbmVmsLVrLrjmcHGRWlZHHRwHpZRHWWwH +nFhqzFqJzDJfvfSFqFfGHWZZHGRJRWHZWdpWwZ +hBCtDSSFCTqCCFzSnzMrLNmrMNPTNMQPMmNL +qvNBSJVDJGGVSJbVDDVhDbbqPjpWpWzWrnpWvvWPMjnWnpWz +mlTltwcwMWTPfNTN +CtCwFmCgmcmlRFmFCtRCHgmDJsbBhVqsbBHVDbNHDHJqqb +csBFBsLrBGBWcgLcBvRgpRhbwRwlbQwbwQgD +DCqmDmtTRtRlhdlh +qnCmTNPmmCnSSzmzNzGLzLccGDBzGrBLvvcW +FjfBjHnHzPFwhvFFqh +bjRpGsNsPqQvPclb +NWGGWGrrZVZjsCLmDMMgzgrSnzSm +MDgmmsNCmZMWmHCZLrvnLBBjPLVlPVbW +zcJGQwJdFRnrBVzqzvPr +hTQwhJwcfTFddFdGSfcRQQGFsggsgsHHnSmgsgsmgCnHNZpC +BPfwzfsgsvfszvBRbQpttRVpJbJpVg +LhTmHLbmbcFTFrWCbFqhFHLHVRpVtQpZVVDVprnDMJtJQnVZ +TGWWbTFFGTqlHhqhSdNdNfNSldjjBfjv +zCzpWTccHlWcPzMljMttbJfjmlfm +DqqQVZZqVsqJnbbnmjbJJQ +ZRmDZsSgVmGLsVqsLDFvrcccHrcTWCgWHBCHcCWp +cvGlQMtQlPtQWWMlcGsrFwFdbgdbdGGDCDCwdd +VChVZNBVjTTfhNTFgzrzrJgSdzgzwf +THThZTqZRHZRqNVZNTVLjRCMmQsntQctMnsPmMmMcWtLMQ +pNRHrbNlNnRLNpMMMTrcGcGTcccz +ZttBmsJmZdjsvTTvvdBMjDhfMGWGDfDfcScjfD +CmtTtwvtCsgllNHPPFbLpC +NpQcvwwRHvdfRvQsNfBQNvfRhVmVMqsZMmMshjMMtWZtMmrm +CGHbSSzFLSSHzTnbLnCWMrtWMtjnZMhZrqZtqW +FzCPPzLbPgFJbHSPldNRpgNfvvccgvwf +nSjpnnhNchMQZMSScnshshncJCGwHGClwmHPZlJPTVZCwHJf +LvtzBTgLWgLPlPwHPLPJ +dTBDqRqFzzhQFhshhNhM +HjjdPsjnllHsbnnDnbTBzLBFBZLLpRFRcCHRFz +wqqWwQhQQMCQffqqhtwMGhpZFRRZvzWzFvBvpvmcRvZm +fGfghtNhthqJrQqMqMMSgDdbPjbssDbdSnjCdd +cqPwJJnnffBFqSfJFnDDPVplLdglGgLVjzGLdVSzVt +WHRTWNHsQTNbzsbCbTsvWrWtjlgVdLgLdvdgvmLjpGlgtm +ZMQrTbNHZNsHHrQCZrNDFzhwnMJcfnDhJPPPFh +LRCFbjNjbCZDmtmqmRRmLtFJBgWBBpvJMwBJvGjBBvMBgw +TTrlfHzccVllZhdQgdGMJWvgWgBndwpG +fVSshSVlsfslhsSHHSZtZZNmNFmtmbFCDF +SPGCBPDMtbcbCtchSMccDTTrrrTFTrsrMTWHTHFVWF +JmnzqVmmwwfpJpmdHRTRsdsTrFdrQp +LqwLgzJgnjqLwgGcVbtjDGjcVbhv +PQcMvrvMsvmdSPPVccmSJcSpGBWWWbBHfWWnfttJWnWJpJ +wDzqhjzmqRzDRwqDzNDbWtjWBBBtGbtHpHnnBf +zglRhDqqDZgRNmZQVCdcCPQvvdZv +RpVjRgvFjGBNWtBWFDtt +dcqQwlqMMsCLLfbgQmtD +snlgzsggTzSTSJTr +dLHhDdtlMngFcFsFLFzzsj +vWRGGRVrrWvvGQQJBRsmQzmsqnffqcNfNcfz +vSRVJBVBwTvWTnHphTgDgtMpDl +bvvGnnJbfPmfdgJJSVtwwCpTScVfNpSC +sjsZWDqBqqMRZsDjbWMVwtwNNcNtScRHpRRttp +hzhDqqWDzZzDZzZLQPJPdPnPvlrbGdlnFQ +PwWHTwzFvNHsNzmmMwzNWGQrCqCFjpZbpnGqrqnpbr +gRVRgJRJlDLSJddDccQVrtZnCqjndnrZdnqnqpdq +chhgSSJfQhRRcSSSSBLVfzmzHTNzMNsTNWHMMvMP +lftqSpBSvhlDBDlhBSczQGmcFMcMVVFMmGFWsm +rHLHTNdggsLLnwLHbTTgdrTMPPmMGWZGQQMzQVQFZQGM +gbJnrHHjnbrgLrRrHpBJvSBDDsfJsDtstq +dBTtFLTtVmpdLhMprSRSWMRSMR +QvJvQbjbCgCQRBhzzRsNWNBC +bjgGqQGbQnjGQgnQgbGgjJnDLHLdfPVtdDmLZdBFVVZttdTf diff --git a/bin/d3/main.ml b/bin/d3/main.ml new file mode 100644 index 0000000..de6fd30 --- /dev/null +++ b/bin/d3/main.ml @@ -0,0 +1,47 @@ +let split s = + let half = (String.length s) / 2 in + (String.sub s 0 half, String.sub s half half) + +let find_duplicates s1 s2 = + String.to_seq s1 + |> Seq.filter (fun c -> String.contains s2 c) + |> Seq.fold_left + (fun acc c -> if String.contains acc c then acc else acc ^ String.make 1 c) + "" + +let priority item = + let num = int_of_char item in + if num > 96 then num - 96 + else num - 38 + +let find_duplicates3 s1 s2 s3 = + find_duplicates s1 (find_duplicates s2 s3) + +let get_duplicate dup = + try Some(String.get dup 0 |> priority) + with Failure _ -> None + +open Utils + +let part1 l = l + |> List.filter_map (fun s -> + split s + |> uncurry find_duplicates + |> get_duplicate) + |> List.fold_left (+) 0 ;; + +let triplets l = + let rec aux res = function + | [] | [_] | _ :: _ :: []-> res + | elv1 :: elv2 :: elv3 :: tail -> aux ((elv1, elv2, elv3) :: res) tail in + aux [] l ;; + +let part2 l = l + |> triplets + |> List.filter_map (fun triplet -> + (uncurry3 find_duplicates3) triplet + |> get_duplicate) + |> List.fold_left (+) 0 ;; + +"\n1: " ^ string_of_int (read_file "bin/d3/input.txt" |> part1) ^ +"\n2: " ^ string_of_int (read_file "bin/d3/input.txt" |> part2) |> print_endline diff --git a/lib/utils.ml b/lib/utils.ml index 0f1ada6..08d22ad 100644 --- a/lib/utils.ml +++ b/lib/utils.ml @@ -9,3 +9,18 @@ let read_file name = | None -> close_in ic; acc in aux [] +module CS = Set.Make(Char);; + +let set_of_string str = + let rec aux s i st = + if i < 0 then st + else aux s (i - 1) (CS.add s.[i] st) in + aux str ((String.length str) - 1) CS.empty + +let map_pair f (a, b) = (f a, f b) + +let curry f x y = f (x, y) +let uncurry f (x, y) = f x y +let uncurry3 f (x, y, z) = f x y z + +let swap x y = y x