Blog Emmanuel Orchanian

astuce bdd bureautique codage culture débat design énigme français hacking html mathématiques méthodologie santé typographie 

❓0️⃣🔁1️⃣ÉNIGME : Comment alterner 0 et 1 en une seule opération mathématique ?

 

 [3112 vues] 2021-11-30 Emmanuel Orchanian

À vous les matheux !

Énoncé de l'énigme :

Soit N égal à 0 ou à 1,
    comment, en une seule opération, avoir 0 si N vaut 1, et 1 si N vaut 0 ?

Pendant que certains réfléchissent, je vais expliquer à quoi ça pourrait servir.

Problématique

Je ne conseille pas d'utiliser le type BOOLEAN dans les bases de données, et de préférer un entier qui vaut 0 pour FAUX, et 1 pour VRAI.
Par ailleurs, je ne conseille pas d'utiliser -1 pour le FAUX, car ça embrouille, en effet dans les transtypages de JavaScript et PHP (c'est-à-dire quand on transforme le type int en bool) le -1 vaut VRAI...

Besoin d'alterner un booléen

Le booléen c'est deux états par définition, on peux le faire modifier par l'internaute de deux manières (généralement).

Avec deux interactions

  • Quand c'est activé
  • Quand c'est désactivé

Dans la mentalité, on lance deux programmes différents, l'un qui active, l'autre qui désactive.

Avec une seule interaction

  • Quand c'est activé
  • Quand c'est désactivé

Ici, le but est de lancer un seul programme.

C'est ce que nous utiliserons ici, on utilisera la même chose pour que en un seul code, ça alterne notre 0 ou 1.


Solutions

Voici quelques solutions possibles :

La solution facile

N deviens égal à 1 - N (à ne pas confondre avec N-1)
  • Si N vaut 0 :
            1 - N
            = 1 - 0
            = 1
        
  • Si N vaut 1 :
            1 - N
            = 1 - 1
            = 0
        

Attention ! Ça ne fonctionne pas avec N - 1 (ne confondez pas N-1 et 1-N), en effet, si N vaut 0, alors N vaudra -1, puis s'il vaut -1, il vaudra -2, puis -3 -4 -5... et il y aura des erreurs à la chaîne...

C'était facile, toutefois il existe des cas où on ne peux pas forcément faire cette soustraction, voici d'autres alternatives.

La valeur absolue

N deviens égal à ABS(N - 1)

ABS est la valeur absolue, ça enlève le signe d'un nombre, par exemple ABS(-5) vaut 5, et ABS(5) vaut aussi 5. ABS(0) vaut 0.
À l'école on avait l'habitude de le noter avec deux traits verticaux |-5|

  • Si N vaut 0 :
            ABS(N - 1)
            = ABS(0 - 1)
            = ABS(-1)
            = 1
        
  • Si N vaut 1 :
            ABS(N - 1)
            = ABS(1 - 1)
            = ABS(0)
            = 0
        

Le carré

N deviens égal à (N - 1) * (N - 1)
  • Si N vaut 0 :
            (N - 1) * (N - 1)
            = (0 - 1) * (0 - 1)
            = (-1) * (-1)
            = 1
        
  • Si N vaut 1 :
            (N - 1) * (N - 1)
            = (1 - 1) * (1 - 1)
            = (0) * (0)
            = 0 * 0
            = la tête à toto
        

Cas pratique

SQL

En SQL, on peux l'utiliser pour alterner directement notre booléen (sous forme d'entier 0 ou 1)

UPDATE article
    SET  actif = 1 - actif 
    WHERE id=462346

Ici on a l'état "actif" de l'article qui va alterner entre 0 et 1.

JavaScript et PHP

Vous pouvez utiliser l'opérateur XOR sur les bits, mais faite toujours de telle sorte que vos collègues comprennent votre code :

toto ^= 1 ; // Si toto vaut 0, il vaudra 1. S'il vaut 1, il vaudra alors 0

Note : pas besoin de vérifier si toto est un entier, l'opérateur ^= transforme automatiquement le type (transtypage automatique) en int, ainsi donc cela fonctionnerait aussi si toto vallait "001" ou un booléen true/false.

Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.