Комментарии 17
Хоть сейчас и набегут приверженцы чистого, читаемого кода, но, как по мне, такие эксперименты всегда помогают в изучении языка. Спасибо за такой подробный разбор!
Вам на codegolf.stackexchange.com — там таких челленджей воз и маленькая тележка.
P.S.: Если бы ещё сокращался результирующий асм-код…
P.S.: Если бы ещё сокращался результирующий асм-код…
JSON.stringify все равно покрывает не 100% возможных ситуаций (например, если передать объекты с циклическими ссылками внутри). Т.е. у нас уже есть ограничения на параметры мемоизиуемой функции. Можно эти ограничения расширить :) Например, пусть параметры реализуют toString, тогда можно сделать через join и будет 48 символов :)
f=>(...a)=>f[k=a.join("\0")]=k in f?f[k]:f(...a);
Про особенности JSON.stringify упомянул; циклические ссылки в контексте поставленной задачи кажутся особым кейсом — пренебрегаем.
Если полагаться на toString, то join произойдет у Array.prototype.toString, так как мы отошли от arguments в пользу массива и будет еще короче. Но накладывать такие требования на данные — это слишком. Каноничней тогда на полифилы hashCode и equals посмотреть.
Если полагаться на toString, то join произойдет у Array.prototype.toString, так как мы отошли от arguments в пользу массива и будет еще короче. Но накладывать такие требования на данные — это слишком. Каноничней тогда на полифилы hashCode и equals посмотреть.
Тогда уже можно и:
f=>(...a)=>f[a]=a in f?f[a]:f(...a);
А Perl за это ругали…
Было бы хорошо все же вернуть пробелы и строки, статья ведь ход мыслей описывает.
Финальный результат без пробелов, для наглядности, можно в конце привести.
Да, в первой части статьи про чистую реализацию так и сделал. Это контрольная точка перед дальнейшей грязной доработкой, где уже за каждый символ приходится бороться: за тот же пробел перед in operator )
К слову, когда мы принимали решения от соискателей, то часто звучали справедливые комментарии мол не думали что укорачивать надо так однострочно. Но при оценке решений мы обращали внимание именно на используемые языковые выражения и пропущенные подводные камни.
На 50 символов можно попробовать так:
Тут конечно есть проблемы, функции без return будут возвращать единицу, но со своей задачей код справится :)
f=>(...a)=>f[k=JSON.stringify(a)]=f[k]||f(...a)||1
Тут конечно есть проблемы, функции без return будут возвращать единицу, но со своей задачей код справится :)
Отличная попытка ) но я боюсь мы не можем пренебречь сводимым к false результатами. Например, если вызов декорируемой функции используется в условии while или ожидается false для выхода из рекурсии. Опасная подмена 0 на 1, но спасибо за мысль!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
История одной задачи: Кратчайший мемоизатор на JavaScript