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ดูเหมือนจะเล่นได้ไม่ดีกับสตริงที่ยาวมาก ๆ (อย่างน้อยในการกำหนดค่าเครื่อง / เบราว์เซอร์ของฉัน)
-
_'s จะแทรกเข้าไปในชื่อของ (ไม่ได้ใช้) พารามิเตอร์ของฟังก์ชัน f, เพื่อให้แน่ใจว่าพวกเขาจะรวมอยู่ใน stringification ของ f
- การปรับปรุงหลัก (นอกเหนือจากการกำจัด
console.log) ของวิธีแก้ปัญหาแรกในช่วงที่สอง: การเพิ่ม10ฟังก์ชั่นแทนที่จะ0ส่งไปยังสตริงทำให้มันยาวขึ้นหนึ่งไบต์โดยไม่ต้องเพิ่ม 1 ลงไปอีกหลังจากนั้นจึงประหยัดไบต์