Pull to refresh

Comments 17

Хоть сейчас и набегут приверженцы чистого, читаемого кода, но, как по мне, такие эксперименты всегда помогают в изучении языка. Спасибо за такой подробный разбор!
Вам на codegolf.stackexchange.com — там таких челленджей воз и маленькая тележка.

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, то можно и просто:

f=>(...a)=>f[a]=a in f?f[a]:f(...a);


Но по условию задачи в качестве аргумента может быть объект, и тогда тест 6 падает на [object Object]. В этом основная сложность: найти кратчайшую функцию сериализации или хэширования.

Было бы хорошо все же вернуть пробелы и строки, статья ведь ход мыслей описывает.
Финальный результат без пробелов, для наглядности, можно в конце привести.

Да, в первой части статьи про чистую реализацию так и сделал. Это контрольная точка перед дальнейшей грязной доработкой, где уже за каждый символ приходится бороться: за тот же пробел перед in operator )
Я как-раз во второй части статьи перестал понимать, что происходит, из-за минификации. Действительно, лучше приводить полный, читаемый код, но количество символов в нём учитывать уже после минификации, раз уж статья для читателя, а не js-интерпретатора :)
К слову, когда мы принимали решения от соискателей, то часто звучали справедливые комментарии мол не думали что укорачивать надо так однострочно. Но при оценке решений мы обращали внимание именно на используемые языковые выражения и пропущенные подводные камни.
На 50 символов можно попробовать так:
f=>(...a)=>f[k=JSON.stringify(a)]=f[k]||f(...a)||1

Тут конечно есть проблемы, функции без return будут возвращать единицу, но со своей задачей код справится :)
Отличная попытка ) но я боюсь мы не можем пренебречь сводимым к false результатами. Например, если вызов декорируемой функции используется в условии while или ожидается false для выхода из рекурсии. Опасная подмена 0 на 1, но спасибо за мысль!
Тогда оставляем 0 в конце, нам же без разницы, что вернет функция undefined, null, 0 или false, мы это в конце концов обработаем.
Получится такая же ситуация как и с:
f[k]||f(...a)

т.е. сохраняем 0 или любое другое сводимое к false и всегда проваливаемся во второй операнд ИЛИ.
Sign up to leave a comment.