JAVA, 81 79 78 ไบต์
JAVA (ฮอตสปอต) 71 70 ไบต์
สั้นกว่าคำตอบ Java อื่น ๆ ในขณะที่ฉันโพสต์ (81, ต่อมา 79 ไบต์):
class A{public static void main(String[]a){String x="1";for(;;)x+=x.intern();}}
ตามที่แนะนำโดย @Olivier Grégoireสามารถบันทึกไบต์เพิ่มเติมได้:
class A{public static void main(String[]a){for(String x="1";;)x+=x.intern();}}
การวางx+=x.intern()
เป็นการเพิ่มแบบวนรอบสำหรับจะไม่ช่วยอะไรเลยเพราะเซมิโคลอนยังต้องการให้สิ้นสุดคำสั่ง for
ตามที่แนะนำโดย @ETHproductions เพียงใช้x+=x
งานด้วย:
class A{public static void main(String[]a){String x="1";for(;;)x+=x;}}
ซึ่งจะได้ประโยชน์จากเคล็ดลับของ @Olivier Grégoire:
class A{public static void main(String[]a){for(String x="1";;)x+=x;}}
ข้อสงสัยเพียงอย่างเดียวของฉันเกี่ยวกับเรื่องนี้คือไม่รับประกันว่าจะจัดสรรข้อมูลในฮีปเนื่องจาก JVM ที่มีประสิทธิภาพสามารถตระหนักได้อย่างง่ายดายว่าx
ไม่เคยรอดพ้นจากการทำงานในท้องถิ่น การใช้intern()
หลีกเลี่ยงข้อกังวลนี้เพราะท้ายที่สุดสตริงที่อยู่ภายในท้ายที่สุดจะถูกเก็บไว้ในฟิลด์สแตติก อย่างไรก็ตาม HotSpot สร้างOutOfMemoryError
รหัสนั้นขึ้นมาดังนั้นฉันคิดว่าไม่เป็นไร
Update: @Olivier Gregoire ยังชี้ให้เห็นว่าx+=x
รหัสสามารถทำงานได้StringIndexOutOfBoundsException
ดีกว่าOOM
เมื่อมีหน่วยความจำมากมาย นี่เป็นเพราะ Java ใช้int
ชนิด32 บิตเพื่อทำดัชนีอาร์เรย์ (และ Strings เป็นเพียงอาร์เรย์char
) สิ่งนี้จะไม่ส่งผลกระทบต่อการx+=x.intern()
แก้ปัญหาเนื่องจากหน่วยความจำที่ต้องการสำหรับหลังนั้นเป็นกำลังสองในความยาวของสตริงและดังนั้นจึงควรปรับขนาดตามลำดับของการจัดสรร 2 ^ 62 ไบต์