Question Existe-t-il un meilleur moyen d'écrire v = (v == 0? 1: 0);


Je veux basculer une variable entre 0 et 1. Si c'est 0, je veux la mettre à 1, sinon, si je veux 1, je veux la mettre à 0.

C'est une opération tellement fondamentale que j'écris si souvent que je voudrais étudier le moyen le plus court et le plus clair de le faire. Voici mon meilleur jusqu'à présent:

v = (v == 0 ? 1 : 0);

Pouvez-vous améliorer cela?

Edit: la question est de savoir comment écrire l'affirmation ci-dessus dans le moins de caractères possible tout en gardant la clarté - comment est-ce «pas une vraie question»? Ce n'était pas destiné à être un exercice de code-golf, bien que certaines personnes aient trouvé des réponses intéressantes au golf - il est agréable de voir que le golf est utilisé de manière constructive et stimulante.


441
2017-08-02 11:22


origine


Réponses:


Vous pouvez simplement utiliser:

v = 1 - v;

Cela suppose bien sûr que la variable soit initialisée correctement, c’est-à-dire qu’elle n’a que la valeur 0 ou 1.

Une autre méthode plus courte mais utilisant un opérateur moins commun:

v ^= 1;

Modifier:

Pour être clair; Je n'ai jamais abordé cette question en tant que golf de code, simplement pour trouver un moyen rapide de faire la tâche sans utiliser des astuces obscures comme les effets secondaires des opérateurs.


677
2017-08-02 11:33



Depuis 0 est un false valeur et 1 est un true valeur.

v = (v ? 0 : 1);

Si vous êtes heureux d'utiliser true et false au lieu de chiffres

v = !v;

ou s'ils doivent être des nombres:

v = +!v; /* Boolean invert v then cast back to a Number */

333
2017-08-02 11:26



v = (v + 1) % 2 et si vous avez besoin de faire défiler plus de valeurs, il suffit de changer 2 pour (n + 1). Disons que vous devez faire un cycle de 0,1,2 juste faire v = (v + 1) % 3.


198
2017-08-02 11:37



Vous pourriez écrire une fonction pour cela et l'utiliser comme:

v = inv(v)


75
2017-08-02 11:25



Si vous ne vous souciez pas d'une autre possibilité que 1:

v = v ? 0 : 1;

Dans le cas ci-dessus, v finira par être 1 si v vaut 0, false, indéfini ou null. Prenez garde en utilisant ce type d'approche - v sera 0 même si v est "bonjour monde".


50
2017-08-02 11:26



Des lignes comme v = 1 - v, ou v ^= 1 ou v= +!v tous feront le travail, mais ils constituent ce que je qualifierais de hacks. Ce ne sont pas de belles lignes de code, mais des astuces bon marché pour avoir l'effet voulu. 1 - v ne communique pas "basculer la valeur entre 0 et 1". Cela rend votre code moins expressif et introduit une place (bien que petite) où un autre développeur devra analyser votre code.

Avoir à la place une fonction comme v = toggle(v) communique l'intention au plus vite.


44
2017-08-02 14:17



(L'honnêteté et l'intégrité mathématique - compte tenu du nombre de votes sur cette "réponse" - m'ont amené à modifier cette réponse. J'ai tenu le coup aussi longtemps que possible parce que cela avait été conçu comme une courte réponse et non pas comme quelque chose de "profond", donc toute explication semblait aller à l'encontre de l'objectif. Cependant, les commentaires indiquent clairement que je devrais être clair pour éviter les malentendus.)

Ma réponse originale:

Le libellé de cette partie de la spécification:

Si c'est 0, je veux le mettre à 1, sinon le mettre à 0.

implique que la solution la plus précise est:

v = dirac_delta(0,v)

Tout d'abord, les aveux: je fait obtenir mes fonctions delta confus. Le delta de Kronecker aurait été légèrement plus approprié, mais pas autant que je voulais quelque chose qui était indépendant du domaine (le delta de Kronecker est principalement utilisé uniquement pour les entiers). Mais je n'aurais vraiment pas du utiliser les fonctions delta, j'aurais dû dire:

v = characteristic_function({0},v)

Laissez-moi clarifier. Rappelons qu'un fonction est un triple, (X, Y, f), où X et Y sont des ensembles (appelés le domaine et codomain respectivement) et F est une règle qui attribue un élément de Y à chaque élément de X. Nous écrivons souvent le triple (X, Y, f) comme f: X et rightarrow Y. Étant donné un sous-ensemble de X, dire UNE, Il y a un fonction caractéristique qui est une fonction χUNE: X & rightarrow {0,1} (il peut aussi être considéré comme une fonction d'un codomaine plus grand tel que & Nopf ou & Ropf). Cette fonction est définie par la règle:

χUNE(x) = 1 si x & en A et χUNE(x) = 0 si x ∉ A.

Si vous aimez les tables de vérité, c'est la table de vérité pour la question "Est-ce l'élément X de X un élément du sous-ensemble UNE? ".

Donc, à partir de cette définition, il est clair que la fonction caractéristique est ce qui est nécessaire ici, avec X un grand ensemble contenant 0 et A = {0}. C'est ce que je devrait a écrit.

Et ainsi de delta des fonctions. Pour cela, nous devons connaître l'intégration. Soit vous le savez déjà, soit vous ne le savez pas. Si vous ne le faites pas, rien de ce que je peux dire ici ne vous parlera des subtilités de la théorie, mais je peux donner un résumé d'une phrase. UNE mesure sur un ensemble X est essentiellement "ce qui est nécessaire pour faire fonctionner les moyennes". C'est-à-dire que si nous avons un ensemble X et une mesure μ sur cet ensemble, il y a une classe de fonctions X & rightarrow & Ropf, appelé fonctions mesurables pour lequel l'expression X f dμ a un sens et est, dans un sens vague, la "moyenne" de F plus de X.

Étant donné une mesure sur un ensemble, on peut définir une «mesure» pour les sous-ensembles de cet ensemble. Cela se fait en assignant à un sous-ensemble l'intégrale de sa fonction caractéristique (en supposant qu'il s'agit d'une fonction mesurable). Ce pouvez être infini ou indéfini (les deux sont subtilement différents).

Il y a beaucoup de mesures, mais il y en a deux qui sont importantes ici. L'un est le mesure standard sur la ligne réelle, & Ropf. Pour cette mesure, alors & Ropf f dμ est à peu près ce que l'on vous enseigne à l'école (le calcul est-il encore enseigné dans les écoles?): résumez de petits rectangles et prenez des largeurs de plus en plus petites. Dans cette mesure, la mesure d'un intervalle est sa largeur. La mesure d'un point est 0.

Une autre mesure importante, qui fonctionne sur tout ensemble, est appelé le mesure ponctuelle. Il est défini pour que l'intégrale d'une fonction soit la somme de ses valeurs:

X f dμ = Σx & inX f (x)

Cette mesure affecte à chaque singleton l'ensemble de la mesure 1. Cela signifie qu'un sous-ensemble a fini mesure si et seulement si elle est elle-même finie. Et très peu de fonctions ont une intégrale finie. Si une fonction a une intégrale finie, elle ne doit pas être nulle sur un dénombrable Nombre de points. Donc la grande majorité des fonctions que vous connaissez probablement n'ont pas d'intégrale finie sous cette mesure.

Et maintenant aux fonctions delta. Prenons une définition très large. Nous avons un espace mesurable (X, μ) (de sorte que c'est un ensemble avec une mesure) et un élément a & in X. Nous "définissons" le fonction delta (cela dépend de une) être la "fonction" δune: X & rightarrow & Ropf avec la propriété qui δune(x) = 0 si x ≠ a et X δune dμ = 1.

Le fait le plus important à ce sujet est: La fonction delta pas besoin d'être une fonction. C'est ne pas correctement défini: je n'ai pas dit quoi δune(une) est.

Ce que vous faites à ce stade dépend de qui vous êtes. Le monde se divise en deux catégories. Si vous êtes mathématicien, vous dites ceci:

Ok, la fonction delta pourrait ne pas être définie. Regardons ses propriétés hypothétiques et voyons si nous pouvons trouver une maison appropriée pour cela est défini. On peut le faire et on se retrouve avec distributions. Ceux-ci sont ne pas (nécessairement) fonctions, mais sont des choses qui se comportent un peu comme des fonctions, et souvent nous pouvons travailler avec elles comme si elles étaient des fonctions; mais il y a certaines choses qu'ils n'ont pas (comme les «valeurs»), donc nous devons faire attention.

Si vous n'êtes pas mathématicien, vous dites ceci:

Ok, donc la fonction delta peut ne pas être correctement définie. Qui le dit? Un groupe de mathématiciens? Ignore les! Que savent-ils?

Ayant maintenant offensé mon public, je continuerai.

le dirac delta est généralement considéré comme la fonction delta d'un point (souvent 0) dans la ligne réelle avec sa mesure standard. Donc, ceux qui se plaignent dans les commentaires à propos de moi qui ne connaissent pas mes deltas le font parce qu'ils utilisent cette définition. Pour eux, je m'excuse: même si je peux me tirer d'affaire en utilisant le Défense du mathématicien (comme popularisé par Humpty Dumpty: redéfinissez simplement tout pour qu'il soit correct), il est mauvais d'utiliser un terme standard pour désigner quelque chose de différent.

Mais là est une fonction delta qui fait ce que je veux faire et c'est ce dont j'ai besoin ici. Si je prends un mesure ponctuelle sur un ensemble X alors là est une véritable fonction δune : X & rightarrow & Ropf qui satisfait aux critères d'une fonction delta. C'est parce que nous cherchons une fonction X & rightarrow & Ropf qui est nul sauf à une et telle que la somme de toutes ses valeurs est 1. Une telle fonction est simple: la seule information manquante est sa valeur à une, et pour obtenir la somme de 1, nous lui assignons simplement la valeur 1. Ceci n'est autre que la fonction caractéristique sur {une}. Alors:

X δune dμ = Σx et dans x δune(x) = δune(a) = 1.

Donc, dans ce cas, pour un ensemble singleton, la fonction caractéristique et la fonction delta concordent.

En conclusion, il y a trois familles de "fonctions" ici:

  1. Les fonctions caractéristiques des ensembles singleton,
  2. Les fonctions delta,
  3. Le delta de Kronecker fonctionne.

le seconde parmi ceux-ci, le plus général étant donné que l'un des autres est un exemple d'utilisation de la mesure ponctuelle. Mais le premier et le troisième ont l'avantage qu'ils sont toujours de véritables fonctions. Le troisième est en fait un cas particulier du premier, pour une famille de domaines particulière (des entiers ou un sous-ensemble de ceux-ci).

Donc, finalement, quand j'ai écrit la réponse à l'origine, je n'était pas penser correctement (je n'irais pas jusqu'à dire que j'étais confus, comme j'espère que je viens de démontrer que je faire Je sais de quoi je parle quand je pense en premier, je n'ai pas beaucoup réfléchi). La signification habituelle du delta de dirac n’est pas ce que l’on veut ici, mais un des points de ma réponse était que le domaine de saisie était ne pas défini de sorte que le delta Kronecker aurait également pas eu raison. Ainsi, le meilleur mathématique réponse (que je visais) aurait été le caractéristiques fonction.

J'espère que tout cela est clair. et j'espère aussi que je n'aurai plus jamais à écrire une pièce mathématique en utilisant des entités HTML à la place des macros TeX!


40
2017-08-03 08:01