Vamos dar uma olhada em um loop típico, que geralmente realiza 8 iterações:
for (int x=0; x<8; ++x);
Você tem que torná-lo infinito!
É um concurso de popularidade para todos os idiomas que suportam essa forma de for
loop. Portanto, a solução com a pontuação mais alta (upvotes menos downvotes) vence.
Se o seu idioma tiver outra forma de for
loop, mas você tem certeza, pode fazer algo interessante com ele, sinta-se à vontade para postar a resposta e marcá-la como não-concorrente. Reservo-me o direito de ampliar o escopo das construções e idiomas disponíveis, mas isso nunca será reduzido, portanto, não tenha medo de descartar as soluções anteriormente corretas.
O que é solução?
A solução consiste em dois programas.
O primeiro programa é um programa limpo . É o programa típico em seu idioma, com o for
loop fazendo 8 iterações. Deve ser o programa normal, qualquer desenvolvedor pode escrever. Não há hacks especiais para fins de preparação. Por exemplo:
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
O segundo programa é aumentado. Este programa deve conter todo o código do programa limpo e algum código adicional. Há um número limitado de pontos de extensão; consulte a seção de regras completas para obter detalhes. Um programa aumentado para o programa limpo acima pode ser
inline bool operator < (const int &a, const int &b)
{
return true;
}
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Esse é apenas um exemplo (não compilável em C ++) para mostrar uma ideia. O verdadeiro programa aumentado correto deve ser compilável, funcionando e possuindo loop infinito.
Regras completas
Ambos os programas:
- Qualquer idioma com suporte para esses
for
loops está ok. - O corpo do loop deve estar vazio. Mais precisamente, você pode colocar alguma saída ou outro código no loop, mas o comportamento do loop deve ser o mesmo no caso de loop vazio.
Programa limpo:
O loop usa contador inteiro ou numérico e executa 8 iterações:
for (int x=0; x<8; ++x); // C, C++, C# for (var x=0; x<8; ++x); // C#, Javascript for (auto x=0; x<8; ++x); // C, C++ for (auto signed x=0; x<8; ++x); // C, C++ for (register int x=0; x<8; ++x); // C, C++
Tipos definidos pelo usuário não são permitidos.
- O uso da propriedade (exceto da variável global) em vez da variável de loop não é permitido.
A declaração da variável pode estar dentro ou fora do loop. O código a seguir está ok:
int x; for(x=0; x<8; ++x);
É possível usar o incremento de prefixo ou postfix.
O limite do loop
8
deve ser gravado como um literal constante sem salvar na constante ou variável nomeada. Foi criado para impedir soluções baseadas em declarar variável ou constante igual a 8 e, em seguida, reatribuir, substituir ou sombrear pelo outro valor:const double n = 8; int main() { const double n = 9007199254740992; for (double x=0; x<n; ++x); return 0; }
Programa aumentado:
- Deve conter todo o código do código limpo.
- Deve estender o programa limpo em um número limitado de pontos de extensão.
- Deve executar o mesmo
for
loop que um loop infinito em si.
Colocar o loop em outra construção infinita não é bom. - O patch em tempo de execução ou em tempo de compilação do código é permitido desde que a representação textual dele seja inalterada.
- Colocar a construção em uma string e passar para
eval
não é permitido.
Pontos de extensão:
- Em qualquer lugar fora do fragmento com código limpo, incluindo outros arquivos ou outros assemblies.
for
A declaração (como peça única -for
construção e seu corpo) deve ser mantida inalterada.- A declaração variável deve ser mantida igual.
- Qualquer lugar entre instruções simples pode ser usado como ponto de extensão.
- Se e somente se a variável foi declarada fora do loop e sem atribuição imediata do valor, essa atribuição pode ser adicionada.
/* extension point here */
int main()
/* extension point here */
{
/* extension point here */
int x /* extension point for assignment here */;
/* extension point here */
for (x=0; x<8; ++x);
/* extension point here */
return 0;
/* extension point here */
}
/* extension point here */
int main()
{
/* BEGIN: No changes allowed */ int x = 0; /* END */
/* extension point here */
/* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
return 0;
}
PS: Se possível, forneça um link para o IDE online.
fonte
java.lang.Integer
? 2. Isso seria melhor com um critério de vitória adequado.Respostas:
Python3
Programa Limpo:
Esta é apenas uma contagem regressiva padrão enquanto loop.
Programa aumentado:
Ele usa o cache int para redefinir
8
o9
que efetivamente torna on -= 1
no-op, uma vez9-1 = 8
que apenasn
volta ao9
normal, causando o loop infinito.Você pode ver o cache int em ação online aqui (embora obviamente sem o loop infinito porque esteja online).
fonte
8
para9
Python 3.5.2 (default, Dec 2015, 13:05:11) [GCC 4.8.2] on linux
Python 3
Programa Limpo:
A maneira padrão de fazer algo 8 vezes em python é:
Programa aumentado:
No entanto, se substituirmos a função do gerador de alcance para gerar infinitamente 1, ela se tornará um loop infinito ...
Podemos levar isso adiante e criar uma função geradora que, em vez de produzir infinitamente 1, conta para sempre:
Teste em repl.it
fonte
Perl
Limpar \ limpo
Aumentada
Ideone .
fonte
$i
para se tornar um alias para uma variável especial que só é capaz de conter booleanos; portanto, quando atinge 1, fica imune a ser incrementado.ES5 + (Javascript)
EDIT : Removida a declaração de variável explícita, caso contrário ela foi içada e uma propriedade window.x não configurável foi criada (a menos que seja executada linha por linha no console REPL).
Explicação:
Aproveita o fato de que qualquer variável com escopo global também é uma propriedade do objeto window e redefine a propriedade "window.x" para ter um valor constante de 1.
Limpar \ limpo
Aumentada
NOTA : Para fazer isso funcionar no Node.js., substitua "window" por "global" (testado no Node.js. 6.8.0)
fonte
var
no Crome. Mas você pode removervar
dos dois programas - tudo ficará bem.var
guinchos, portanto, no momento de usá-defineProperty
lo, já sai. Mas se você colocar essas 2 linhas em scripts diferentes (a propósito, é permitido), funcionaria, pois a propriedade será criada primeiro e, emvar
seguida, será ignorada. Prova: i.stack.imgur.com/lSwbE.pngC
Programa limpo
Programa aumentado
fonte
Must execute same for loop as an infinite loop itself. Placing of the loop into another infinite construction is not ok.
Java
Programa limpo:
Programa aumentado:
Define o número inteiro no cache de número inteiro que deve conter 1 a 0, efetivamente fazendo
i++
nada (ele definei
o número inteiro em cache que deve conter 1, mas desde que esse número inteiro realmente contém 0, nada muda).fonte
int
e não o relativamente pesadoInteger
.C ++
bool
só pode ser 0 ou 1. Inspirado pela resposta Perl do primo .fonte
Python 3 (3.5.0)
Programa Limpo:
Aumentada
Esta solução é diferente das outras escritas em Python, pois na verdade altera o código-fonte em tempo real. Todas as coisas no loop for podem ser alteradas para qualquer código desejado.
O código altera o penúltimo opcode para ser
113
ou mais legível -JUMP_ABSOLUTE
. Ele altera o operando para160
- a instrução em que o loop for começa, criando uma instrução GOTO no final do programa.O programa aumentado imprime os números
0..7
infinitamente várias vezes sem sobrecarregar a pilha ou similar.fonte
PHP
Eu acho que isso está seguindo as regras do ponto de extensão; Não sou totalmente claro no ponto 4. É muito semelhante à resposta perl do @ primo, então acho que conta.
Limpar \ limpo
Aumentada
O PHP permite incrementar certas strings, da seguinte forma:
Todas essas seqüências são avaliadas como 0, então isso ocorrerá praticamente para sempre (exceto, de alguma forma, a falta de memória).
fonte
Perl
Código limpo
Código aumentado
A maioria das variáveis Perl são apenas variáveis. No entanto, o idioma também possui um
tie
recurso, que permite fornecer efetivamente getters e setters de variáveis. Neste programa, eu faço o pacote principal (cujo nome é a cadeia nula) no equivalente a uma classe de uma linguagem orientada a objetos, além de ser um programa. Isso me permite amarrar ofor
contador de loop ao próprio programa. ImplementarTIESCALAR
permitetie
ter sucesso; o valor de retorno deTIESCALAR
deve ser uma referência a qualquer estado interno que precisamos manter associado à variável, mas como não precisamos disso, retornamos uma referência de matriz vazia como espaço reservado. Em seguida, fornecemos as implementações mais simples possíveis do getter e setter; nenhum deles faz nada, então tenta atribuir a$x
não têm efeito e as tentativas de lê-lo sempre retornamundef
, que é numericamente menor que 8.fonte
WinDbg
Limpar \ limpo
Aumentada
Essa abordagem cria um alias para
<
as|
, portanto, quando<
é encontrado no código, o alias é expandido|
e bit a bit - ou é feito em vez de menor que. No WinDbg, todos os valores diferentes de zero sãoanything | 8
verdadeiros, portanto sempre é verdade.Nota: Na
.block
verdade, não é necessário se oaS
e.for
for inserido como duas linhas diferentes, como mostrado aqui, é necessário apenas quando oaS
e.for
estiver na mesma linha.fonte
Mathematica
Limpar \ limpo
Aumentada
fonte
Lisp comum
Código limpo
Aumentada
Uma macro chamada
keyword:dotimes
aka:dotimes
(consulte 11.1.2.3 O pacote KEYWORD ) é definida e se expande como um loop infinito. Adefmacro
macro retorna o nome da macro que está sendo definida, e pode ser alimentadashadowing-import
. Portanto, esse novodotimes
símbolo sombreia o padrão (que não deve ser redefinido ou vinculado lexicamente a outra macro em programas portáteis).Aumentado (2)
Quando lemos o caractere 8, substituímos por
(loop)
. Isso significa que o texto acima mostra como(dotimes (i (loop)))
e, portanto, o código nunca termina o cálculo do limite superior. Isso afeta todas as ocorrências de 8, não apenas a do loop. Em outras palavras, 8 realmente significa infinito. Se você estiver curioso, quando a tabela de leitura for modificada como acima, o caractere 8 se tornará "terminador" e se desconectará de outros números / símbolos atualmente sendo lidos:... lê como:
Você pode executar testes no Ideone: https://ideone.com/sR3AiU .
fonte
Rubi
Limpar \ limpo
Esse tipo de loop for não é muito usado no Ruby, mas um tutorial típico informa que esse é o caminho a seguir:
Aumentada
O loop for apenas chama
(1..8).each
com o bloco de código fornecido, então alteramos esse método:fonte
Haskell
Versão limpa:
Versão aumentada:
É bastante básico, realmente: nós apenas definir o nosso próprio tipo
T
de tal forma que o seuenumFromTo
caso é uma sequência infinita, em seguida, usar o tipo de falta para que os valores un-anotada do tipo0
e8
são tomados como tipoT
.fonte
///
Não há
for
loops explícitos em ///, mas podem ser simulados (afinal, ele está completo).Limpar \ limpo:
Aumentada:
O que está acontecendo?
Enquanto o primeiro programa faz a contagem regressiva 8-0, o último de uma
/0/0/
regra irá substituir0
por0
até a eternidade.fonte
/0/1//1/2/.../7/8//8/8/8
contar em seu lugar.Javascript ES6
OK, aqui está uma versão que funciona usando o ES6 para ... da construção de loop. Vou até lhe dar uma matriz limpa, para ter certeza de que não há nenhum negócio engraçado:
Limpar \ limpo
Claro, isso não impede que alguém mexa com o protótipo Array ...
Aumentada
Isso funciona substituindo o iterador padrão para que ele nunca termine, bloqueando tudo em um loop infinito. O código nem sequer tem a chance de executar as coisas dentro do loop.
fonte
var
no loop.C ++
Usa 2 pontos de extensão:
Programa limpo é o mesmo que na descrição.
fonte
Brainfuck
Imprimo um '0' cada iteração, apenas para facilitar a contagem de iterações. Mas qualquer código pode ser inserido lá sem alterar o funcionamento do loop.
Limpar \ limpo
Experimente online
A versão aumentada depende da implementação comum do Brainfuck com células de 8 bits. Nessas implementações, "incremento" é na verdade "incremento (mod 256)". Assim, para encontrar um loop que iterará exatamente 8 vezes na versão limpa e infinitamente na versão aumentada, podemos simplesmente encontrar uma solução para o seguinte sistema de desigualdades.
Nesse caso, deixamos a = 128, b = 16 e ec = 1. Obviamente 128 + 16 * 8 = 256 (e 256 (mod 256) = 0) e 128> 0, e como b é par, c + a + b * n é ímpar para qualquer ímpar a + c e, portanto, nunca será um múltiplo par de 256 nesses casos. Selecionamos c = 1 por uma questão de simplicidade. Portanto, a única mudança que precisamos é de uma única
+
no início do programa.Aumentada
Experimente online
Deixo ao OP para determinar se esta entrada está competindo. Brainfuck não tem um loop for explícito, mas o formulário que usei é o mais próximo possível.
++++++++
também é o mais próximo possível de um literal8
; Eu incluí alguns deles.A versão limpa quase certamente constitui um programa típico escrito nessa linguagem, pois mesmo o Brainfuck Hello World mais curto conhecido depende de uma relação de recorrência modular ao trabalho.
fonte
Haskell
Limpar \ limpo
Aumentada
Substitui o operador de aplicativo de função usual
$
por um que repete o loop novamente toda vez que termina. A execução da versão limpa imprime 0 a 8 e depois pára; a versão aumentada imprime 0 a 8 e depois 0 a 8 novamente, e assim por diante.Eu trapaceio um pouco, pois essa
forM_ [0..8] $ \i -> print i
não é necessariamente a maneira "mais limpa" de escrever esse loop em Haskell; muitos Haskellers reduziriam o corpo do loop para obterforM_ [0..8] print
e, então, não há$
como substituir. Em minha defesa, copiei o código limpo da resposta do Cactus , que não precisava dessa propriedade, então pelo menos um programador de Haskell realmente escreveu esse código sem motivação para adicionar desnecessariamente o$
!fonte
C ++
Vamos
x
avaliar para 7. Não funciona em C porque requer um valor l na atribuição e no incremento.fonte
Nim
A versão idiomática, usando
countup
:Limpar \ limpo
Aumentada
Simples e muito semelhante à resposta do Python, que redefine
range
. Redefinimoscountup
, a maneira idiomática do Nim de iterar de um int (inclusive) para outro, para dar 8s infinitamente.A versão mais interessante, usando o operador range
..
:Limpar \ limpo
Aumentada
Muito semelhante à solução anterior, exceto que redefinimos o operador range
..
, que normalmente daria uma matriz[1, 2, 3, 4, 5, 6, 7, 8]
, para o iterador de antes.fonte
GolfScript
Limpar \ limpo
Aumentada
Atribui a função retornando n + 1 à variável 8
fonte
tcl
Normal:
Aumentada:
A idéia é redefinir o
incr
comando que é usado para incrementar a variáveli
, para realmente não incrementar!Pode ser testado em: http://rextester.com/live/QSKZPQ49822
fonte
Montagem x86_64
Programa limpo:
O tipo de loop que qualquer programador do Assembly usaria, seguido por um syscall de saída para não permitir adicionar uma
jmp loop_start
instrução posteriormente.Programa aumentado:
Além disso, desculpe se é ruim que o programa limpo não tenha um ponto de entrada ou um
section .text
fonte
Javascript
Limpar \ limpo:
Aumentada:
fonte
C ++
Programa Limpo
Um loop normal e agradável, repetindo os números de 0 a 7.
Programa Aumentado
O pré-processador de C ++ é um recurso bastante perigoso ...
A única linha que tivemos que adicionar foi
#define short bool
. Isso tornai
um booleano em vez de um número inteiro curto e, portanto, o operador de incremento (i++
) não faz nada depois dei
atingir 1. A saída fica assim:fonte