Como determinar se um número é ímpar ou par sem operações mod - ou - bit a bit?
Esse desafio é extremamente ineficiente, mas desafia sua capacidade de pensar fora da caixa em busca de uma solução criativa.
EDIT :
Por favor, crie uma função. Além disso, enquanto regex é uma resposta divertida, a função deve aceitar qualquer número válido.
JUSTIFICATIVA : Esta questão decorre dos meus primeiros dias de programação. O dever de casa para o nosso primeiro dia de aula era escrever um programa simples que imprimisse 'ímpar' ou 'par'. Sendo o pirralho que eu era, não li o livro que tínhamos para a classe, onde ele simplesmente nos mostrava como usá-lo%
para determinar isso. Passei meia hora andando de um lado para o outro no meu quarto, tentando pensar em uma maneira de fazer isso e lembrei da palestra que os números podem perder e ganhar precisão à medida que são transmitidos de um tipo primitivo para outro. Portanto, se você pegasse o número, o dividisse por dois e depois o multiplicasse, não seria igual ao número original, saberia que o número era ímpar.
Fiquei surpreso no dia seguinte, enquanto nosso instrutor avaliava nossos programas, que ele achava que era a maneira mais original, embora ineficiente, de solucionar o problema.
fonte
Respostas:
Na maioria das linguagens de programação, a divisão retorna quociente para números inteiros. Então você pode simplesmente verificar isso
fonte
int
/long
Tipofloor()
. Isso funciona perfeitamente em C e C ++.Pitão
fonte
Brainf *** (179)
Esse é um dos problemas mais interessantes envolvendo lógica condicional que fiz no BF.
É preciso uma entrada de texto com um número. Se o número for par, ele gera
E
e, se for ímpar, ele geraO
.Estou orgulhoso o suficiente para mostrar uma forma mais legível para humanos:
fonte
Mathematica
fonte
I
e emPi
vez dei
epi
.C
Multiplicado por si só algumas vezes, qualquer número par passará para 0, dado um número inteiro de tamanho finito, e qualquer número ímpar continuará tendo pelo menos o conjunto de bits menos significativo.
Edit: Como uma função simples:
fonte
Python (lento)
fonte
abs()
chamada no início.Javascript
produz
true
para um número par. Isso funciona apenas com números inteiros de tamanho razoável (por exemplo, notação não científica quando convertida em uma string e sem uma parte fracionária).fonte
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. Nesse caso, você poderia fazer/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
seria um pouco mais rigoroso que o seu regex. Você precisaria de mais trabalho para que isso funcione corretamente para números que serão usados usando notação científica.Pitão
Como não tenho muita certeza de quais são os critérios de pontuação, aqui estão algumas soluções que eu encontrei por diversão. A maioria deles usa
abs(n)
para suportar números negativos. A maioria, se não todos, nunca deve ser usada para cálculos reais.Este é meio chato:
E este é o meu favorito, embora, infelizmente, não funcione (como apontado por March Ho abaixo: só porque todos os números pares são a soma de dois números primos, não significa que todos os números ímpares não sejam).
fonte
Haskell
É claro que essa não é a solução criativa e inovadora que você procura, mas quantas vezes vou postar uma resposta Haskell menor que a GolfScript, na verdade? É realmente uma pena que isso não seja um código de golfe.
Mas mais a sério:
fonte
odd
), que é uma função interna que retorna True se o número for ímpar. Essa é uma resposta completa por si só e mais curta que a resposta atual do GolfScript (que no momento em que escrevemos isso é 10 caracteres, mas espero que diminua). A questão também é um pouco subespecificada, e é por isso que afirmo queodd
é suficiente. Isso pode mudar também.parity
algoritmo funciona em todas asNum
instâncias que são números inteiros. Isso é quente! Embora eu provavelmente tivesse feitoevens = [0,2..] >>= \n -> [-n, n]
. Semelhante para as probabilidades.Usando uma leitura deliberadamente perversa da pergunta, "Como determinar se um número é ímpar ou par", aqui está uma implementação C (assuma
bool
etrue
seja definida adequadamente):fonte
0.5
retornostrue
quando não deveria.Ainda não há algoritmos aleatórios ??
C
Emparelha aleatoriamente números no intervalo 0 .. n -1 até menos de 2 serem deixados. É bastante surpreendente ineficiente: O ( n 3 ).
Completamente diferente:
Haskell
Usa o fato de que a transformação de Fourier de uma função par (por exemplo
\x->x^^4
) é real, enquanto a transformação de Fourier de uma função ímpar é imaginária.fonte
Windows PowerShell
Sem operadores bit a bit, sem módulo, conforme solicitado.
fonte
Coq, 103
Tanto quanto posso dizer, esta é a primeira entrada coq no codegolf.
Ainda mais curto (59):
fonte
Rubi
Se você deseja imprimir o resultado:
fonte
.odd?
definição.Unlambda
O mundo precisa de mais Unlambda.
A Unlambda tem uma vantagem incrível aqui: sua representação padrão ( ahem ) para números são números da Igreja, então tudo o que é necessário é aplicá-los à função binária - e não à função verdadeira. Fácil!
PS: Markdown e Unlambda definitivamente não são feitos um para o outro.
Verificação para os primeiros números inteiros:
fonte
Golfscript
fonte
Pitão
Desempenho semelhante à versão anterior. Trabalha para 0 agora.
Versão anterior incorreta:
Não é particularmente eficiente; tempo e memória, obviamente, O (n): 32 ms para 1.000.000; 2,3 ms para 100000; 3,2 usec para 100. Funciona com números negativos. Lança um erro para 0, porque 0 não é par nem ímpar.
fonte
Fractran
aplicado a
produz
5
sen
é ímpar ou1
sen
é par.Atualização : muito mais curta, mas não tão interessante:
é
2
para ímparn
e1
para parn
.fonte
MMIX (4 bytes)
Isso é meio que trapaça. Não uso operações de modificação nem de manipulação de bits. É melhor que o teste de números pares / ímpares seja incorporado. Supondo que
$3
contenha o número a ser testado e o resultado seja$2
:define
$2
como1
se$3
é par e0
se não é. O mnemnoricZSEV
significa zero-set even e tem a seguinte semântica:Para a linha acima,
mmixal
gera esses quatro bytes de montagem:fonte
Esquema
Esta é a solução mais ineficiente que eu conheço.
fonte
Perl
Sobre o quê
fonte
JavaScript, 36
Retorna
true
se for par,false
se não for.fonte
Perl
fonte
Pitão
testando o quadrado de i, então também funciona com números negativos
fonte
F #
Recursão mútua pela vitória.
Um número n é par se for zero ou (n-1) for ímpar.
Um número n é ímpar se for diferente de zero e (n-1) for par.
(abs adicionado caso alguém esteja interessado na paridade de números negativos)
fonte
Clojure
fonte
O que qualifica como operações bit a bit? Sob o capô, é provável que a divisão inteira por 2 seja implementada como uma mudança de bits.
Supondo que os turnos de bits não estejam disponíveis:
C / C ++
editar Faltaram alguns parênteses e, finalmente, foram alterados para remover um turno e torná-lo menos. Você pode testar isso com o seguinte (em * nix):
... embora no Linux / tcsh, eu tive que escapar da barra invertida
\n
mesmo que estivesse entre aspas simples. Eu testei em little & big-endian, funciona corretamente em ambos. Além disso, eu copiei isso manualmente; o computador com o qual estou postando não possui um compilador; portanto, pode haver erros.x86 asm
.
ou
ou
... Seguido por:
Como alternativa, o material de troca e comparação também pode ser feito desta maneira:
fonte
shl
e os amigos não são permitidos ...Em um processador 68000, você pode mover um valor de palavra do endereço definido pelo valor para testar:
e deixe a interceptação de hardware por erro de endereço determinar a natureza ímpar / par do valor - se a exceção for gerada, o valor será ímpar, se não, o valor será par:
Não funciona em CPUs Intel x86, pois são mais flexíveis no acesso a dados.
fonte
Pitão
Decidi tentar a solução mais feia e confusa que consegui pensar:
Imprime e se for par, ou se for ímpar.
fonte
Q
Continue subtraindo 2 até x <2 e depois converta para bool
fonte