JavaScript, 62 61 37 байт
Спасибо @ Doᴡɴɢᴏᴀᴛ за помощь!
Оригинал [37 байт]:
f=_=>'f='+'_'.repeat((10+f).length)+f
Ребенок [74 байта]:
f=______________________________________=>'f='+'_'.repeat((10+f).length)+f
Внук [148 байт]:
f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f
Альтернативно (с печатью на консоль и в виде полной программы):
Оригинал [61 байт]:
f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
Ребенок [122 байта]:
f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
Внук [244 байта]:
f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
Как это устроено!
1. f=_=>
Определите функцию f какconsole.log(...)
2. ;f()
Запустите функцию f.
3. (в функции f)
Заметки
console.log
необходимо, а не alert
потому, alert
что не очень хорошо работает с очень длинными строками (по крайней мере, на моей машине / в конфигурации браузера)
- В
_
«ы вставляются имя ( не используется) параметр функции F, чтобы гарантировать , что они включены в stringification из ф.
- Основное улучшение (кроме избавления от
console.log
) первого решения по сравнению со вторым: добавление 10
к функции вместо 0
преобразования ее в строку увеличивает длину на один байт, избавляя от необходимости добавлять 1 к длине впоследствии, сохраняя байт.