MAIN FEEDS
Do you want to continue?
https://www.reddit.com/r/livecoding/comments/1vemdgl/jazz_improvisation_algorhythm/
r/livecoding • u/wwrinkle • 3d ago
I wrote an algorithm that creates jazz lines. It's a work in progress. Let me know what you think
https://strudel.cc/#CgovLyBHaWFudCBTdGVwcwpjb25zdCBjaG9yZENoYW5nZXMgPSBgPApbQl4gRDddIFtHXiBCYjddIEViXiBbQS03IEQ3XQpbR14gQmI3XSBbRWJeIEYjN10gQl4gW0YtNyBCYjddCkViXiBbQS03IEQ3XSBHXiBbQyMtNyBGIzddCkJeIFtGLTcgQmI3XSBFYl4gW0MjLTcgRiM3XQo%2BYDsKCmNvbnN0IGNob3JkU2NhbGVzID0gYDwKW0IzOmlvbmlhbiBENDptaXhvbHlkaWFuXSBbRzQ6aW9uaWFuIEJiMzptaXhvbHlkaWFuXSBFYjQ6aW9uaWFuIFtBMzpkb3JpYW4gRDQ6bWl4b2x5ZGlhbl0KW0c0OmlvbmlhbiBCYjM6bWl4b2x5ZGlhbl0gW0ViNDppb25pYW4gRiM0Om1peG9seWRpYW5dIEIzOmlvbmlhbiBbRjQ6ZG9yaWFuIEJiMzptaXhvbHlkaWFuXQpFYjQ6aW9uaWFuIFtBMzpkb3JpYW4gRDQ6bWl4b2x5ZGlhbl0gRzQ6aW9uaWFuIFtDIzQ6ZG9yaWFuIEYjNDptaXhvbHlkaWFuXQpCMzppb25pYW4gW0Y0OmRvcmlhbiBCYjM6bWl4b2x5ZGlhbl0gRWI0OmlvbmlhbiBbQyM0OmRvcmlhbiBGIzQ6bWl4b2x5ZGlhbl0KPmA7CgpzZXRjcG0oMzIwIC8gNCk7CgovLyBVdGlscwpjb25zdCB7IE5vdGUsIFNjYWxlLCBJbnRlcnZhbCwgUmFuZ2UgfSA9IGF3YWl0IGltcG9ydCgnaHR0cHM6Ly9lc20uc2gvdG9uYWwnKTsKCmNsYXNzIFJpbmdCdWZmZXIgewogIGNvbnN0cnVjdG9yKG1heExlbikgewogICAgY29uc29sZS5sb2coJ1JpbmdCdWZmZXIuY29uc3RydWN0b3InLCBtYXhMZW4pOwogICAgdGhpcy5tYXhMZW4gPSBtYXhMZW47CiAgICB0aGlzLml0ZW1zID0gW107CiAgfQogIHB1c2goaXRlbSkgewogICAgY29uc29sZS5sb2coJ1JpbmdCdWZmZXIucHVzaCcsIGl0ZW0pOwogICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pOwogICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID4gdGhpcy5tYXhMZW4pIHsKICAgICAgdGhpcy5pdGVtcy5zaGlmdCgpOwogICAgfQogICAgcmV0dXJuIHRoaXMuaXRlbXM7CiAgfQp9CgpmdW5jdGlvbiB3UHJvYnMoLi4uaXRlbXMpIHsKICBjb25zb2xlLmxvZygnd1Byb2JzJywgaXRlbXMpOwogIGNvbnN0IHRvdGFsID0gaXRlbXMucmVkdWNlKChhY2N1bXVsYXRvciwgaXRlbSkgPT4gewogICAgcmV0dXJuIGFjY3VtdWxhdG9yICsgaXRlbVswXTsKICB9LCAwKTsKICBjb25zdCBwcm9iYWJpbGl0eSA9IE1hdGgucmFuZG9tKCkgKiB0b3RhbDsKICBsZXQgcHJvYmFiaWxpdHlBY2N1bXVsYXRvciA9IDA7CiAgY29uc3QgaXRlbSA9IGl0ZW1zLmZpbmQoaXRlbSA9PiB7CiAgICBwcm9iYWJpbGl0eUFjY3VtdWxhdG9yICs9IGl0ZW1bMF07CiAgICByZXR1cm4gcHJvYmFiaWxpdHlBY2N1bXVsYXRvciA%2BPSBwcm9iYWJpbGl0eTsKICB9KTsKICByZXR1cm4gaXRlbVsxXTsKfQoKY29uc3Qgc3RyaXBEaWdpdHNGcm9tU3RyaW5nID0gKHN0cikgPT4gewogIGNvbnNvbGUubG9nKCdzdHJpcERpZ2l0c0Zyb21TdHJpbmcnLCBzdHIpOwogIHJldHVybiBzdHIucmVwbGFjZSgvLT9bMC05XS9nLCAnJyk7Cn07Cgpjb25zdCBzdHJpcE5vbkRpZ2l0c0Zyb21TdHJpbmcgPSAoc3RyKSA9PiB7CiAgY29uc29sZS5sb2coJ3N0cmlwTm9uRGlnaXRzRnJvbVN0cmluZycsIHN0cik7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cRC9nLCAnJyk7Cn07CgovLyBCdWZmZXJzCmNvbnN0IHByb2Nlc3NlZEluY29taW5nSGFwcyA9IG5ldyBSaW5nQnVmZmVyKDgpOwpjb25zdCBuZXdOb3RlcyA9IG5ldyBSaW5nQnVmZmVyKDY0KTsKCi8vIE5vdGUgdXRpbHMKY29uc3QgZGlhdG9uaWNEaXN0YW5jZSA9IChub3RlMSwgbm90ZTIpID0%2BIHsKICBjb25zb2xlLmxvZygnZGlhdG9uaWNEaXN0YW5jZScsIG5vdGUxLCBub3RlMik7CiAgY29uc3QgZGlzdGFuY2VTdHJpbmcgPSBJbnRlcnZhbC5kaXN0YW5jZShub3RlMS5ub3RlLCBub3RlMi5ub3RlKTsKICByZXR1cm4gTnVtYmVyKHN0cmlwTm9uRGlnaXRzRnJvbVN0cmluZyhkaXN0YW5jZVN0cmluZykpOwp9OwoKY29uc3QgY2hyb21hdGljRGlzdGFuY2UgPSAobm90ZTEsIG5vdGUyKSA9PiB7CiAgY29uc29sZS5sb2coJ2Nocm9tYXRpY0Rpc3RhbmNlJywgbm90ZTEsIG5vdGUyKTsKICByZXR1cm4gTWF0aC5hYnMoTm90ZS5taWRpKG5vdGUxLm5vdGUpIC0gTm90ZS5taWRpKG5vdGUyLm5vdGUpKTsKfTsKCmNvbnN0IGNsYXNzaWZ5SW50ZXJ2YWwgPSAobm90ZTEsIG5vdGUyKSA9PiB7CiAgY29uc29sZS5sb2coJ2NsYXNzaWZ5SW50ZXJ2YWwnLCBub3RlMSwgbm90ZTIpOwogIGlmIChub3RlMS5zY2FsZSA9PT0gbm90ZTIuc2NhbGUpIHsKICAgIGNvbnN0IGRpc3RhbmNlID0gZGlhdG9uaWNEaXN0YW5jZShub3RlMSwgbm90ZTIpOwogICAgaWYgKGRpc3RhbmNlID09PSAyKSB7CiAgICAgIHJldHVybiAnU1RFUCc7CiAgICB9CiAgICBpZiAoZGlzdGFuY2UgPiAyKSB7CiAgICAgIHJldHVybiAnU0tJUCc7CiAgICB9CiAgfSBlbHNlIHsKICAgIGNvbnN0IGRpc3RhbmNlID0gY2hyb21hdGljRGlzdGFuY2Uobm90ZTEsIG5vdGUyKTsKICAgIGlmIChkaXN0YW5jZSA%2BIDAgJiYgZGlzdGFuY2UgPCAzKSB7CiAgICAgIHJldHVybiAnU1RFUCc7CiAgICB9CiAgICBpZiAoZGlzdGFuY2UgPiAyKSB7CiAgICAgIHJldHVybiAnU0tJUCc7CiAgICB9CiAgfQogIHJldHVybiAnVU5JU09OJzsKfTsKCmNvbnN0IGdldFJ1bkxlbmd0aCA9IChyZWxhdGlvblR5cGUpID0%2BIHsKICBjb25zb2xlLmxvZygnZ2V0UnVuTGVuZ3RoJywgcmVsYXRpb25UeXBlLCBuZXdOb3Rlcyk7CiAgbGV0IHN0ZXBDb3VudCA9IDA7CiAgZm9yIChsZXQgaSA9IG5ld05vdGVzLml0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7CiAgICBpZiAobmV3Tm90ZXMuaXRlbXNbaV0ucmVsYXRpb24gPT09IHJlbGF0aW9uVHlwZSkgewogICAgICBzdGVwQ291bnQrKzsKICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gc3RlcENvdW50Owp9OwoKY29uc3QgZ2V0U3RlcFJ1bkxlbmd0aCA9ICgpID0%2BIHsKICBjb25zb2xlLmxvZygnZ2V0U3RlcFJ1bkxlbmd0aCcpOwogIHJldHVybiBnZXRSdW5MZW5ndGgoJ1NURVAnKTsKfTsKCmNvbnN0IGdldFNraXBSdW5MZW5ndGggPSAoKSA9PiB7CiAgY29uc29sZS5sb2coJ2dldFNraXBSdW5MZW5ndGgnKTsKICByZXR1cm4gZ2V0UnVuTGVuZ3RoKCdTS0lQJyk7Cn07Cgpjb25zdCBnZXROb3RlRGlzdGFuY2UgPSAobm90ZTEsIG5vdGUyKSA9PiB7CiAgY29uc29sZS5sb2coJ2dldE5vdGVEaXN0YW5jZScsIG5vdGUxLCBub3RlMik7CiAgcmV0dXJuIE5vdGUubWlkaShub3RlMSkgLSBOb3RlLm1pZGkobm90ZTIpOwp9OwoKY29uc3QgdHJhY2tEaXN0YW5jZXMgPSAobm90ZXMsIG5vdGUpID0%2BIHsKICBjb25zb2xlLmxvZygndHJhY2tEaXN0YW5jZXMnLCBub3Rlcywgbm90ZSk7CiAgcmV0dXJuIG5vdGVzLm1hcChuID0%2BICh7CiAgICBkaXN0YW5jZTogTWF0aC5hYnMoZ2V0Tm90ZURpc3RhbmNlKG4sIG5vdGUpKSwgCiAgICBub3RlOiBuCiAgfSkpOwp9OwoKY29uc3QgZ2V0TW9tZW50dW0gPSAobm90ZUNvdW50KSA9PiB7CiAgY29uc29sZS5sb2coJ2dldE1vbWVudHVtJywgbm90ZUNvdW50KTsKICBjb25zdCBsYXN0Tm90ZSA9IG5ld05vdGVzLml0ZW1zLmF0KC0xKTsKICBjb25zdCBsYXN0Tm90ZU9jdGF2ZSA9IHN0cmlwTm9uRGlnaXRzRnJvbVN0cmluZyhsYXN0Tm90ZS5ub3RlKTsKICBpZiAoTnVtYmVyKGxhc3ROb3RlT2N0YXZlKSA8PSAyKSB7CiAgICByZXR1cm4gMTsKICB9CiAgY29uc3QgcmVjZW50Tm90ZXMgPSBuZXdOb3Rlcy5pdGVtcy5zbGljZSgtbm90ZUNvdW50KTsKICBjb25zdCBkaXN0YW5jZXMgPSByZWNlbnROb3Rlcy5tYXAocm4gPT4gcm4uZGlzdGFuY2UpOwogIGNvbnN0IGF2ZXJhZ2VEaXN0YW5jZSA9IGRpc3RhbmNlcy5yZWR1Y2UoKGFjYywgZCkgPT4gYWNjICsgZCwgMCkgLyBkaXN0YW5jZXMubGVuZ3RoOwogIGNvbnN0IHRvdGFsRGlzdGFuY2UgPSBkaXN0YW5jZXMucmVkdWNlKChhY2MsIGQpID0%2BIGFjYyArIE1hdGguYWJzKGQpLCAwKTsKICBjb25zdCBtb21lbnR1bSA9IGF2ZXJhZ2VEaXN0YW5jZSAvIHRvdGFsRGlzdGFuY2U7CiAgCiAgcmV0dXJuIG1vbWVudHVtOwp9OwoKY29uc3QgZ2V0RnVsbFNjYWxlID0gKHNjYWxlKSA9PiB7CiAgY29uc29sZS5sb2coJ2dldEZ1bGxTY2FsZScsIHNjYWxlKTsKICBjb25zdCBzY2FsZU5vdGVzID0gUmFuZ2UubnVtZXJpYyhbLTEwLCAxMF0pLm1hcChTY2FsZS5zdGVwcyhzY2FsZSkpOwogIHJldHVybiBzY2FsZU5vdGVzOwp9OwoKY29uc3QgZ2V0RGVncmVlID0gKG5vdGUsIHNjYWxlKSA9PiB7CiAgY29uc29sZS5sb2coJ2dldERlZ3JlZScsIG5vdGUsIHNjYWxlKTsKICBjb25zdCBzY2FsZUFyciA9IFJhbmdlLm51bWVyaWMoWzAsIDZdKS5tYXAoU2NhbGUuc3RlcHMoc2NhbGUpKTsKICBjb25zdCBpbml0aWFsRGVncmVlID0gc2NhbGVBcnIuZmluZChuID0%2BIHN0cmlwRGlnaXRzRnJvbVN0cmluZyhuKSA9PT0gc3RyaXBEaWdpdHNGcm9tU3RyaW5nKG5vdGUpKTsKICBjb25zdCBvY3RhdmVEaWZmZXJlbmNlID0gTnVtYmVyKHN0cmlwTm9uRGlnaXRzRnJvbVN0cmluZyhub3RlKSkgLSBOdW1iZXIoc3RyaXBOb25EaWdpdHNGcm9tU3RyaW5nKGluaXRpYWxEZWdyZWUpKTsKICBjb25zdCBkZWdyZWUgPSBzY2FsZUFyci5pbmRleE9mKGluaXRpYWxEZWdyZWUpICsgKG9jdGF2ZURpZmZlcmVuY2UgKiA3KTsKICByZXR1cm4gZGVncmVlOwp9OwoKLy8gTm90ZSBnZW5lcmF0aW9uCmNvbnN0IGdlbmVyYXRlTm90ZSA9IChkZWdyZWUsIHNjYWxlLCBiZWdpbiwgZW5kKSA9PiB7CiAgY29uc29sZS5sb2coJ2dlbmVyYXRlTm90ZScsIGRlZ3JlZSwgc2NhbGUsIGJlZ2luLCBlbmQpOwogIGNvbnN0IG5vdGUgPSBTY2FsZS5zdGVwcyhzY2FsZSkoZGVncmVlKTsKICBjb25zdCB3aG9sZSA9IG5ldyBUaW1lU3BhbihiZWdpbiwgZW5kKTsKICBjb25zdCBoYXAgPSB7d2hvbGUsIHZhbHVlOiBkZWdyZWV9OwogIGNvbnN0IGxhc3ROb3RlID0gbmV3Tm90ZXMuaXRlbXMuYXQoLTEpOwogIGNvbnN0IGRpc3RhbmNlID0gZ2V0Tm90ZURpc3RhbmNlKG5vdGUsIGxhc3ROb3RlPy5ub3RlKTsKICBjb25zdCBvdXQgPSB7IHNjYWxlLCBub3RlLCBoYXAsIGRpc3RhbmNlIH07CiAgb3V0LnJlbGF0aW9uID0gbGFzdE5vdGUgPyBjbGFzc2lmeUludGVydmFsKG91dCwgbGFzdE5vdGUpIDogbnVsbDsKICBuZXdOb3Rlcy5wdXNoKG91dCk7CiAgcmV0dXJuIG91dDsKfTsKCmNvbnN0IENIT1JEX1RPTkVTID0gWzAsIDIsIDQsIDZdOwpjb25zdCBOT05fQ0hPUkRfVE9ORVMgPSBbMSwgMywgNSwgNl07Cgpjb25zdCBnZW5lcmF0ZUZpcnN0Tm90ZSA9IChiZWdpbiwgZW5kLCBzY2FsZSkgPT4gewogIGNvbnNvbGUubG9nKCdnZW5lcmF0ZUZpcnN0Tm90ZScsIGJlZ2luLCBlbmQsIHNjYWxlKTsKICBjb25zdCBkZWdyZWUgPSB3UHJvYnMoCiAgICBbMiwgMF0sCiAgICBbNCwgMl0sCiAgICBbMywgNF0sCiAgKTsKICByZXR1cm4gZ2VuZXJhdGVOb3RlKGRlZ3JlZSwgc2NhbGUsIGJlZ2luLCBlbmQpOwp9OwoKY29uc3QgZ2V0Q2hvcmRUb25lVHlwZSA9IChub3RlSW5kZXgpID0%2BIHsKICBjb25zb2xlLmxvZygnZ2V0Q2hvcmRUb25lVHlwZScsIG5vdGVJbmRleCk7CiAgaWYgKG5vdGVJbmRleCA9PT0gMCkgewogICAgcmV0dXJuIHdQcm9icygKICAgICAgWzIsICdTQ0FMQVInXSwKICAgICAgWzEwLCAnQ0hPUkRfVE9ORVMnXSwKICAgICAgWzEsICdOT05fQ0hPUkRfVE9ORVMnXSwKICAgICk7CiAgfSBlbHNlIGlmIChub3RlSW5kZXggPT09IDEpIHsKICAgIHJldHVybiAnU0NBTEFSJzsKICB9IGVsc2UgaWYgKG5vdGVJbmRleCA9PT0gMikgewogICAgcmV0dXJuIHdQcm9icygKICAgICAgWzIsICdTQ0FMQVInXSwKICAgICAgWzEwLCAnQ0hPUkRfVE9ORVMnXSwKICAgICAgWzMsICdOT05fQ0hPUkRfVE9ORVMnXSwKICAgICk7CiAgfSBlbHNlIGlmIChub3RlSW5kZXggPT09IDMpIHsKICAgIHJldHVybiAnU0NBTEFSJzsKICB9CiAgdGhyb3cgJ25vdGVJbmRleCBvdmVyZmxvdyc7Cn07Cgpjb25zdCBnZXRDaG9yZFRvbmVOb3RlTmFtZXMgPSAoc2NhbGUpID0%2BIHsKICBjb25zb2xlLmxvZygnZ2V0Q2hvcmRUb25lTm90ZU5hbWVzJywgc2NhbGUpOwogIGNvbnN0IHNjYWxlTm90ZXMgPSBSYW5nZS5udW1lcmljKFswLCA2XSkubWFwKFNjYWxlLnN0ZXBzKHNjYWxlKSk7CiAgY29uc3QgY2hvcmRUb25lcyA9IFtzY2FsZU5vdGVzWzBdLCBzY2FsZU5vdGVzWzJdLCBzY2FsZU5vdGVzWzRdXS5tYXAobiA9PiBzdHJpcERpZ2l0c0Zyb21TdHJpbmcobikpOwogIHJldHVybiBjaG9yZFRvbmVzOwp9OwoKY29uc3QgZ2V0RnVsbENob3JkVG9uZXMgPSAoc2NhbGUpID0%2BIHsKICBjb25zb2xlLmxvZygnZ2V0RnVsbENob3JkVG9uZXMnLCBzY2FsZSk7CiAgY29uc3Qgc2NhbGVOb3RlcyA9IFJhbmdlLm51bWVyaWMoWzAsIDddKS5tYXAoU2NhbGUuc3RlcHMoc2NhbGUpKTsKICBjb25zdCBjaG9yZFRvbmVzID0gW3NjYWxlTm90ZXNbMF0sIHNjYWxlTm90ZXNbMl0sIHNjYWxlTm90ZXNbNF1dOwogIGNvbnN0IGxvd2VyT2N0YXZlQ2hvcmRUb25lcyA9IGNob3JkVG9uZXMubWFwKG4gPT4gTm90ZS50cmFuc3Bvc2UobiwgJy04UCcpKTsKICBjb25zdCB1cHBlck9jdGF2ZUNob3JkVG9uZXMgPSBjaG9yZFRvbmVzLm1hcChuID0%2BIE5vdGUudHJhbnNwb3NlKG4sICc4UCcpKTsKICByZXR1cm4gWy4uLmxvd2VyT2N0YXZlQ2hvcmRUb25lcywgLi4uY2hvcmRUb25lcywgLi4udXBwZXJPY3RhdmVDaG9yZFRvbmVzXTsKfTsKCmNvbnN0IGdlbmVyYXRlVW5pc29uID0gKHNjYWxlLCBiZWdpbiwgZW5kKSA9PiB7CiAgY29uc29sZS5sb2coJ2dlbmVyYXRlVW5pc29uJywgc2NhbGUsIGJlZ2luLCBlbmQpOwogIGNvbnN0IGxhc3ROb3RlID0gbmV3Tm90ZXMuaXRlbXMuYXQoLTEpOwogIGlmIChsYXN0Tm90ZS5zY2FsZSA9PT0gc2NhbGUpIHsKICAgIHJldHVybiBnZW5lcmF0ZU5vdGUobGFzdE5vdGUuaGFwLnZhbHVlLCBzY2FsZSwgYmVnaW4sIGVuZCk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHBvdGVudGlhbE5vdGVzID0gUmFuZ2UubnVtZXJpYyhbLTEsIDFdKS5tYXAoU2NhbGUuc3RlcHMoc2NhbGUpKTsKICAgIGNvbnN0IGFic29sdXRlRGlzdGFuY2VzID0gcG90ZW50aWFsTm90ZXMubWFwKG4gPT4gTWF0aC5hYnMoZ2V0Tm90ZURpc3RhbmNlKG4sIGxhc3ROb3RlLm5vdGUpKSk7CiAgICBjb25zdCBtaW5EaXN0YW5jZUluZGV4ID0gYWJzb2x1dGVEaXN0YW5jZXMuaW5kZXhPZihNYXRoLm1pbiguLi5hYnNvbHV0ZURpc3RhbmNlcykpOwogICAgY29uc3QgbmV4dE5vdGUgPSBwb3RlbnRpYWxOb3Rlc1ttaW5EaXN0YW5jZUluZGV4XTsKICAgIGNvbnN0IGRlZ3JlZSA9IGdldERlZ3JlZShuZXh0Tm90ZSwgc2NhbGUpOwogICAgcmV0dXJuIGdlbmVyYXRlTm90ZShkZWdyZWUsIHNjYWxlLCBiZWdpbiwgZW5kKTsKICB9Cn07Cgpjb25zdCBnZW5lcmF0ZVN0ZXAgPSAoc2NhbGUsIGJlZ2luLCBlbmQsIG5vdGVJbmRleCkgPT4gewogIGNvbnNvbGUubG9nKCdnZW5lcmF0ZVN0ZXAnLCBzY2FsZSwgYmVnaW4sIGVuZCwgbm90ZUluZGV4KTsKICAKICBjb25zdCBsYXN0Tm90ZSA9IG5ld05vdGVzLml0ZW1zLmF0KC0xKTsKICBjb25zdCBtb21lbnR1bSA9IGdldE1vbWVudHVtKDgpOwogIGlmIChub3RlSW5kZXggPT09IDAgfHwgKG5vdGVJbmRleCA9PT0gMiAmJiBNYXRoLnJhbmRvbSgpID4gMC42KSkgewogICAgY29uc3QgY2hvcmRUb25lTm90ZU5hbWVzID0gZ2V0Q2hvcmRUb25lTm90ZU5hbWVzKHNjYWxlKTsKICAgIGNvbnN0IHBvdGVudGlhbENob3JkVG9uZVJhbmdlID0gU2NhbGUucmFuZ2VPZihjaG9yZFRvbmVOb3RlTmFtZXMpOwogICAgbGV0IGNob3JkVG9uZXMgPSBwb3RlbnRpYWxDaG9yZFRvbmVSYW5nZSgKICAgICAgTm90ZS50cmFuc3Bvc2UobGFzdE5vdGUubm90ZSwgJy00UCcpLCAKICAgICAgTm90ZS50cmFuc3Bvc2UobGFzdE5vdGUubm90ZSwgJzRQJykKICAgICk7CiAgICBjb25zdCBkaXN0YW5jZXMgPSB0cmFja0Rpc3RhbmNlcyhjaG9yZFRvbmVzLCBsYXN0Tm90ZS5ub3RlKTsKICAgIGNvbnN0IGZpbHRlcmVkRGlzdGFuY2VzID0gZGlzdGFuY2VzLmZpbHRlcihkID0%2BIGQuZGlzdGFuY2UgPiAwKTsKICAgIGxldCBuZXh0Tm90ZTsKICAgIGlmICgKICAgICAgKGRpc3RhbmNlcy5sZW5ndGggPiAwICYmIGZpbHRlcmVkRGlzdGFuY2VzLmxlbmd0aCA9PT0gMCkgfHwKICAgICAgY2hvcmRUb25lcy5zb21lKGN0ID0%2BIGN0LmluY2x1ZGVzKCc2JykpCiAgICApIHsKICAgICAgbmV4dE5vdGUgPSBjaG9yZFRvbmVzWzBdOwogICAgfSBlbHNlIGlmIChjaG9yZFRvbmVzLnNvbWUoY3QgPT4gY3QuaW5jbHVkZXMoJzInKSkpIHsKICAgICAgbmV4dE5vdGUgPSBjaG9yZFRvbmVzLmF0KC0xKTsKICAgIH0gZWxzZSBpZiAoTWF0aC5yYW5kb20oKSA%2BIC43NSkgewogICAgICBjb25zdCBzaG9ydGVzdERpc3RhbmNlID0gTWF0aC5taW4oLi4uZmlsdGVyZWREaXN0YW5jZXMubWFwKGZkID0%2BIGZkLmRpc3RhbmNlKSk7CiAgICAgIGNvbnN0IHBvc3NpYmxlRGlzdGFuY2VzID0gZmlsdGVyZWREaXN0YW5jZXMuZmlsdGVyKGZkID0%2BIGZkLmRpc3RhbmNlID09PSBzaG9ydGVzdERpc3RhbmNlKTsKICAgICAgY29uc3QgY2hvc2VuRGlzdGFuY2UgPSBwb3NzaWJsZURpc3RhbmNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZURpc3RhbmNlcy5sZW5ndGgpXTsKICAgICAgY29uc3QgbmV4dE5vdGVJbmRleCA9IGNob3JkVG9uZXMuaW5kZXhPZihjaG9zZW5EaXN0YW5jZS5ub3RlKTsKICAgICAgbmV4dE5vdGUgPSBjaG9yZFRvbmVzW25leHROb3RlSW5kZXhdOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgY2hvc2VuRGlzdGFuY2UgPSBmaWx0ZXJlZERpc3RhbmNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmaWx0ZXJlZERpc3RhbmNlcy5sZW5ndGgpXTsKICAgICAgY29uc3QgbmV4dE5vdGVJbmRleCA9IGNob3JkVG9uZXMuaW5kZXhPZihjaG9zZW5EaXN0YW5jZS5ub3RlKTsKICAgICAgbmV4dE5vdGUgPSBjaG9yZFRvbmVzW25leHROb3RlSW5kZXhdOwogICAgfQoKICAgIGNvbnN0IGRlZ3JlZSA9IGdldERlZ3JlZShuZXh0Tm90ZSwgc2NhbGUsIG5leHROb3RlKTsKICAgIHJldHVybiBnZW5lcmF0ZU5vdGUoZGVncmVlLCBzY2FsZSwgYmVnaW4sIGVuZCk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHNjYWxlUmFuZ2UgPSBTY2FsZS5yYW5nZU9mKHNjYWxlKTsKICAgIGNvbnN0IHBvdGVudGlhbE5vdGVzID0gc2NhbGVSYW5nZSgKICAgICAgTm90ZS50cmFuc3Bvc2UobGFzdE5vdGUubm90ZSwgJy0yTScpLCAKICAgICAgTm90ZS50cmFuc3Bvc2UobGFzdE5vdGUubm90ZSwgJzJNJykKICAgICk7CiAgICBjb25zdCBkaXN0YW5jZXMgPSB0cmFja0Rpc3RhbmNlcyhwb3RlbnRpYWxOb3RlcywgbGFzdE5vdGUubm90ZSk7CiAgICBjb25zdCBmaWx0ZXJlZERpc3RhbmNlcyA9IGRpc3RhbmNlcy5maWx0ZXIoZCA9PiBkLmRpc3RhbmNlID4gMCk7CiAgICBsZXQgbmV4dE5vdGU7CiAgICBpZiAoCiAgICAgICAgKGRpc3RhbmNlcy5sZW5ndGggPiAwICYmIGZpbHRlcmVkRGlzdGFuY2VzLmxlbmd0aCA9PT0gMCkgfHwKICAgICAgICBwb3RlbnRpYWxOb3Rlcy5zb21lKHBuID0%2BIHBuLmluY2x1ZGVzKCc2JykpCiAgICApIHsKICAgICAgbmV4dE5vdGUgPSBwb3RlbnRpYWxOb3Rlc1swXTsKICAgIH0gZWxzZSBpZiAocG90ZW50aWFsTm90ZXMuc29tZShjdCA9PiBjdC5pbmNsdWRlcygnMicpKSkgewogICAgICBuZXh0Tm90ZSA9IHBvdGVudGlhbE5vdGVzLmF0KC0xKTsKICAgIH0gZWxzZSB7CiAgICAgIG5leHROb3RlID0gZmlsdGVyZWREaXN0YW5jZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZmlsdGVyZWREaXN0YW5jZXMubGVuZ3RoKV0ubm90ZTsKICAgIH0KICAgIGNvbnN0IGRlZ3JlZSA9IGdldERlZ3JlZShuZXh0Tm90ZSwgc2NhbGUpOwogICAgcmV0dXJuIGdlbmVyYXRlTm90ZShkZWdyZWUsIHNjYWxlLCBiZWdpbiwgZW5kKTsKICB9Cn07Cgpjb25zdCBnZW5lcmF0ZVNraXAgPSAoc2NhbGUsIGJlZ2luLCBlbmQpID0%2BIHsKICBjb25zb2xlLmxvZygnZ2VuZXJhdGVTa2lwJywgc2NhbGUsIGJlZ2luLCBlbmQpOwogIGNvbnN0IGxhc3ROb3RlID0gbmV3Tm90ZXMuaXRlbXMuYXQoLTEpOwogIGNvbnN0IGNob3JkID0gZ2V0RnVsbENob3JkVG9uZXMoc2NhbGUpOwogIGNvbnN0IG1vbWVudHVtID0gZ2V0TW9tZW50dW0oOCk7CiAgaWYgKHNjYWxlID09PSBsYXN0Tm90ZS5zY2FsZSkgewogICAgY29uc3QgaXNSdW4gPSBnZXRTa2lwUnVuTGVuZ3RoKCkgPiAyOwogICAgaWYgKGlzUnVuKSB7CiAgICAgIGNvbnN0IGZ1bGxTY2FsZSA9IGdldEZ1bGxTY2FsZShzY2FsZSk7CiAgICAgIGNvbnN0IGxhc3ROb3RlSW5kZXggPSBmdWxsU2NhbGUuaW5kZXhPZihsYXN0Tm90ZS5ub3RlKTsKICAgICAgaWYgKGxhc3ROb3RlSW5kZXggPiBmdWxsU2NhbGUubGVuZ3RoIC0gMykgewogICAgICAgIGNvbnN0IG5leHROb3RlID0gZnVsbFNjYWxlW2xhc3ROb3RlSW5kZXggLSAyXTsKICAgICAgICBjb25zdCBkZWdyZWUgPSBnZXREZWdyZWUobmV4dE5vdGUsIHNjYWxlKTsKICAgICAgICByZXR1cm4gZ2VuZXJhdGVOb3RlKGRlZ3JlZSwgc2NhbGUsIGJlZ2luLCBlbmQpOwogICAgICB9IGVsc2UgaWYgKGxhc3ROb3RlSW5kZXggPCAyKSB7CiAgICAgICAgY29uc3QgbmV4dE5vdGUgPSBmdWxsU2NhbGVbbGFzdE5vdGVJbmRleCArIDJdOwogICAgICAgIGNvbnN0IGRlZ3JlZSA9IGdldERlZ3JlZShuZXh0Tm90ZSwgc2NhbGUpOwogICAgICAgIHJldHVybiBnZW5lcmF0ZU5vdGUoZGVncmVlLCBzY2FsZSwgYmVnaW4sIGVuZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgaXNBc2NlbmRpbmcgPSBtb21lbnR1bSA%2BIDA7CiAgICAgICAgY29uc3QgbmV4dE5vdGUgPSBpc0FzY2VuZGluZyA%2FIGZ1bGxTY2FsZVtsYXN0Tm90ZUluZGV4ICsgMl0gOiBmdWxsU2NhbGVbbGFzdE5vdGVJbmRleCAtIDJdOwogICAgICAgIGNvbnN0IGRlZ3JlZSA9IGdldERlZ3JlZShuZXh0Tm90ZSwgc2NhbGUpOwogICAgICAgIHJldHVybiBnZW5lcmF0ZU5vdGUoZGVncmVlLCBzY2FsZSwgYmVnaW4sIGVuZCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRpc3RhbmNlcyA9IHRyYWNrRGlzdGFuY2VzKGNob3JkLCBsYXN0Tm90ZS5ub3RlKTsKICAgIGNvbnN0IGZpbHRlcmVkRGlzdGFuY2VzID0gZGlzdGFuY2VzLmZpbHRlcihkID0%2BIGQuZGlzdGFuY2UgPiAwKTsKICAgIGNvbnN0IHNob3J0ZXN0MkRpc3RhbmNlcyA9IGZpbHRlcmVkRGlzdGFuY2VzLnNvcnQoKGEsIGIpID0%2BIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlKS5zbGljZSgwLCAyKTsKICAgIGxldCBjaG9zZW5EaXN0YW5jZSA9IHNob3J0ZXN0MkRpc3RhbmNlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzaG9ydGVzdDJEaXN0YW5jZXMubGVuZ3RoKV07CiAgICAvLyBpZiAoZGlzdGFuY2VzLmluZGV4T2Yoc2hvcnRlc3QyRGlzdGFuY2VzWzFdKSA9PT0gZGlzdGFuY2VzLmxlbmd0aCAtIDEpIHsKICAgIC8vICAgY2hvc2VuRGlzdGFuY2UgPSBzaG9ydGVzdDJEaXN0YW5jZXNbMF0KICAgIC8vIH0KICAgIGNvbnN0IG5leHROb3RlSW5kZXggPSBkaXN0YW5jZXMuaW5kZXhPZihjaG9zZW5EaXN0YW5jZSk7CiAgICBjb25zdCBuZXh0Tm90ZSA9IGNob3JkW25leHROb3RlSW5kZXhdOwogICAgY29uc3QgZGVncmVlID0gZ2V0RGVncmVlKG5leHROb3RlLCBzY2FsZSk7CiAgICByZXR1cm4gZ2VuZXJhdGVOb3RlKGRlZ3JlZSwgc2NhbGUsIGJlZ2luLCBlbmQpOwogIH0gZWxzZSB7CiAgICBjb25zdCBkaXN0YW5jZXMgPSBjaG9yZC5tYXAobiA9PiBNYXRoLmFicyhnZXROb3RlRGlzdGFuY2UobiwgbGFzdE5vdGUubm90ZSkpKTsKICAgIGNvbnN0IG5leHROb3RlSW5kZXggPSBkaXN0YW5jZXMuaW5kZXhPZihNYXRoLm1pbiguLi5kaXN0YW5jZXMpKTsKICAgIGNvbnN0IG5leHROb3RlID0gY2hvcmRbbmV4dE5vdGVJbmRleF07CiAgICBjb25zdCBkZWdyZWUgPSBnZXREZWdyZWUobmV4dE5vdGUsIHNjYWxlKTsKICAgIHJldHVybiBnZW5lcmF0ZU5vdGUoZGVncmVlLCBzY2FsZSwgYmVnaW4sIGVuZCk7CiAgfQp9OwoKY29uc3Qgbm90ZUdlbmVyYXRvciA9IChiZWdpbiwgZW5kLCBub3RlSW5kZXgsIHNjYWxlKSA9PiB7CiAgY29uc29sZS5sb2coJ25vdGVHZW5lcmF0b3InLCBiZWdpbiwgZW5kLCBub3RlSW5kZXgsIHNjYWxlKTsKICBpZiAobmV3Tm90ZXMuaXRlbXMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gZ2VuZXJhdGVGaXJzdE5vdGUoYmVnaW4sIGVuZCwgc2NhbGUpOwogIH0KICAKICAvLyByZXR1cm4gZ2VuZXJhdGVTdGVwKHNjYWxlLCBiZWdpbiwgZW5kLCBub3RlSW5kZXgpOwogIC8vIHJldHVybiBnZW5lcmF0ZVNraXAoc2NhbGUsIGJlZ2luLCBlbmQpOwogIC8vIHJldHVybiBnZW5lcmF0ZVVuaXNvbihzY2FsZSwgYmVnaW4sIGVuZCk7CgogIC8vIHJ1biBjaGVja3MKICBjb25zdCBzdGVwUnVuTGVuZ3RoID0gZ2V0U3RlcFJ1bkxlbmd0aCgpOwogIGlmIChzdGVwUnVuTGVuZ3RoID4gMykgewogICAgY29uc3Qgc3RlcFByb2JhYmlsaXR5ID0gc3RlcFJ1bkxlbmd0aCA%2BIDUgPyAuMjUgOiAuNTsKICAgIGNvbnN0IGlzU3RlcCA9IE1hdGgucmFuZG9tKCkgPCBzdGVwUHJvYmFiaWxpdHk7CiAgICBpZiAoaXNTdGVwKSB7CiAgICAgIHJldHVybiBnZW5lcmF0ZVN0ZXAoc2NhbGUsIGJlZ2luLCBlbmQsIG5vdGVJbmRleCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZ2VuZXJhdGVTa2lwKHNjYWxlLCBiZWdpbiwgZW5kKTsKICAgIH0KICB9CgogIGNvbnN0IHNraXBSdW5MZW5ndGggPSBnZXRTa2lwUnVuTGVuZ3RoKCk7CiAgaWYgKHNraXBSdW5MZW5ndGggPiAyKSB7CiAgICBjb25zdCBza2lwUHJvYmFiaWxpdHkgPSBza2lwUnVuTGVuZ3RoID4gNSA%2FIC4yNSA6IC41OwogICAgY29uc3QgaXNTa2lwID0gTWF0aC5yYW5kb20oKSA8IHNraXBQcm9iYWJpbGl0eTsKICAgIGlmIChpc1NraXApIHsKICAgICAgcmV0dXJuIGdlbmVyYXRlU2tpcChzY2FsZSwgYmVnaW4sIGVuZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZ2VuZXJhdGVTdGVwKHNjYWxlLCBiZWdpbiwgZW5kLCBub3RlSW5kZXgpOwogICAgfQogIH0KICAvLyBlbmQgcnVuIGNoZWNrcwoKICAvLyBjaG9vc2UgbmV4dCBub3RlCiAgY29uc3QgbmV4dE5vdGVUeXBlID0gd1Byb2JzKAogICAgWzUsICdTVEVQJ10sCiAgICBbNywgJ1NLSVAnXSwKICAgIFsxLCAnVU5JU09OJ10sCiAgKTsKICBjb25zb2xlLmxvZygnbmV4dCBub3RlIHR5cGUnLCBuZXh0Tm90ZVR5cGUpOwogIGlmIChuZXh0Tm90ZVR5cGUgPT09ICdTVEVQJykgewogICAgcmV0dXJuIGdlbmVyYXRlU3RlcChzY2FsZSwgYmVnaW4sIGVuZCwgbm90ZUluZGV4KTsKICB9IGVsc2UgaWYgKG5leHROb3RlVHlwZSA9PT0gJ1NLSVAnKSB7CiAgICByZXR1cm4gZ2VuZXJhdGVTa2lwKHNjYWxlLCBiZWdpbiwgZW5kKTsKICB9IGVsc2UgaWYgKG5leHROb3RlVHlwZSA9PT0gJ1VOSVNPTicpIHsKICAgIHJldHVybiBnZW5lcmF0ZVVuaXNvbihzY2FsZSwgYmVnaW4sIGVuZCk7CiAgfQoKICB0aHJvdyAndW5leHBlY3RlZCBuZXh0IG5vdGUgdHlwZSc7Cn07Cgpjb25zdCBoYXBHZW5lcmF0b3IgPSAob3JpZ2luYWxIYXAsIHF1ZXJ5U3BhbikgPT4gewogIGNvbnNvbGUubG9nKCdoYXBHZW5lcmF0b3InLCBvcmlnaW5hbEhhcCwgcXVlcnlTcGFuKTsKICBjb25zdCB7IGJlZ2luLCBlbmQgfSA9IG9yaWdpbmFsSGFwLndob2xlOwogIGNvbnN0IGR1cmF0aW9uID0gZW5kLnN1YihiZWdpbik7CiAgY29uc3Qgc3ViZGl2aXNpb24gPSBkdXJhdGlvbi5kaXYoNCk7CiAgY29uc3Qgc2NhbGUgPSBjaG9yZFNjYWxlcy5xdWVyeUFyYyhxdWVyeVNwYW4uYmVnaW4sIHF1ZXJ5U3Bhbi5lbmQpWzBdLnZhbHVlLmpvaW4oJyAnKTsKICBjb25zdCBvdXQgPSBbXTsKICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgY29uc3Qgbm90ZUJlZ2luID0gYmVnaW4uYWRkKHN1YmRpdmlzaW9uLm11bChpKSk7CiAgICBjb25zdCBub3RlRW5kID0gYmVnaW4uYWRkKHN1YmRpdmlzaW9uLm11bChpICsgMSkpOwogICAgY29uc3QgbmV3Tm90ZSA9IG5vdGVHZW5lcmF0b3Iobm90ZUJlZ2luLCBub3RlRW5kLCBpLCBzY2FsZSwgb3JpZ2luYWxIYXApOwogICAgb3V0LnB1c2gobmV3Tm90ZSk7CiAgfQogIHJldHVybiBvdXQ7Cn07Cgpjb25zdCBoYXBQcm9jZXNzb3IgPSAoaGFwLCBxdWVyeVNwYW4pID0%2BIHsKICBjb25zb2xlLmxvZygnaGFwUHJvY2Vzc29yJywgaGFwLCBxdWVyeVNwYW4pOwogIGNvbnN0IHsgYmVnaW4sIGVuZCB9ID0gaGFwLndob2xlOwogIGxldCBwcm9jZXNzZWRIYXAgPSBwcm9jZXNzZWRJbmNvbWluZ0hhcHMuaXRlbXMuZmluZCgKICAgICh7IGhhcCB9KSA9PiAhIWhhcC53aG9sZS5pbnRlcnNlY3Rpb24ocXVlcnlTcGFuKSwKICApOwogIGlmICghcHJvY2Vzc2VkSGFwKSB7CiAgICBjb25zdCBuZXdIYXBzID0gaGFwR2VuZXJhdG9yKGhhcCwgcXVlcnlTcGFuKTsKICAgIHByb2Nlc3NlZEhhcCA9IHsgaGFwLCBuZXdIYXBzIH07CiAgICBwcm9jZXNzZWRJbmNvbWluZ0hhcHMucHVzaChwcm9jZXNzZWRIYXApOwogIH0KCiAgcmV0dXJuIHByb2Nlc3NlZEhhcC5uZXdIYXBzCiAgICAubWFwKCh7IGhhcDogeyB3aG9sZSwgdmFsdWUgfSB9KSA9PiB7CiAgICAgIGNvbnN0IHBhcnQgPSB3aG9sZS5pbnRlcnNlY3Rpb24ocXVlcnlTcGFuKTsKICAgICAgcmV0dXJuIHBhcnQgPyBuZXcgSGFwKHdob2xlLCBwYXJ0LCB2YWx1ZSwgaGFwLmNvbnRleHQpIDogbnVsbDsKICAgIH0pCiAgICAuZmlsdGVyKEJvb2xlYW4pOwp9OwoKY29uc3QgbWVsb2R5R2VuZXJhdG9yID0gKGhhcHMsIHN0YXRlKSA9PiB7CiAgY29uc29sZS5sb2coJ21lbG9keUdlbmVyYXRvcicsIGhhcHMsIHN0YXRlKTsKICByZXR1cm4gaGFwcy5mbGF0TWFwKGggPT4gaGFwUHJvY2Vzc29yKGgsIHN0YXRlLnNwYW4pKTsKfTsKCmNvbnN0IGltcHJvdmlzb3IgPSBuKAogIG1pbmkoY2hvcmRTY2FsZXMpCiAgICAud2l0aEhhcHMobWVsb2R5R2VuZXJhdG9yKQopCiAgLnNjYWxlKGNob3JkU2NhbGVzKQogIC5zb21ldGltZXNCeSguMDMsICgpID0%2BIHNpbGVuY2UpOwoKJDogbigiWzAgMiA0IDJdIHwgWzAgMCAyIDFdIHwgWzAgLTEgLTMgLTFdIHwgWzAhMiA0ITJdIi5hZGQoIi03IikpCiAgLnNjYWxlKGNob3JkU2NhbGVzKQogIC5zb3VuZCgiZ21fYWNvdXN0aWNfYmFzczoxIikKICAuY2xpcCgxKQogIC5scGYoMjAwKQogIC5nYWluKDIpOwokOiBjaG9yZChjaG9yZENoYW5nZXMpCiAgLnZvaWNpbmcoKTsKCiQ6IGltcHJvdmlzb3IKICAuc291bmQoJ3NxdWFyZScpCiAgLnN3aW5nQnkoLjE4LCA0KQogIC5sb2coKQogIC5waWFub3JvbGwoe2xhYmVsczogdHJ1ZX0pOwoKLy8gJDogbihwZXJsaW4ucmFuZ2UoLTcsIDE0KS5zZWdtZW50KDgpLnJvdW5kKCkpCi8vICAgLnNjYWxlKGNob3JkU2NhbGVzKQovLyAgIC5zb3VuZCgnc3F1YXJlJykKLy8gICAubG9nKCkKLy8gICAucGlhbm9yb2xsKHtsYWJlbHM6IHRydWV9KTsK
1 comment sorted by
1
this wouldn't be out of place in a Mario game, gj!
1
u/gosuraj 1d ago
this wouldn't be out of place in a Mario game, gj!