JavaScript, 62 61 37 bytes
Obrigado a @ Doᴡɴɢᴏᴀᴛ pela ajuda!
Original [37 bytes]:
f=_=>'f='+'_'.repeat((10+f).length)+f
Filho [74 bytes]:
f=______________________________________=>'f='+'_'.repeat((10+f).length)+f
Neto [148 bytes]:
f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f
Alternativo (com impressão no console e como um programa completo):
Original [61 bytes]:
f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
Filho [122 bytes]:
f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
Neto [244 bytes]:
f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
Como funciona!
1. f=_=>
Defina a função f comoconsole.log(...)
2. ;f()
Execute a função f.
3. (na função f)
Notas
console.log
é necessário em vez de alert
porque alert
parece não funcionar bem com seqüências muito longas (pelo menos na configuração da minha máquina / navegador)
- Os
_
são inseridos no nome do parâmetro (não utilizado) da função f, para garantir que sejam incluídos na string de f.
- O aprimoramento principal (além de se livrar da
console.log
) da primeira solução em relação à segunda: adicionar 10
à função em vez de 0
convertê-la em string o torna um byte mais longo, eliminando a necessidade de adicionar 1 ao comprimento posteriormente, economizando um byte.