JAVA, 81 79 78 bytes
JAVA (HotSpot) 71 70 bytes
Mais curtas do que as outras respostas Java no momento em que publiquei (81, depois 79 bytes):
class A{public static void main(String[]a){String x="1";for(;;)x+=x.intern();}}
Conforme sugerido por @Olivier Grégoire, um outro byte pode ser salvo:
class A{public static void main(String[]a){for(String x="1";;)x+=x.intern();}}
A colocação x+=x.intern()
como o incremento do loop for não ajudaria em nada, porque ainda é necessário um ponto-e-vírgula para finalizar a instrução for.
Conforme sugerido por @ETHproductions, apenas o uso de x+=x
obras também:
class A{public static void main(String[]a){String x="1";for(;;)x+=x;}}
O que também pode se beneficiar da dica de @Olivier Grégoire:
class A{public static void main(String[]a){for(String x="1";;)x+=x;}}
Minhas únicas dúvidas sobre isso é que não é garantido alocar dados no heap , pois uma JVM eficiente pode facilmente perceber que x
nunca escapa à função local. O uso intern()
evita essa preocupação, porque as seqüências internas acabam sendo armazenadas em um campo estático. No entanto, o HotSpot gera um OutOfMemoryError
código para esse código, então acho que está tudo bem.
Atualização: @Olivier Gregoire também apontou que o x+=x
código pode ser executado em StringIndexOutOfBoundsException
vez de OOM
quando há muita memória disponível. Isso ocorre porque o Java usa o int
tipo de 32 bits para indexar matrizes (e Strings são apenas matrizes de char
). Isso não afeta a x+=x.intern()
solução, pois a memória necessária para o último é quadrática no comprimento da string e, portanto, deve ser dimensionada na ordem de 2 ^ 62 bytes alocados.