LdHVLDLDdHdtLMhcqCqGWcWg ZZQZSZnnJrQrJQJbfzfnWGWPWMcChMMPcqMnhFcF ZrzpWzfbpQpWbzvZWZpdtVtDNmRHNVptNDHt gzCjffWZCtCfZZVdqVSqJdvJndSt hMHLcmGLMLhHmsRMsSvsQSqrsrlJTTdV NPNGRGHGHNLczNzzZFWSFFCC VSBpcvNNbNWWSfGRwtJnRtrzzGzGGn jZlhTlQLHFLLZbwrzQQsttDtbs hmmPFlhLmhLMgFMFLbMBBgcNVcfNCcfSVSSNBq jRDSzjCjjMRMrHzMRCDHMDjBnlQbbnQwLwrNLPwnTPQrlc sZBqdZqsWgFBpgppGJqllPllwnbQwTwsswQPwN gJgtJJBtqJqWBGzjRCHDDzRmDtVV GRBWbbWnGNhbwSsfPfmrlslWsS HLVCgCLpMgcLVDcDCgmlvstSlsstPtSSSlscvl LzQDQzMMzJzFQVDJgCzJHJZRZBNbqGFhNFwBGhbhBhBm JNsHhdPZSdZJjSHzzNwvwGgBFmBmvptJbFvm WrDrwqqqQWVMCvMvGbGbbFFbFp rqqLncqnlCncwQWCwWlLfSZPsZddfzzNNdhdPlZz rwfrwHqSdRcgwdZrDcrqDDdgNzjNjPzPJNJPtbNPbGsHNGHv hllLMTLLQMCzJssPsTvtFG QtQnpWVVMVWnVQpRZSSwZDggrcSq FDlqPMBdmbqMrdDqqFdFDwjHZChHHZfZWZNBsZjhfhHf VQJVgncpTQRJfsssGhsNWC NtpLLSpcLVRzzRRtpgVcLgglMwwlPlzdmDlFmFPDmqqwlF PqwwSqNWPqwSWqjNBwpTPpffhJfZfstRtZJRRdJsdR VFLFzQVgVnDVjhdJHsvhZjfg VVFVDDnmnzLFCzVmznFzrFlrjSCPNMBCSGSGwwwGBjPNWPwC zzbCGrfgbzfzCtvqdjSrvSjnvS cNVTLnJZRNNmQmhJNptvBlBtVjlljqqldtlB ZhpcJHLQhRcLZLmNQJzfFwDzzgHPFngDPPnP ttntdMMBZzbZZtjPfwjwTwBvvVmh llSllRRNsGCrCDTPfgVgTfgvsjPH CFclcCWGrJNDSnnWMbQTnWtLQd bccfdSfwFsswcbbdJFGQVGnCJLnBLnDnQLDj ThvHZNhZmqNWMNqvDVjcjjBQVhQBBVLB vWMZZNRmNMWqtWqmqHclfFgdlwRwrzzSfwbFRd WNzRWWZNmtNZnssNRPtCJFQJCffVJVffCvlF cBqBLgHHBcgqBbCJjrvrVQJfsHlr DhDShwchBSbdwBsqgGcbgTTRmzdNWmMRMmTdNpTMmW FHWZDbbPZDFHgGGPdPbJNLpJSlNjcjSphcJjFN ZCCrBBRwwCjcNwcljppN CmTTsrMfBCRsTMnnCRTmVZbgdbdGfWHPDVvdbbPV cgSNBScMgjBBPtBCNLVvVVvhhJJhvsMhVfWq TFlDrHPZHTTFmwTQHZDZTrqvvzqlJppVJvpffhqqVfJp DbPwrTZDQDRQQwQZrDrbbQwRRnNSBtCjtcNGjSgSLjLccC pdcVCpdZnZgcZgdcDWBDNcNwvBWJwc RRmHspRmmQfLwwJJbFBFFJNR rGlpfrQrqGhGqdGP THhNsHhdFjcDthDcjDhLBqWcLLQQJvvBbvBJbl GfrCSZGCzfVMrVCCzGVfSMQBBFlJlJBFFZqvWBqbbQWl rSrFwCwzMMzRfGrGMwPfGCVdgHDttthNPssHjmNNdDjgdD shmhggDsZCZWBDmsQTcTqrLPTbNbwQQrrN lzpFVfdjfFFGnVVHpjJGJVlprNMPNtPctTNwLtcTbwctwTnN jVFfzVlFSpzpFCshWmgSRgmBRb zZGFNPmdPdszdWddGWZlpLMLpbQbLDpblzQbtv wTwgwSSCHhhCSghJbpcpDglbbQbMVMpV BHnBRrJCHmRNfGDmfm CffgvfCRGngRrvGvgdnRVpPQQPSqbVZZDPDVPzFSSQ cMlWJTMlcTLTLtHHJlpqDLwqSzSSDDqDZDDS tmHTtlMmWpmsMJsCRdCNsrRGfrnffN lNrzNHNwzZlHmwNBpMqqnqGDZSpMTGnb ddjgFjjsRvGvQhQvvFjqbVTFpbVpFDJSbJVpTS cjsQhsjvRvGcgNtzczmtmwCCcr NJMJvBmBJPtMtRDnDDwDMFFWDWHG hZsrzshpSdjZZqSSfgpDwnwFnGCCLHDbjnGCWG zfgSpScsrdpmllttGvJGcm GLsnLVLZGZmcGVpgZLmTjTsDDTlDTHPPHWlHwD dNJhCCdtNJSvdDzwPlvTlQ BCbBrPPfRMfMJSffrMCMChrSqVcmLLFpqLFFcggLVnqgmbgc hMdjMndZLRnRnjclszLclQlzGwcr FPCCSCSpCwStJVGzsPQGslGzPbsQ TSSJTtfTFTwtmTFFVFDTWRvdgndjjRhnjnvHjdfR ZwgsnsWsWvWQHqJhGhJVCJHhCJ cdjlMWRRMhJLCpLL jjSRmRmNRNWBmdmcWjlDWFPswsPtnZQsnBsnZvvTTnvT vvbjLTPbQzrQQjpLzLbflfjfRDDsDlRfgDnnVD ZGCtHHFGzFHhMlCnDqwlgggsqf FJHMhHZGmNHtJhMhBJZZtZdrbSbSzbmWLLQrQTbPdbrS ZClGVCvLZzCLBVbdGGzVVBvVrqQMDWMHrgmgQLWrWmTgqqHH tNpNspcQPfHmqfgHmHHg nNttnwPRjFtPcccsFptPlllQGlQZbvGzVVVFzhCd lflmVWpDVsMmmVPlHVbbGSSbGnSHJcncnLZn NvTFzNwzTQvhFGSZnvgrbgJCgr jtRwTQFzjBNGGQQBdDsDqqlsVqRflMlPsP rCSJPCrBwwMdBJRCrwMTGWTWNbcjGZNGGZTb qzgqfgFghsHzfgHgmmfWGNGGWcNNFClbWlcCNW DqsnzsHLhddBDwCRJR sZpHjZrVQmcrbhbthzhFHzhH QDPMDMndqqQGqQfCDDbhFtzzLtbWzlBLLPBW TDMDqfGnJSnfnfvgjsjNgJvsjVQv bDZQbZHdQQggZfttJjGnplSnldsG FTrFCvWBWzTNSPNvRBGJsGjpsJjstmCLtjCt rhBvzRVRBBSVHDHcHMHq FSbSNZbZbzGzGGbNzGgcZPwlDPvlNmLLLwLLlLvvvl pqnqpVCrpshqmChsQnnRpRCldDHvDHLjDlvPwddlwPtwDV rRTCnnpCWCChTrWsrBTfbcFFmFSSmfBBGg QdhdWDsHhHWzPrLPSCPGvs gpZZmNmtjZwpBZBZgSnvFcGPrrvmncnvmC RVVRjZJfJVfVBZVtBNBVppZVDqMHhqTbMGlWHQhhWldRMHWd BPWQrRRNNMhrHhLqqGgjDJjH TzVmmpmtCNwscTzszcNzDCfCHJqDfGjDJJgfGCDq wdwmspTsVdlTcpbmVMPWBbBWRPNnFnBWMr VZTnVnsgrjjsqPzPwWgWPghz mcFdQGPMBdMSBdWbhRzzWqwLwcWt GQPBvpfvNvFPBvTnfjnZDHDDjsrr CZssCNFJBmBNFmFBNwBFCJFTtthGrrSThtSgSRtSfRTGtRrg LDpDbnjjDGpggGrvGg PLMWnWQgbQWnWbnbjqDbszHwwzwmNsFZMBmwJFZF hQSjFLhFLLMSSFgdWTMdGgNbNbWv JmPlltJBJqmzpbrrwTwrvvGqww HBzztRBRplzlmHmRmmsplRJZcfFcLFfHSLjSZTcfVVcLVH nBSQMnVQqJBGnfVfDgCrjbVbtC FNcPPHdTdhmBdHBvwlZjbClClfcZgjclgj vFdHWhTLHvnBRRqBsWSR TRsNNTTHRRZRRsRzJQddSpJLcQdpjs DMVPVVGmMGWMGtMgGtDlmMWwLLLpJfSfpjzpdQddLSmSSJdc tVMgGMDwMgMWDBWMttjRBZNnvNCNZrZZRbZNvZ wlJPVMJPPBShSlhgfTvgNNzzgNMCTg FLtRnDDSrvdNdrng FcSmpFZFFmmjWqPWJbmhGqqm hlBqqTlSfvNhpbfb fRVsVDDRtnRVfbDNCCNCNQGwNZ nrrRPPnHzntRrPsRVrtJVBMjlzWfFWdMjjWMqdBBlT zDNcnRsNNfRFFNNzRzLbRWgMZMMZcdhcBdMrBpZmmZ PVHHVlPDGPPtjDmmdrrGBBMpWGWd VVqTTlQtDCqFNzsnbLbCSJ ndSGSZZGwSZTBdwnwdwmWCzPQCQLffZzRgMZRggMzf mvqVmqrmcDqllNNtbcNcMCQMRCMCCMQfHLgvRgMg FhNNcrrVljFcqmTJhwnsmGdJsT wlmLmZLwzvVmVWVmQWzZSFJFDSqFHSSFJHhDqZ RsgpMNcMdRgjDcRFqCSrHSHBCFJr jdncssDNPsbmmwvvlPLw wQGHMrHGgwgVTQrrMGgGQrTtWzzPJhsfhZztWssQWbZCWh FjvBFSqqDbljFvSbnvFltszfWPPfWzJZBCsPtJft qLlDbpjFRbpdGTgLGLGTTV hrVJsBrpwbsMZtTLlwnqtqdc QDDmHWmffHCQWHjRQjCWczTTjtlzdldqVtTnTqLt HmfGfRNWfNWmQCRsgbsMFMhMGvpBVs CRzzVCZhvGQqNmcWrgpgwQFSmF BJsttjDtjbdLMHHsBTqBbBHMrprDSrFnFnSgrnnrpDSmWWnw TbMBMPPdLTbHTjHMtPzZGvzlvqCPGNlNVRVP QcmcrCVcdTCGRRLT zzgWFWVBTSWLPdMP JbhnBVzzfVhgztVDvqcqHwncZHNqnsnccQ JJVBFfJjNNNsJTwVfZJNffFRpRzRzRptRWtCtSSHWsWzCD rmrnhgclhQGcGnhrPjqgGMHbWRHRbRCWbzRbMSSpHWCD mhhjQGGjQgggqnmQnmghdQdJFZBNvZBBLNTvvTNNTLfZ DrBgwMCMRvMrvDgPCzdpdNtzqqlHNNtp jWSSZGgfGjcLfdNjFzqqFFzzFF nGZhTmZLLZhGPVVTgQgMRrrb ppqZvppdJmSLHdSfZRrrtbscgRVVgwVrHt hFFFzQPhNWzNhnhGVggrcbwVgBnvbwgR CNQWFMzWWhCflpjvZJMJdj pfpfmQMWmcBVfMBBmpfVQMbDGGNPDTcSNTTsSNPCCNhC ZZrZwvvzZrvZlZlwhwswhNSsgbDssC ttvdtzRzFDqRJWLVLWJJpQ CZZPTQPTPTJhTQTrHCBbvtLbbbRWtjbDvb cGfsVSVcLdSgSwBWRNNGwRNRbD spSffnccsgcdnnJJQlZZqJLhpMJh TwGGdWwdddtTsbzPzbbnTLnPLP gqNSMvtvcSDLLfnMnnPzFM NvDNDqtvRcjQVGZZGZZhwpQB jtgFmnqjqttQpsphzNllblzlNH GRMRDMGCVCHzSCbSbNNl LMTJRTGRLBJBwLRRHmBFQPvqmPBvtgtc jDjjwRDpPqqsMsDLJbJzVB lMNMNddvMltNfFVWbVVWJrrVLfgL NQQtmtFGFlGZPZcMmmcjjn CgCNjvSCgSQQzVZNWVnTBPTcsTVBnpPs bFbbLfbfdRBFhLwqFmblBJfRHtWcttcttlDpspcPWDcDptPn mdbFhfJrmJwfbmmFFFvBZCNCzMGrNjMQjCCZ TPDNHHSTNNmRfTrRMZSqwwttdbBvBMth VVnnFGgnQcBvMqvnhNBN GLzjjzGscssJGJCHljmfmTWPTCDN BZZNcMQjBNjNtDJgstjgtwqGRQfhGhSvPfThfqvPhfhf CCndrnmnnWbrnHrFbWbpbbVmGGPqLfTGhvGSPhqRLRdfSGsf bFssVbbblFHzrmFlMNMtcNgDtJDzZgtw smjMtSqQQSjtSfmDVVFHFhnHBHmbNPPH TgvCCJcZdwdgNvbHvPbbvBNq JLqRWTgLqJLCJcclgCJdWjfsSSpsfRrsQjDtspptQQ hNwztzgzJnnNTVFwNTNhwVhZlrpLMLZZlpZlQndLPLpQLZ vRDvqSSqjbqSWDvjbvBdLWspPLddZPQQLMllLp SfGfRmSGCSfBfjTcNFgzwMFJzwgm lhVBhZjjPHbThwFGrNrdvNNwFV DRrDLfMLSgpCdCJcfmcJCm LQtnprtqSRtZjHzTthlb GrGsqfbtsWGWWntnrrwWWWGSSDSMDcSSSwTDzPzJSJzPcT lmQhhVCgmffCNgmNNmCmBNRRPvDzDMhJvSSDJzzcTzvvPvMT VBllNBpfQgQmpLBpRBtnqWLFFnZZWWGrZrjq NRJdngMVwfgnwJtvlblcWLlLDHfccDbW PFJzBmhmjPFpJrFqLcQHLlHGDlHDQbGz ShJZJmPFpwdMvCCZRd WQDqSVWqpBCsPqPWWNscfrHfhrhrHhGFGs MmLRmLTjmTzTzlhGHfprhvfFhHfT mLZLRdgMRjtdddmdgwmtMwQSCPbnDSSCqBDwpWPQqn rNHwMMGDrggWwsvWMPMWWwjbCqjCBlZqvfjBqCJhfffj FbtFmRTpzBBZqCClpJ ztbzFtnzVNnNNPPDGD PLPFcwdLdFcbgdfSwFtWhGWGRMWMJMGCblJR qTpszVVjRlCHtWCT qzvrDqQrqznzggFZwFwQScdW LWLjLNjNjTwlwLZVcBVcVVZcBVQcZZ JhGhFdmBRdGGDnQtbPvVVdnccS zDrrFGFFRgRHmDNWTpjTBNTHWNjW fwfBVLhmwfhHsgBstWCWQnDQnlldWW hZvFTNJrZjZbFvNvttqWWDtcWqCtFDWn rbjjrjpRzRzgBLzwLgmzLh ZqqqWVzdSPnwBJBfwJfZTs FHGgjRLMJFsJTsBw DHRcDgHvLhDWPSCzwqnq LZGZLLRLZpRQBtPTjTffrHljjmsB wNVVwcCgNCCScwggmjHjTPmQPsTHmlSs gbbwbqhNCQcbqqVchWhtRZDJWJDtZLWL CmTmvvmvzCCCgzzVQmTQvTjjGRGShwSHwRrRSSSSDNHSFN PqZqWdqlplsqBJMMsMMnGRJRbbNwNhrrhShGShFD fBWBWdZppqpqDMBdlfcTCTLtLtLCQfQvcmgv pntdtdHHWHqnptGpqHqNgMQwPPPnZMZZZZcfgc LFmLSVBRTSBBRrffTQgMfQMtJZQT bmRCSSSjRCtSrRChjqqGqpppGhqDGp dGGhhfNfgRTGLcpL BmCCwQMQqmQrBCBJLpbVTFbHcgcbLTMc JrpqJJmqqqqmzqqwmwNlzfvltDPltfshlhNN VCCbMJfJlgRCnNGVNnvFvVBF STsgcZdghZsqSttBnsGnBtBtHt qDcjgDphjhSghZTQgCJWQWWfwfRzWlwJzJ JHMVMvmvRcdbmrRHQBBGjcjfFQfChSfj NltNtZllgZtgtnpnqNWpgCrCBQzBGzFhQrGSSBCzWh pDrwnqLlvDVmPbss dbrpbSrwBjswsSjCwqllLqFtqLcrGqqFtF RvfJDQnRpHvvQfRvvQRJFDqzcWltFFlzcLttWltW ZpnRVZHmvHnTnPZZPHfHmVwdjVghwgVSBgdBBCwgdC WRCBGWvNgHnMcFwnpC ltlstrjlJNlfrZZqDJtNLsHnmwwpcHphhFPMFjwhmnFp TStJssLstJLtqTsNgvvSBNzzvWvGRz VBjdWdGcqWdBVCFRmHwfCRRV DLzNpqbDzDNbrJvltMLJLRRmtRFTSRmTmFwfRHRTFf zvvJNLgNqGcnjgnP JjdnFfbdbdQMbQzjtRcwcCvbvBqRBCwt LlNHlWGprPCVVBsVzqNR hLmgTlrpPPHrLprHrTTGggHWzhZFSJDfhMdnjjZfFfdFMjFz bDbwRpCSRgqqMfMf HzzPcPnhzlhsQzHhHnTggBBqTQTgVQqBqjZW tnsrFccnzsDvGpNGqNtq GmPsPrsSlswNmcLzMvnpnmMpLBCf glDTZRDqRTjRCvjvfBpfCzvp DHlJVhJRDTbqZDqSNVrNwtVrQwSSGs nNnDwqDwFVgDwDnCgLnLpCVWdBMRpsPdMPPjRHRHHRdBWj tQtfTtJtJmlTQrTtTlhfzrmdHzMMRMsBPPddjddBPPdWsB bbhtQTfTTsmmbStnqGFGNDbFDgFVnw dsVpDPBMHVdHpplpvdHjRjmmjRTMTFFrrTTFQq LzzWZLGCzCWNjfmRfBhmQjZq zSSSwJwSBzNtzLBbwbSGLzWVvcvpHdssDllVJgVHVcdDPv RWfQBDTBLQWpDLNRZjZwHHddjHNhZdtv ScCCzSszFzJccPHHvmjHvjhpmHsj FPclgFVCbcngVgnpWQqqRfLBDBrR cRLLVwcsctwmbVcszztwtRMvNrCpTggqFrTvvhCVpghBqh PdSDGdnZQfGDfDjWjWWgvCqFhpqvpNZgCTTvrp dGnDHWnSQdJPDSFLLcJmRzzLLLRRcl lCSqlcCcBqBCCwGwnNWnnFwBHF WMZLMPbPhQddRbMpbbLbRLLHDFgjFGDmFNZgNnDGNHGGjD dTVPPQbPbMdQMzvVrWvczrCJqv vzscdHcHZzHzCCHlQTTTCcslMGPStmSlpDDSSSgSPDNBmNtl FWVMFhFMMqWhFVFbDBDDhpmpGtPSDpGG fRLbFfwWWLnVjMdzzQHQJnnvQs SmPdRbWZdSqqzSPmbdWFFQgcQnvncgQGQMMT BfBLmVNjprVVNlVBrpBlHpNrgQFHGCGgvTQTMGFFgMCvgQcQ BjjJfVLBfNffJbZDqtDsdzzm NLgtLsSggjqgqpLLDjsjmcJfvpmFmmJmvPpwhBJB lMnlZMtdCMrRRnRbTddWbVwcmPfFmhJwPfwJmvfwFvPl MnRrnGWRbgQqtNGDjt dSdrTbTtLJCcttcFVw PhsgQQGPZshvpQZGgsrBllVFlHVpFllJJrFH gqsGPgMZhgvQbzrzTfSzMTLf pqbDdQWqCgBfbbfFfB vtjnmzLcmhBdzTFgTsRP LZGmjvJGGctnLtvcchSjmhcLqNHCwVdQZwDwWDNpCwqHdDwQ wlMWSSHWShSMbDSwVhCrNjJmcrDmGRRCGCjN FHZdHftFFQnqsQqsQttjvGrJccmdGGcrNdRNmG pHpzPpQHpsPzPlzlbSgSSMLwzh fCQDLlDQTSjbHDqH ZhrsrZZZhcclwNswGGwbwF rcWhlhlpMJpMZmgtBCzCttCCRfdp zLnCMLNTvtGNpNvNjhRHgZhHvZdZHdjD fSsWWqScTfJJqfJFFJwswhdHhhhdhDdjbjZbhhDj WsWmfcqBWfTfsrntrLmplCLttm ljssbqMMPbHPlsbcWZNLLsWJWRFvvZfW SzgggDDwTzrQmDQgdSSWvdJLFGffRvZG zCzCDCrznnTTmCbbpvlPHtCPtb TZSwNPpcgpNPbwbhhbwrwJqh BlCDtvvgLWGCLffGfLzLrMqnnbDDHbmnnnJrhnVJ lzBjdCjCGCjfGjjLGBGGjlCSsRppcdpRNdRSPQcRPQZTgT TsFTrvGmZGfvZfZFzNNZrhClmRcBgCMwQwQPCPMPRP bpnnVVJtSDgRBwbQRwlR jpSnqLpqDJDJLDjWDWLWvvzfZZvqvNsGTHGGFfZl bzbzznqfCpzvhCSMfbCbpCFhtHGHHJdtHJGhFsmshJJG DLWRLjRrmNPQjZZlQPsFGFggVcWcFddggdsg rjrZPwwDRlLLBjQlRRlPDpmbqzpqnnCSCfTMwMqSvC FmcGcjLRPjQwQjMQrwHQ btJzJbVNdBJJtzTdGBbdBztGrQhhQWhMwHrhrHSHgHQfhMVS JJDpdDTtCtzNptnTJBznnvLCCvcFqsRqFcvZclLGRR gex */ .highlight .s1 { color: #C3E88D } /* Literal.String.Single */ .highlight .ss { color: #89DDFF } /* Literal.String.Symbol */ .highlight .bp { color: #89DDFF } /* Name.Builtin.Pseudo */ .highlight .fm { color: #82AAFF } /* Name.Function.Magic */ .highlight .vc { color: #89DDFF } /* Name.Variable.Class */ .highlight .vg { color: #89DDFF } /* Name.Variable.Global */ .highlight .vi { color: #89DDFF } /* Name.Variable.Instance */ .highlight .vm { color: #82AAFF } /* Name.Variable.Magic */ .highlight .il { color: #F78C6C } /* Literal.Number.Integer.Long */
(ql:quickload '(fiveam uiop cl-ppcre trivia))

(defun parse-line (line table)
  (cond
    ((ppcre:register-groups-bind ((#'read-from-string monkey dep1 op dep2))
         ("(\\w+): (\\w+) ([*+/-]) (\\w+)" line)
       (setf (gethash monkey table) (list op dep1 dep2))))
    ((ppcre:register-groups-bind ((#'read-from-string monkey number))
         ("(\\w+): (\\d+)" line)
       (setf (gethash monkey table) number)))))

(defun build-monkey-table (filename)
  (let ((table (make-hash-table :test #'eq)))
    (with-open-file (stream filename)
      (loop for line = (read-line stream nil nil)
            while line
            do (parse-line line table)))
    table))

(defun resolver (entry table)
  (trivia:match entry
    ((list op a b)
     (funcall op
              (resolver (gethash a table) table)
              (resolver (gethash b table) table)))
    (a a)))

;;; part2

(defun human-in-tree-p (name table)
  (or (eq name 'humn)
      (trivia:match (gethash name table)
        ((list _ left right)
         (or (human-in-tree-p left table)
             (human-in-tree-p right table))))))

(defun invert-operation (human-lhs-p op target known)
  (ecase op
    (+ (- target known))
    (- (if human-lhs-p
           (+ target known)
           (- known target)))
    (* (/ target known))
    (/ (if human-lhs-p
           (* target known)
           (/ known target)))))

(defun reverse-solver (entry target table)
  (destructuring-bind (op left right) entry
    (let* ((human-lhs-p (human-in-tree-p left table))
           (next-entry (if human-lhs-p left right))
           (known-term (resolver (gethash (if human-lhs-p right left) table) table))
           (new-target (invert-operation human-lhs-p op target known-term)))
      (if (eq next-entry 'humn) new-target
          (reverse-solver (gethash next-entry table) new-target table)))))

(defun part2 (table)
  (reverse-solver
   (cons '- (cdr (gethash 'root table)))
   0 table))


;; solutions

(fiveam:test solutions
  (let ((table (build-monkey-table "eg-in")))
    (fiveam:is (= 152 (resolver (gethash 'root table) table)))
    (fiveam:is (= 301 (part2 table))))
  (let ((table (build-monkey-table "input")))
    (fiveam:is (= 56490240862410 (resolver (gethash 'root table) table)))
    (fiveam:is (= 3403989691757 (part2 table)))))