Como você deve saber, existe um fato matemático de que se você adicionar todos os números naturais, você terminará com ... -1/12 (consulte a Wikipedia aqui) .
É claro que este é um resultado muito estranho e não pode ser obtido apenas adicionando um número seguido por outro, mas alguns truques matemáticos especiais.
No entanto, sua tarefa é escrever um programa, que parece tentar adicionar todos os números naturais, mas quando você o executa, ele retorna -1/12.
No pseudocódigo, pode ser assim:
result = 0;
counter = 1;
while(true) {
result += counter;
counter ++;
}
println(result);
Você pode fazer isso da maneira que quiser - você pode explorar um pouco de buffer overflow, brincar com erros gerados enquanto alguma variável se torna muito grande ou apenas ocultar a coisa crucial ao longo do código de alguma maneira inteligente. As únicas condições são que o código pareça primeiro tentar adicionar todos os números naturais e, quando executado, retorna -1/12 (em qualquer formato, pode ser decimal, binário, texto, texto ascii art).
Obviamente, o código pode conter muito mais do que o mostrado acima, mas deve ficar claro o suficiente para enganar o leitor.
Este é um concurso de popularidade - vote na idéia mais inteligente!
fonte
Respostas:
C
Devem trabalhar em plataformas onde ambos
sizeof(float)
esizeof(int)
são 4 e segue o padrão de ponto flutuante IEEE (eu acho).Versão 1:
Resultado:
-0.083
Explicação:
Agradecimentos especiais a @Geobits pela idéia de terminar o loop comparando a soma em vez do contador.
Edit: Versão 2
Resultado:
-0.083333
Explicação:
fonte
79776
é137A0
, o que é((int) "\rz") << 4
. Não tenho certeza o quão útil que é, no entantowhile(!(abs<delta))
vez dewhile(abs>delta)
descartar a verificação NaN.Pitão
Resultado:
Então qual é o truque?
fonte
Mathematica
(Nota: colar isso em um notebook Mathematica provavelmente revelará o que está acontecendo.)
fonte
68+{0,37,46,37,31,36,40,33,48}
, já quePlus
possui oListable
atributo Pessoalmente, acho isso mais idiomático.C
Formata bem a resposta como
-1/12
, não0.8333
.Como funciona?
fonte
Brainfuck
O código apenas avalia 1 + 2 + 3 + ...
fonte
1 + 2 + 3 + ...
que significa que 256 teria de ser triangular,i == 256
como também afirma, mas 256 não é um número triangular. Além disso, onde seu código é gerado-1/12
?1/12
vez de-1/12
(Feliz hoje? +.
- -.
+ +.
+ Por favor vote em mim.
) Estes quatro.
são para saída.256
.i
ficam zero quando chegam256
(é isso que eu quis dizer com estouro). Nesse ponto, o loop externo termina e as linhas a seguir (que parecem comentários) são executadas, daí a saída de-1/12
.Apenas adicionando uma ofuscação um pouco melhor de deixar o loop na resposta do ás.
Dica: não há excesso ...
fonte
average=sum/i;
um SIGFPE, capturado porhandler
, imprime -1/12.unsigned int sum=3182065200L; printf("%.3f\n",*(float*) &sum);
é uma revelação absoluta de que algo está acontecendo lá, e ver que está no manipulador do SIGFPE torna isso muito óbvio para o meu gosto.Perl 6
Calcula a soma usando a função zeta. Eu teria usado
[+] 1..*
(soma de todos os números entre 1 e infinito), exceto que é executado em tempo infinito.fonte
Java
Isso adiciona todos os números de 0 ao valor máximo, multiplicado por 12, e também adiciona 1 no final. O resultado é 0, portanto a soma dos números deve ser (0 - 1) / 12.
Explicação:
fonte
Rubi
Demo
Ok, a suposta semântica e sintaxe de saída aqui faz pouco sentido, mas talvez isso não seja aparente em um relance casual.
Observe também que, de fato, isso é independente da Ruby Platform and Version. Depende de algumas outras constantes serem definidas conforme o esperado.
fonte
C
Para lidar com a soma (quase) infinita em um período de tempo razoável, compile com as seguintes opções para algumas otimizações do compilador (necessárias):
Saída de amostra:
fonte
??/
truque do trigógrafo já deixou de ser inteligente. :(Java
Em teoria, isso será impresso
true
. No entanto, acho que meu computador se desfaz em pó antes de terminar de executá-lo.fonte
-1/12
é absolutamente zero. Então, eu suponho que é algum tipo de comportamento de estouro que faz com que o loop termine e, coincidentemente,sum
transborda para zero?long
. O universo provavelmente não existirá mais até então, mas isso é apenas teórico, certo? E sim, todos os 32 bits inferioressum
serão zero - e é por isso que é importantesum
ser umint
, não umlong
. Obviamente, como o @ace disse, o Java usa a divisão inteira para avaliar-1/12
, então é zero.Java
Como funciona:
Gostaria de poder postar isso como um spoiler, mas não sei como. Aqui está o restante do código que está oculto.
fonte
Não há soluções Haskell, inaceitáveis!
Podemos utilizar as infinitas listas de Haskell para obter uma resposta exata!
Haskell:
A solução é bastante simples quando você leva em consideração as flechas ....
Então qual é o truque?
fonte
C
De acordo com o padrão C, isso pode muito bem ser impresso,
Answer = -1/12
pois haverá um estouro de número inteiro assinado que é um comportamento indefinido. Encontrar um compilador que faça isso é deixado como um exercício para o leitor.fonte
printf
Mathematica
fonte
Python 3.x
Meio novo aqui. Alguma dica?
fonte
JavaScript (ECMAScript 6)
Como funciona:
1:
2:
3:
4:
fonte
C ++
Se os dois
#define
s forem removidos, o código ainda será válido em C ++ e tentará (mas é claro que falhará) calcular a soma de todos os números inteiros.Como funciona:
Dado o pseudocódigo dos pôsteres, não pude resistir ao adicionar este. Ele usa a mesma idéia básica e outra pequena, mas não acho que seja tão elegante.
Como funciona:
E por que você não deve tentar executá-lo:
fonte