JAVA, 81 79 78 byte
JAVA (HotSpot) 71 70 byte
Ngắn hơn các câu trả lời Java khác tại thời điểm tôi đăng (81, sau 79 byte):
class A{public static void main(String[]a){String x="1";for(;;)x+=x.intern();}}
Theo đề xuất của @Olivier Grégoire, một byte nữa có thể được lưu:
class A{public static void main(String[]a){for(String x="1";;)x+=x.intern();}}
Đặt x+=x.intern()
làm tăng vòng lặp for sẽ không giúp được gì, vì dấu chấm phẩy vẫn được yêu cầu để kết thúc câu lệnh for.
Theo đề xuất của @ETHproductions, chỉ cần sử dụng x+=x
các tác phẩm:
class A{public static void main(String[]a){String x="1";for(;;)x+=x;}}
Điều này cũng có thể được hưởng lợi từ mẹo của @Olivier Grégoire:
class A{public static void main(String[]a){for(String x="1";;)x+=x;}}
Điều đáng tiếc duy nhất của tôi về điều đó là không đảm bảo phân bổ dữ liệu trên heap , vì một JVM hiệu quả có thể dễ dàng nhận ra rằng x
không bao giờ thoát khỏi chức năng cục bộ. Việc sử dụng intern()
sẽ tránh được mối lo ngại này vì cuối cùng các chuỗi được lưu trữ cuối cùng được lưu trữ trong một trường tĩnh. Tuy nhiên, HotSpot không tạo OutOfMemoryError
mã cho mã đó, vì vậy tôi đoán nó ổn.
Cập nhật: @Olivier Gregoire cũng chỉ ra rằng x+=x
mã có thể chạy vào StringIndexOutOfBoundsException
thay vì OOM
khi có nhiều bộ nhớ. Điều này là do Java sử dụng loại 32 bit int
để lập chỉ mục các mảng (và Chuỗi chỉ là mảng của char
). Điều này không ảnh hưởng đến x+=x.intern()
giải pháp vì bộ nhớ cần thiết cho chuỗi sau là bậc hai theo chiều dài của chuỗi và do đó sẽ mở rộng theo thứ tự 2 ^ 62 byte được phân bổ.