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 ลงไปอีกหลังจากนั้นจึงประหยัดไบต์