¿Cómo determinar si un número es impar o par sin operaciones mod o bit a bit?
Este desafío es extremadamente ineficiente, pero desafía su capacidad de pensar fuera de la caja para una solución creativa.
EDITAR :
Por favor crea una función. Además, aunque regex es una respuesta divertida, la función debe aceptar cualquier número válido.
ANTECEDENTES : Esta pregunta surge de mis primeros días de programación. La tarea para nuestro primer día de clase fue escribir un programa simple que imprimiera 'impar' o 'par'. Siendo el mocoso que era, no leí el libro que teníamos para la clase donde simplemente nos mostraba cómo usarlo%
para determinar eso. Pasé aproximadamente media hora caminando de vuelta en mi habitación tratando de pensar en una forma de hacer esto y recordé de la conferencia que los números pueden perder y ganar precisión a medida que se lanzan de un tipo primitivo a otro. Por lo tanto, si tomó el número, lo dividió por dos y luego lo multiplicó de nuevo no era igual al número original, entonces sabría que el número era impar.
Me sorprendió al día siguiente, mientras nuestro instructor estaba evaluando nuestros programas, que pensaba que era la forma más original, aunque ineficiente, de resolver el problema.
fuente
Respuestas:
En la mayoría de los lenguajes de programación, la división devuelve el cociente de enteros. Entonces puedes simplemente verificar esto
fuente
int
/long
tipofloor()
. Eso funciona perfectamente en C y C ++.Pitón
fuente
Cerebro *** (179)
Este es uno de los problemas más interesantes relacionados con la lógica condicional que he hecho en BF.
Se necesita un ingreso de texto con un número. Si el número es par, sale
E
, y si es impar, saleO
.Estoy lo suficientemente orgulloso como para mostrar una forma más legible para los humanos:
fuente
Mathematica
fuente
I
y enPi
lugar dei
ypi
.C
Multiplicado por sí mismo varias veces, cualquier número par se desbordará a 0 dado un número entero de tamaño finito, y cualquier número impar continuará teniendo al menos el conjunto de bits menos significativo.
Editar: como una función simple:
fuente
Python (lento)
fuente
abs()
llamada al principio.JavaScript
rinde
true
para un número par. Esto solo funciona con enteros de tamaño razonable (por ejemplo, no una notación científica cuando se convierte en una cadena y no tiene una parte fraccional).fuente
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. En ese caso, podría hacerlo/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
sería un poco más estricto que tu expresión regular. Necesitaría más trabajo para que esto funcione correctamente para números que están encadenados usando notación científica.Pitón
Como no estoy realmente seguro de cuáles son los criterios de puntuación, aquí hay un montón de soluciones que he ideado por diversión. La mayoría de ellos usan
abs(n)
para soportar números negativos. La mayoría, si no todos, nunca deben usarse para un cálculo real.Este es un poco aburrido:
Y este es mi favorito, aunque desafortunadamente no funciona (como señala March Ho a continuación: solo porque todos los números pares son la suma de dos números primos, no significa que todos los números impares no lo sean).
fuente
Haskell
Por supuesto, esta no es de ninguna manera la solución creativa y pensante que estás buscando, pero ¿cuántas veces voy a publicar una respuesta de Haskell más corta que GolfScript? Es realmente una pena que esto no sea un código de golf.
Pero más en serio:
fuente
odd
), que es una función integrada que devuelve True si el número es impar. Esa es una respuesta completa por sí sola y más corta que la respuesta actual de GolfScript (que en el momento de escribir esto son 10 caracteres, pero espero que disminuya). La pregunta también está un poco subespecificada, por lo que afirmo queodd
es suficiente. Eso también puede cambiar.parity
algoritmo funciona en todas lasNum
instancias que son enteros. Eso es caliente! Aunque probablemente lo hubiera hechoevens = [0,2..] >>= \n -> [-n, n]
. Similar a las probabilidades.Usando una lectura deliberadamente perversa de la pregunta, "Cómo determinar si un número es par o impar", aquí hay una implementación en C (suponga
bool
ytrue
se define adecuadamente):fuente
0.5
devolucionestrue
cuando no debería.¿Qué, todavía no hay algoritmos aleatorios?
C
Empareja aleatoriamente números en el rango 0 .. n -1 hasta que queden menos de 2. Es bastante sorprendentemente ineficaz: O ( n 3 ).
Completamente diferente:
Haskell
Utiliza el hecho de que la transformada de Fourier de una función par (p
\x->x^^4
. Ej. ) Es real, mientras que la transformada de Fourier de una función impar es imaginaria.fuente
Windows PowerShell
Sin operadores bit a bit, sin módulo, según lo solicitado.
fuente
Coq, 103
Por lo que puedo decir, esta es la primera entrada de coq en codegolf.
Incluso más corto (59):
fuente
Rubí
Si desea imprimir el resultado:
fuente
.odd?
definición.Unlambda
El mundo necesita más Unlambda.
Unlambda tiene una ventaja asesina aquí: su valor predeterminado ( ejem ) para los números son números de la Iglesia, por lo que todo lo que se necesita es aplicarlos a la función binaria, no a la verdadera. ¡Fácil!
PD: Markdown y Unlambda definitivamente no están hechos el uno para el otro.
Verificación para los primeros enteros:
fuente
Golfscript
fuente
Pitón
Rendimiento similar a la versión anterior. Funciona para 0 ahora.
Versión anterior incorrecta:
No particularmente eficiente; tiempo y memoria, obviamente, O (n): 32 ms por 1,000,000; 2,3 ms por 100000; 3.2 usec para 100. Funciona con números negativos. Lanza un error para 0, porque 0 no es par ni impar.
fuente
Fractran
aplicado a
produce ya sea
5
sin
es impar o1
sin
es par.Actualizar : mucho más corta pero no tan interesante:
es
2
para imparn
y1
para parn
.fuente
MMIX (4 bytes)
Esto es una especie de trampa. No utilizo ni mod ni operaciones de violín. Es más bien que las pruebas de números pares / impares están integradas. Suponiendo que
$3
contiene el número a probar y el resultado entra en$2
:conjuntos
$2
a1
si$3
es par y en0
caso contrario. El mnemnoricoZSEV
significa par cero y tiene la siguiente semántica:Para la línea anterior,
mmixal
genera estos cuatro bytes de ensamblaje:fuente
Esquema
Esta es la solución más ineficiente que conozco.
fuente
Perl
Qué pasa
fuente
JavaScript, 36
Devuelve
true
si incluso,false
si no.fuente
Perl
fuente
Pitón
probando el cuadrado de i, entonces también funciona para números negativos
fuente
F#
Recursión mutua por la victoria.
Un número n es par si es cero o (n-1) es impar.
Un número n es impar si no es igual a cero y (n-1) es par.
(abs añadido en caso de que alguien esté interesado en la paridad de números negativos)
fuente
Clojure
fuente
¿Qué califica como operaciones bit a bit? Bajo el capó, es probable que la división de enteros por 2 se implemente como un cambio de bits.
Asumiendo que los cambios de bits no están disponibles:
C / C ++
editar Faltó algunos paréntesis y, en última instancia, cambió para eliminar un turno para que haga menos. Puede probar esto con lo siguiente (en * nix):
... aunque en Linux / tcsh, tuve que escapar de la barra diagonal inversa a
\n
pesar de que estaba entre comillas simples. Probé en little & big-endian, funciona correctamente en ambos. Además, copié a mano esto; la computadora con la que estoy publicando no tiene un compilador, por lo que puede tener errores.x86 asm
.
o
o
... seguido por:
Alternativamente, el cambio y comparar cosas también se podría hacer de esta manera:
fuente
shl
y los amigos no están permitidos ...En un procesador 68000, puede mover un valor de palabra de la dirección definida por el valor para probar:
y deje que la trampa de hardware para el error de dirección determine la naturaleza impar / par del valor; si se genera la excepción, el valor era impar; de lo contrario, el valor era par:
No funciona en las CPU Intel x86, ya que son más flexibles sobre el acceso a datos.
fuente
Pitón
Decidí probar la solución más fea y confusa que se me ocurriera:
Imprime e si es par, o si es impar.
fuente
Q
Sigue restando 2 hasta x <2 y luego convierte a bool
fuente