Comment déterminer si un nombre est impair ou même sans opérations mod ou bit à bit?
Ce défi est extrêmement inefficace, mais remet en question votre capacité à sortir des sentiers battus pour une solution créative.
MODIFIER :
Veuillez créer une fonction. De plus, bien que l'expression régulière soit une réponse amusante, la fonction doit accepter n'importe quel nombre valide.
CONTEXTE : Cette question découle de mes premiers jours de programmation. Les devoirs pour notre premier jour de classe étaient d'écrire un programme simple qui imprimait «impair» ou «pair». Étant le gamin que j'étais, je n'ai pas lu le livre que nous avions pour la classe où il nous montrait simplement comment l'utiliser%
pour déterminer cela. J'ai passé environ une demi-heure à faire les cent pas dans ma chambre en essayant de penser à un moyen de le faire et je me suis souvenu de la conférence que les nombres peuvent perdre et gagner en précision car ils sont castés d'un type primitif à un autre. Par conséquent, si vous preniez le nombre, le divisiez par deux, puis le multipliez en arrière, ce n'était pas le nombre d'origine, alors vous sauriez que le nombre était impair.
J'ai été stupéfait le lendemain, alors que notre instructeur évaluait nos programmes, qu'il pensait que c'était la façon la plus originale, mais inefficace, de résoudre le problème.
la source
Réponses:
Dans la plupart des langages de programmation, la division renvoie un quotient pour les entiers. Vous pouvez donc simplement vérifier cela
la source
int
/long
typefloor()
. Cela fonctionne parfaitement en C et C ++.Python
la source
Brainf *** (179)
C'est l'un des problèmes les plus intéressants concernant la logique conditionnelle que j'ai fait dans BF.
Il faut une entrée de texte avec un nombre. Si le nombre est pair, il sort
E
, et s'il est impair, il sortO
.J'en suis assez fier pour montrer une forme plus lisible:
la source
Mathematica
la source
I
etPi
au lieu dei
etpi
.C
Multiplié par lui-même plusieurs fois, tout nombre pair débordera à 0 étant donné un entier de taille finie, et tout nombre impair continuera d'avoir au moins le bit le moins significatif défini.
Edit: Comme une fonction simple:
la source
Python (lent)
la source
abs()
appel au début.Javascript
donne
true
un nombre pair. Cela ne fonctionne qu'avec des entiers de taille raisonnable (par exemple, pas de notation scientifique lorsqu'ils sont convertis en chaîne et n'ayant pas de partie fractionnaire.)la source
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. Dans ce cas, vous pourriez le faire/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
serait un peu plus strict que votre regex. Vous auriez besoin de plus de travail pour que cela fonctionne correctement pour les nombres qui sont toString'ed en utilisant la notation scientifique.Python
Comme je ne sais pas vraiment quels sont les critères de notation, voici un tas de solutions que j'ai trouvées pour le plaisir. La plupart d'entre eux utilisent
abs(n)
pour supporter des nombres négatifs. La plupart d'entre eux, sinon tous, ne doivent jamais être utilisés pour un calcul réel.Celui-ci est un peu ennuyeux:
Et c'est mon préféré bien que cela ne fonctionne malheureusement pas (comme le souligne March Ho ci-dessous: le fait que tous les nombres pairs soient la somme de deux nombres premiers ne signifie pas que tous les nombres impairs ne le sont pas).
la source
Haskell
Bien sûr, ce n'est en aucun cas la solution créative et hors des sentiers battus que vous recherchez, mais combien de fois vais-je pouvoir publier une réponse Haskell plus courte que GolfScript, vraiment? C'est vraiment dommage que ce ne soit pas un golf de code.
Mais plus sérieusement:
la source
odd
) qui est une fonction intégrée qui renvoie True si le nombre est impair. C'est une réponse complète en elle-même et plus courte que la réponse GolfScript actuelle (qui au moment de la rédaction, c'est 10 caractères, mais je m'attends à ce que cela baisse). La question est également un peu sous-spécifiée, c'est pourquoi j'affirme queodd
c'est suffisant. Cela pourrait également changer.parity
algorithme fonctionne sur toutes lesNum
instances qui sont des entiers. C'est chaud! Bien que je l'aurais probablement faitevens = [0,2..] >>= \n -> [-n, n]
. Similaire pour les cotes.En utilisant une lecture délibérément perverse de la question, "Comment déterminer si un nombre est impair ou pair", voici une implémentation C (supposons
bool
ettrue
sont définis de manière appropriée):la source
0.5
retourstrue
alors qu'il ne devrait pas.Quoi, pas encore d'algorithmes randomisés ??
C
Associe au hasard des nombres compris entre 0 et n -1 jusqu'à ce qu'il reste moins de 2. Il est tout à fait étonnamment inefficace: O ( n 3 ).
Complètement différent:
Haskell
Utilise le fait que la transformée de Fourier d'une fonction paire (par exemple
\x->x^^4
) est réelle, tandis que la transformée de Fourier d'une fonction impaire est imaginaire.la source
Windows PowerShell
Pas d'opérateurs au niveau du bit, pas de module, comme demandé.
la source
Coq, 103
Pour autant que je sache, c'est la première entrée coq sur codegolf.
Encore plus court (59):
la source
Rubis
Si vous souhaitez imprimer le résultat:
la source
.odd?
définition.Unlambda
Le monde a besoin de plus d'Unlambda.
Unlambda a un avantage décisif ici: sa représentation par défaut ( ahem ) pour les nombres sont des chiffres d'église, donc tout ce qui est nécessaire est de les appliquer à la fonction binaire - pas à la fonction true. Facile!
PS: Markdown et Unlambda ne sont certainement pas faits l'un pour l'autre.
Vérification des premiers nombres entiers:
la source
Golfscript
la source
Python
Performances similaires à la version précédente. Fonctionne pour 0 maintenant.
Version antérieure incorrecte:
Pas particulièrement efficace; temps et mémoire évidemment O (n): 32 ms pour 1 000 000; 2,3 ms pour 100 000; 3.2 usec pour 100. Fonctionne avec des nombres négatifs. Lance une erreur pour 0, car 0 n'est ni pair ni impair.
la source
Fractran
appliqué à
donne
5
sin
est impair ou1
sin
est pair.Mise à jour : beaucoup plus courte mais pas si intéressante:
est
2
pour impairn
et1
pour pairn
.la source
MMIX (4 octets)
C'est une sorte de tricherie. Je n'utilise ni mod ni bit fiddling. C'est plutôt que le test des nombres pairs / impairs est intégré. En supposant que
$3
contient le nombre à tester et que le résultat entre dans$2
:ensembles
$2
à s'est encore et à sinon. La mnémorique signifie pair à zéro et a la sémantique suivante:1
$3
0
ZSEV
Pour la ligne ci-dessus,
mmixal
génère ces quatre octets d'assemblage:la source
Schème
C'est la solution la plus inefficace que je connaisse.
la source
Perl
Qu'en est-il de
la source
JavaScript, 36
Renvoie
true
si pair,false
sinon.la source
Perl
la source
Python
tester le carré de i, donc ça marche aussi pour les nombres négatifs
la source
F#
Récursion mutuelle pour la victoire.
Un nombre n est pair s'il est nul ou (n-1) est impair.
Un nombre n est impair s'il est différent de zéro et (n-1) est pair.
(abs ajouté au cas où quelqu'un serait intéressé par la parité des nombres négatifs)
la source
Clojure
la source
Qu'est-ce qui constitue des opérations au niveau du bit? Sous le capot, la division entière par 2 est susceptible d'être implémentée comme un décalage binaire.
En supposant que les décalages de bits ne sont pas sortis:
C / C ++
edit Manqué quelques parenthèses, et finalement changé pour supprimer un décalage pour le faire moins. Vous pouvez tester cela avec les éléments suivants (dans * nix):
... bien que sous Linux / tcsh, j'ai dû échapper à la barre oblique inverse
\n
même si elle était entre guillemets simples. J'ai testé en little & big-endian, cela fonctionne correctement dans les deux. Aussi, j'ai copié ceci à la main; l'ordinateur avec lequel je poste n'a pas de compilateur, il peut donc y avoir des erreurs.x86 asm
.
ou
ou
... suivi par:
Alternativement, le changement et la comparaison peuvent également être effectués de cette façon:
la source
shl
et ses amis ne sont pas autorisés ...Sur un processeur 68000, vous pouvez déplacer une valeur de mot de l'adresse définie par la valeur à tester:
et laissez le piège matériel pour l'erreur d'adresse déterminer la nature paire / impaire de la valeur - si l'exception est levée, la valeur était impaire, sinon, la valeur était paire:
Ne fonctionne pas sur les processeurs Intel x86 car ceux-ci sont plus flexibles sur l'accès aux données.
la source
Python
J'ai décidé d'essayer la solution la plus laide et la plus déroutante à laquelle je pouvais penser:
Imprime e s'il est pair, o s'il est impair.
la source
Q
Continuez à soustraire 2 jusqu'à ce que x <2 puis convertissez en bool
la source