Ce nombre est-il mauvais?

34

introduction

En théorie des nombres, un nombre est considéré comme mauvais s'il existe un nombre pair de 1 dans sa représentation binaire. Dans le défi d'aujourd'hui, vous identifierez si un nombre donné est mauvais ou non.

Défi

Votre travail consiste à écrire un programme complet ou une fonction qui accepte un seul entier non négatif en entrée et en sortie (ou en retour), que ce nombre soit mauvais ou non.

  • Vous pouvez afficher toute valeur de vérité si le nombre est mauvais et toute valeur de fausseté si le nombre n'est pas mauvais.
  • Vous pouvez entrer et sortir dans n’importe quel format acceptable .
  • Les failles standard sont interdites.
  • La séquence OEIS A001969 est la séquence contenant tous les nombres diaboliques.
  • Voici une liste des 10000 premiers numéros pervers, pour référence (et plus de tests!)
  • Cette question est le , donc le plus court, mieux c'est.
  • Ne soyez pas rebutés par des réponses extrêmement courtes dans les langues de golf. Je vous encourage à soumettre dans la langue de votre choix.
  • Voici quelques cas de test:

    3 => True
    11 => False
    777 => True
    43 => True
    55 => False
    666 => False
    

Le classement

Au bas de la page se trouve un extrait de pile contenant un classement pour cette question. (Merci, @MartinEnder)

Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:

# Perl, 43 + 2 (-p flag) = 45 bytes

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

EDIT: Je pense que cette question n’est pas une copie de celle-ci , car si cette question demande de compter le nombre d’entre elles, cette question demande si le nombre d’entre elles est pair. Bien que vous puissiez accomplir cette question en comptant simplement les bits, il existe également d' autres approches .

Amphibologique
la source
2
Liés (XOR-ing chaque chiffre binaire revient à prendre la somme modulo-2).
Kevin Cruijssen
4
Double possible de Compter le nombre d'unités dans un entier non signé de 16 bits
Déclinaison bêta de
2
@BetaDecay mais cela ne fonctionne pas à l'inverse: vous ne pouvez pas prendre toutes ces réponses et supprimer le mod 2. Par conséquent, ce défi invite de nouvelles méthodes.
Amphibologique
13
Je crois que cela 666 => Falsedevrait être un cas test.
user2390246
3
Le classement est cassé pour moi
Jo King

Réponses:

35

Assemblage Z80 (8 bits), 2 octets

Le code suivant ne fonctionne qu'avec des valeurs allant jusqu'à 255:

; Input is given in register A.
; P flag is set if A is evil.
B7     or A
C9     ret


Version 16 bits (fonctionne sur tous les cas de test), 3 octets

Cela fonctionne avec des valeurs allant jusqu'à 65535.

; Input is given in BC.
; Output is the same as above.
78     ld A,B
A9     xor C
C9     ret

Si vous vous sentez aventureux, vous pouvez supprimer 1 octet en stockant l’entrée Aet Cainsi de suite.

      ld BC, 777
C5    push BC
F1    pop AF

puis en cours d'exécution

A9    xor C
C9    ret

Cependant, ceci impose un fardeau à l'appelant. Il est donc possible que les deux octets ( push BCet pop AF) soient également comptés.

cschultz2048
la source
J'aime ça mais comment ça marche? ma mémoire pour l'assemblage (6502 + bras) sont que ors sont bitwise avec 2 opérandes
northern-bradley
2
@ northern-bradley Sur le Z80, le deuxième opérande du ormnémonique est l'accumulateur A. Dans ce cas, la commande ne change pas A. Elle actualise uniquement le registre d'état (et en particulier l'indicateur de parité). refléter le contenu de A.
cschultz2048
1
Est-il Pautorisé selon codegolf.meta.stackexchange.com/a/8509/29560 ? C'est un bit unique dans le Fregistre (flags) qui n'a que trois paires d'instructions affectées par celui-ci. De plus, cette réponse omet de mentionner qu'il s'agit uniquement d'une compétition pour les valeurs de 8 bits, car il As'agit d'un registre de 8 bits. Cela signifie qu'il est incapable de donner une réponse 777ou une valeur non signée supérieure à 255.
CJ Dennis
2
Damn built-ins:P
Jo King
1
@ cschultz2048 Aest couplé avec F, donc je n'accepterais pas ABou en BAtant que valeur 16 bits. BCest de 16 bits, mais vous avez besoin d’une instruction supplémentaire pour charger l’un d’eux Aavant de passer à l’autre. Je viens toujours de mentionner que mes réponses Z80 fonctionnent pleinement jusqu'à 255 ou 65535, en fonction de la question. Peut-être ajouter une version 16 bits également? Donc 2 octets pour les valeurs 8 bits, 3 octets pour les valeurs 16 bits.
CJ Dennis
25

JavaScript (ES6), 18 octets

f=n=>n?!f(n&~-n):1

Essayez-le en ligne!

Explication

La logique des bits va comme ceci:

  • Pour les nombres entiers, cela ~-néquivaut à -(-n)-1, de sorte que c'est juste une autre façon de faire n-1. Dans ce cas particulier, nous aurions effectivement pu utiliser n-1.
  • n & (n-1)supprime le moins bit significatif à 1 en n parce que décrémentation n tour à tour toutes fuite 0 « s dans 1 » s et efface le 1 qui suit immédiatement (par la propagation de transport), tout en laissant tout le reste inchangé.

    Exemple pour n = 24 (11000 en binaire):

      11000 (24)                  11000 (24)
    -     1                   AND 10111 (23)
    -------                   ---------
    = 10111 (23)              =   10000 (16)
       ^                           ^
       |                           |
       +--- this bit is cleared ---+
    

Par conséquent, nous traitons autant d'appels récursifs qu'il y a de 1 dans la représentation binaire de n , en inversant le résultat à chaque fois !. Le dernier appel revient toujours 1 .

Exemples:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false
Arnauld
la source
Bonjour, je comprends ce que le code fait, mais je ne peux tout simplement pas comprendre la logique / le raisonnement derrière ce code, malgré avoir lu plusieurs articles sur les opérations au niveau des bits, vérifier si un nombre est une puissance de 2, etc. Je sais ce qu'est une fonction récursive . Je ne comprends tout simplement pas pourquoi il a été utilisé de cette manière et pourquoi cela fonctionne pour répondre au puzzle, c'est-à-dire le lien entre la récursion et! F (puissance de deux) <==> nombre pervers. Si vous avez le temps, des explications seraient les bienvenues :) merci!
Supafly
1
@safafly j'ai ajouté une explication. Et BTW: bienvenue à PPCG!
Arnauld
Le traitement est très clair maintenant. Pourtant, l'idée / raisonnement est vraiment magique! Merci pour l'explication!
Supafly
13

Python 2 , 25 octets

lambda n:int(bin(n),13)%2

Essayez-le en ligne!

bin(n)donne un résultat comme '0b10101'. En lisant ceci comme un entier de base 13, on obtient

qui réduit modulo 2 à 1 1 5 + 1 1 4 + 0 1 3 + 1 1 2 + 0 1 1 + 1 1

11135+1134+0133+1132+0131+1130
1 + 1 + 0 + 1 + 0 + 1
115+114+013+112+011+110(mod2)
1+1+0+1+0+1(mod2).

Donc int(bin(n),13)%2est égal à 1 + (nombre d'unités bin(n)) modulo 2.

Si nest le mal, alors le résultat est 1; sinon c'est 0.

J'ai repris cette astuce de Noodle9 .

Lynn
la source
Puisqu'il s'agit de Python 2, le code peut être davantage raccourci avec la syntaxe obsolète de backback de répl:: lambda n:int(`n`,13)%2. Essayez-le en ligne!
GarethPW
Oui, je me suis fait péter le cerveau et j'ai oublié le but de l'argument de base d'Int Oups!
GarethPW
11

Japt -h!, 5 4 3 octets

¤å^

L'essayer


Explication

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated
Hirsute
la source
@LuisfelipeDejesusMunoz, le portage de la solution 05AB1E de Kevin fonctionne également à 5 octets, si vous voulez essayer pour cela.
Shaggy
¤¬x vvoici la réponse de kevin
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz, ouais, c'est tout.
Shaggy
8

C # (compilateur interactif Visual C #) , 43 38 octets


Golfed Essayez-le en ligne!

i=>Convert.ToString(i,2).Sum(c=>c)%2<1

Ungolfed

i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1

Code complet avec des tests

Func<Int32, Boolean> f = i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1;

Int32[] testCases = { 3, 11, 777, 43, 55 };

foreach( Int32 testCase in testCases ) {
    Console.Write( $" Input: {testCase}\nOutput: {f(testCase)}" );
    Console.WriteLine("\n");
}

Console.ReadLine();

Communiqués

  • v1.1 - -5 bytes- Remplacé CountparSum
  • v1.0 - 43 bytes- Solution initiale.

Remarques

  • Aucun
auhmaan
la source
2
Upvote pour le rire que votre version "non-golfée" m'a donné.
Jack Brounstein
8

Bash (aucun utilitaire externe), 56 44 octets

while(($1));do set $(($1/2)) $(($2+$1%2));done;!(($2%2))

(($1))&&exec $0 $[$1/2] $[$2+$1%2];!(($2%2))

Cela suppose que le numéro se trouve dans $1, ayant été passé en tant que premier argument de ligne de commande. Cela suppose également qu'il s'agit d'un script shell (afin qu'il puisse le faire execlui-même).

Il récidive, d'une manière, en utilisant exec $0, jusqu'à ce que le nombre (in $1) atteigne zéro, en le divisant par deux à chaque itération. Il additionne également $2le nombre de fois où nous obtenons un nombre impair. À la fin, le nombre initial était "diabolique" si la somme $2n'était pas étrange.

Exemple d'invocations:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

Pour 0:

$ ./script 0 && echo evil
./script: line 1: ((: %2: syntax error: operand expected (error token is "%2")
evil

Résultat correct, avec un petit extra sur le côté.

Kusalananda
la source
7

R , 37 26 octets

!sum(scan()%/%2^(0:31))%%2

Essayez-le en ligne!

Une alternative à la réponse de Robert S. , cela évite le fractionnement de bits intégré mais finit par devenir moins golfé et grâce à JayCe et digEmAll finit par arriver légèrement plus golfeur.

231-1

Giuseppe
la source
Pourquoi ne pas hardcode 31 au lieu de log2? Essayez-le en ligne!
digEmAll
@digEmAll, ce qui signifie qu'il n'est pas nécessaire de définir x
JayCe
231-1%/%%%
De plus, intToBits ne prend en charge que les valeurs entières allant jusqu'à 2 ^ 31-1;)
digEmAll
6

05AB1E , 4 octets

bSOÈ

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

b       # Convert to binary string
        #  i.e. 777 → 1100001001
 S      # Change it to a list of 0s and 1s
        #  i.e. 1100001001 → ['1','1','0','0','0','0','1','0','0','1']
  O     # Take the sum
        #  i.e. ['1','1','0','0','0','0','1','0','0','1'] → 4
   È    # Check if it's even (1 as truthy, 0 as falsey)
        #  i.e. 4 → 1
Kevin Cruijssen
la source
5

R , 99 98 44 34 28 octets

-1 merci à Kevin Cruijssen! -54 grâce à ngm! -10 merci à Giuseppe! -6 merci à JayCe!

!sum(intToBits(scan())>0)%%2

Essayez-le en ligne!


Sinon, en utilisant le binaryLogicpackage (39 octets):

!sum(binaryLogic::as.binary(scan()))%%2
Robert S.
la source
2
Je ne connais pas trop bien R, mais je suis presque sûr que ça ==0peut l'être <1:)
Kevin Cruijssen
1
43 octets?
mardi
1
Agréable! 34 octets sont possibles
Giuseppe
1
Cela fonctionne aussi, je pense: 32 octets, mais nécessite quelques explications :)
digEmAll
1
c'est facile de transformer cela en un programme complet pour quelques octets supplémentaires
JayCe
5

C (gcc) , 36 octets

c;f(n){for(c=0;n;c++)n&=n-1;n=~c&1;}

Essayez-le en ligne!

Méthode de K & R https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

Doit être compilé avec le niveau d'optimisation 0

vazt
la source
Ne compile pas sur gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(la flèche pointe vers le nom fde la fonction). De quel indicateur de compilateur ai-je besoin?
villapx
1
Ne travaille pas avec -O.
nwellnhof
2
"Renvoie 0 pour la vérité, 1 pour Falsey" Est-ce légal? Ne pas essayer de discréditer votre réponse, juste curieux, et cela me ferait économiser un octet. Remarque: le mot vérité dans la question renvoie à cette réponse . Et ce commentaire mentionne également la véracité.
Borka223
@nwellnhof @villapx Compile bien sur mon 7.3.0 - assurez-vous juste que vous ne manquez pas le -O0drapeau du compilateur.
@ Borka223 hmmm après avoir parcouru ce site pendant des mois, j'avais l'impression que la vérité et Falsey pouvaient être n'importe quoi, à condition qu'ils soient cohérents dans votre solution. Cependant, la réponse que vous avez liée semble certainement contredire cela. Je suis allé de l'avant et ajouté l'octet. Merci
vazt
4

PHP, 37 36 octets

<?=1&~substr_count(decbin($argn),1);

Pour l'exécuter:

echo '<input>' | php -nF <filename>

Ou essayez-le en ligne!

Imprime 1pour vrai et 0pour faux.

-1 octet grâce à Benoit Esnard !

Davied
la source
1
Je pense que vous pouvez enregistrer un octet en supprimant l'opération modulo: <?=1&~substr_count(decbin($argn),1);. Celui-ci affiche également 0 pour faux.
Benoit Esnard
Merci @BenoitEsnard! C'est très intelligent, j'ai mis à jour ma réponse :) Vous apprenez quelque chose de nouveau chaque jour!
David
4

Brachylog , 4 octets

ḃo-0

Essayez-le en ligne!

Avec plusieurs cas de test (😈 est mauvais et 👼 ne l'est pas.)

Utilise quelque chose que j'ai découvert récemment à propos du -prédicat: sa documentation ne dit que "la différence d'éléments de [input]", mais ce qu'elle fait en réalité est "la somme d'éléments pair-indexés (à partir de 0) d'entrées, moins la somme d'impairs -indexed éléments d'entrée ".

Ici,

convertit le nombre en un tableau de chiffres binaires,

o les trie pour rassembler tous les 1.

Maintenant, s'il y avait un nombre pair de 1, il y aurait un nombre égal de 1 dans les indices pairs et les indices impairs. Donc -après cela donnerait un 0. Mais s'il y avait un nombre impair de 1, il y aurait un 1 supplémentaire qui sortait, la différence étant soit -1 soit 1.

Donc, finalement, nous affirmons que la différence est 0, et obtenons un résultat vrai ou faux en fonction de cela. Avec des exigences de sortie plus flexibles , ceci pourrait être supprimé pour une réponse de 3 octets, avec 0 en sortie de vérité et -1 et 1 en sortie de Falsey.

sundar - Rétablir Monica
la source
4

INTERCAL , 90 65 63 octets

DOWRITEIN:1
DO:2<-'#0$#65535'~?':1~:1'
DOREADOUT:2
PLEASEGIVEUP

Essayez-le en ligne!

Ungolfed et étendu (pour ce que ça vaut la peine) avec des commentaires de style C.

DO WRITE IN :1 //Store user input in 1
DO :2<-:1~:1 //Select just the ones. So will convert binary 10101 to 111
DO :3<-:?2 //Run the unary xor over the result. Essentially, xor with the right bitshifted
           //(with wraparound) value).
DO :9<-#0$#65535 //Intermingle the 16 bit values of all 0's and all 1's, to create a
                 //32 bit number with 1's in the odd positions.
DO :4<-:9~:3 //It turns out that at this point, evil numbers will have no bits in odd
             //positions, and non-evil numbers will have precisely one bit in an odd
             //position. Therefore, the ~ will return 0 or 1 as appropriate.
PLEASE READ OUT :4 //Politely output
PLEASE GIVE UP //Polite and self explanatory

J'ai dû faire quelques concessions pour que cela soit réalisable dans INTERCAL. Le premier est, comme pour tous les programmes INTERCAL, la saisie numérique doit être écrite. Donc, si vous voulez entrer, 707vous fournissez SEVEN OH SEVEN.

La seconde est qu'INTERCAL n'a pas vraiment de valeur de vérité ou de fausseté appropriée. Au lieu de cela, il générera le chiffre romain I(1) si le nombre n'est pas mauvais, ou un 0 (généralement représenté par le fait -que les chiffres romains ne peuvent normalement pas représenter 0).

Si vous souhaitez les inverser pour que les nombres pervers renvoient 1 et les nombres non pervers, 0, vous pouvez modifier les lignes 4 et 5 de la version sans golf comme suit, bien que cela ajoute 3 octets.

DO:9<-#65535$#0
DO:4<-#1~:9~3
Ethan
la source
3

Attaché , 13 12 octets

Even@Sum@Bin

Essayez-le en ligne!

( De 13 octets: Even@1&`~@Bin)

Ceci est une composition de trois fonctions:

  1. Bin
  2. Sum
  3. Even

Cela vérifie que le Sumde l' Binélargissement de l'aire d' entrée est Even.

Conor O'Brien
la source
: | Je n'ai pas de mots
ASCII seulement
@ ASCII seulement assez succinct, hein? c:
Conor O'Brien
3

dc , 18 16 octets

[2~rd1<M+]dsMx2%

Renvoie (à la pile) 0 pour le mal et 1 pour pas le mal

Essayez-le en ligne!

Assez simple - applique récursivement l'opérateur quotient / reste combiné ~au nouveau quotient et additionne tous les restants, puis modifie par 2 (après avoir passé deux octets à basculer sur une vérité / falsification standard) .

Modifié pour refléter le consensus selon lequel 0 pour la vérité et 1 pour la fausseté est acceptable, en particulier dans un langage qui n’a aucune sorte de if(boolean)construction.

Sophia Lechner
la source
3

Python 2, 29 octets

lambda n:~bin(n).count('1')&1

Essayez-le en ligne!

Retourne 1 si vrai, sinon 0.

Convertit le nombre en chaîne binaire telle que '0b11', compte le nombre de 1, obtient le complément du résultat et renvoie le dernier bit du complément (merci, https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​si le numéro d'origine était pair, 0 si il était impair).

Triggernométrie
la source
1
Pas moins d'octets, mais lambda n:~bin(n).count('1')&1remplace la division modulaire par quelque chose potentiellement moins cher.
cdlane
3

x86-16, 3 octets

Liste NASM:

 1                                  parity16:
 2 00000000 30E0                        xor al,ah
 3 00000002 C3                          ret

Fonction entière 16 bits arg dans AX (détruit), valeur renvoyée dans PF.

Le matériel calcule la parité du résultat pour nous, dans l' indicateur de parité de x86 . L'appelant peut utiliser jp/ jnppour créer une branche ou ce qu'il veut.

Fonctionne exactement comme la réponse Z80 / 8080 de @ cschultz ; En fait, 8086 a été conçu pour faciliter le portage de source mécanique à partir de 8080 .

Notez que PF est uniquement défini à partir de l'octet de poids faible de résultats plus larges, donc test edi,edine fonctionnerait pas pour une version x86-64. Il vous faudrait horizontalement jusqu'à 16 bits ou popcnt eax, edi/ and al,1(0 étant la vérité).

Peter Cordes
la source
3

C ++ (gcc) (-O0),  36  31 octets

int f(int i){i=!i||i%2-f(i/2);}

Essayez-le en ligne!


C ++ (clang) , 35 octets

int f(int i){return!i||i%2-f(i/2);}

Essayez-le en ligne!


Voici ma première tentative de code-golf, en espérant ne pas avoir enfreint une règle que j'ai peut-être manquée.

Edit:
- 5 octets enregistrés grâce à Frech: @ Jonathan remplacé !=par -et returnpar i=(le dernier remplacement ne semble pas fonctionner avec clang bien)
- Comme il semble y avoir un débat si je devrais utiliser abus gcc -O0, je pensais que je pouvais il suffit de donner les deux versions

Annyo
la source
Bienvenue chez PPCG! Vous pourrez peut-être économiser un octet en jouant !=au golf -et quatre autres en jouant returnau golf i=.
Jonathan Frech
@JonathanFrech Cela fait longtemps que je n'ai pas C ++, retourne-t-il implicitement la dernière expression affectée dans une fonction s'il n'y a pas d'instruction return? Je suppose que c'est une chose gcc?
dimanche
1
Il s’agit d’un abus de comportement non défini spécifique à gcc sur le niveau d’optimisation O0.
Jonathan Frech
En passant à K & R C, vous pouvez le réduire à 23 octets (très impressionnant!) Essayez-le en ligne!
ErikF
@ JonathanFrech: pourquoi les gens insistent-ils pour utiliser ce gcc -O0bidouillage stupide ? Ce n’est pas comme si la longueur de l’ensemble du passe-partout d’une langue importait beaucoup quand on comparait les implémentations. En outre, il est plus intéressant de choisir entre returnvs appel par référence (mise *ià jour en place). Je préférerais écrire des réponses C ou C ++, et non des réponses non optimisées uniquement à gcc, car non optimisé-gcc n'est pas un langage très utile.
Peter Cordes
3

SML , 32 octets

fun%0=1| %n=(n+ %(n div 2))mod 2

Explication:

  • % est le nom de la fonction
  • prend en entrée dans repl et retourne 1 si mal, 0 sinon
  • n est entré, renvoie (n +% (n // 2))% 2

Fait par 2 étudiants Carnegie Mellon ennuyés

CarManuel
la source
Bienvenue sur PPCG, et bonne première réponse!
mbomb007 le
2

Forth (gforth) , 53 octets

: f 1 swap begin 2 /mod -rot xor swap ?dup 0= until ;

Essayez-le en ligne!

Explication

Prend le xor-sum des chiffres de la forme binaire du nombre. (divise à plusieurs reprises par 2 et xors le reste avec la valeur "somme")

Explication du code

: f              \ begin a new word definition
  1 swap         \ place 1 on the stack below the input (n)
  begin          \ start an indefinite loop
    2 /mod       \ get the quotient and remainder of dividing n by 2
    -rot         \ move the sum and remainder to the top of the stack
    xor          \ xor the sum and remainder
    swap         \ move the quotient back to the top of the stack
    ?dup         \ duplicate if > 0
    0=           \ get "boolean" indicating if quotient is 0
  until          \ end the loop if it is, otherwise go back to the beginning
;                \ end the word definition
reffu
la source
2

Java 8, 40 36 octets

n->n.toString(n,2).chars().sum()%2<1

-4 octets grâce à @Okx pour quelque chose que je n'aurais pas dû m'oublier moi-même ..

Essayez-le en ligne.

Explication:

n->                // Method with Integer parameter and boolean return-type
  n.toString(n,2)  //  Convert the integer to a binary String
   .chars()        //  Convert that to an IntStream of character-encodings
   .sum()          //  Sum everything together
    %2<1           //  And check if it's even

Notez que l'encodage des caractères pour 0et 1sont 48et 49, mais en les additionnant et en prenant modulo-2, les résultats sont corrects, car 48%2 = 0et 49%2 = 1.

Kevin Cruijssen
la source
1
n.toString(n,2)enregistre 4 octets.
Okx
@Okx Je ne sais pas comment j'ai oublié celui-là, lol .. Merci! ;)
Kevin Cruijssen
Si vous êtes autorisé à utiliser 1 et 0 au lieu de true et false (incertain pour Java), vous pouvez changer en: ~n.toString(n,2).chars().sum()%2pour enregistrer un octet.
Mario Ishac
1
@MarDev Malheureusement 0et 1ne sont pas véridiques / falsey en Java, seulement booleans/ Booleanssont. Si un défi indique que deux sorties distinctes sont autorisées, elles <1auraient pu être supprimées pour économiser 2 octets. :)
Kevin Cruijssen
2

Perl 6 , 21 octets

*.base(2).comb(~1)%%2

Essaye-le

Étendu:

*\        # WhateverCode lambda (this is the parameter)
.base(2)  # Str representing the binary
.comb(~1) # find the "1"s

%% 2      # is the count of "1"s divisible by 2?
Brad Gilbert b2gills
la source
*.base(2)%9%%2
Jo King
Ah, ça ne marche pas pour les chiffres de plus de 9 bits ...
Jo King
1
{:3(.base(2))%%2}
nwellnhof
2

Retina 0.8.2 , 28 octets

.+
$*
+`(1+)\1
$+0
0

11

^$

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

.+
$*

Convertir en unaire.

+`(1+)\1
$+0

Conversion binaire partielle (laisse des zéros supplémentaires).

0

Supprimer tous les zéros.

11

Modulo les uns par deux.

^$

Testez si le résultat est zéro.

Neil
la source
2

Assemblage x86, 12 à 11 octets

F3 0F B8 44 24 04  popcnt      eax,dword ptr [esp+4] ; Load EAX with the number of ones in arg
F7 D0              not         eax ; One's complement negation of EAX
24 01              and         al,1 ; Isolate bottom bit of EAX
C3                 ret             

-1 octet grâce à la suggestion de @ ceilingcat

Govind Parmar
la source
@ceilingcat Bonne prise!
Govind Parmar
1
Proposer inc eaxau lieu de not eax. Vous pouvez également mentionner que cela nécessite un processeur prenant en charge l’ popcntinstruction.
ceilingcat
1
De plus, vous n'avez pas à prendre l'argument de la pile. voir les conventions d'appel autorisées codegolf.stackexchange.com/a/161497/17360 (La réponse plus détaillée de Peter Cordes répond codegolf.stackexchange.com/a/165020/17360 )
qwr Du
1
Notez que vous pouvez renvoyer un booléen dans FLAGS stackoverflow.com/a/48382679/3163618
qwr
Le 666 ne devrait-il pas être un test?
Arcanist Lupus
2

FrapperUtilitaires + GNU, 33

dc -e2o?p|tr -d 0|wc -c|dc -e?2%p

Essayez-le en ligne!

Lit les entrées de STDIN. Sorties 1 pour Vrai et 0 pour Faux.

  • dc convertit l'entrée en chaîne binaire
  • tr supprime les zéros
  • wc compte les restants (et le retour à la ligne final, ce qui corrige le sens de la logique
  • dc calcule le compte mod 2 et affiche la réponse
Trauma numérique
la source
2

Python 2, 28 27 octets

f=lambda n:n<1or n&1^f(n/2)

Essayez-le en ligne!

Renvoie une valeur de vérité si exactement un the ones-bit is a 1et the result of calling this function on n/2 is truthyest vrai (oun==0 ). Cela fonctionne parce que cela n/2équivaut à un décalage de bits correct avec division au sol (donc uniquement avec Python 2).

Version alternative, également 28 27 octets

g=lambda n:n<1or g(n&n-1)^1

Essayez-le en ligne!

Basé sur la méthode K & R de comptage des bits définis référencés par vazt.

Les deux pourraient être plus courts de deux octets si la sortie permettait à falsey de signifier le mal.

Edit: Merci à Amphibological pour la sauvegarde d’un octet!

Jack Brounstein
la source
Vous pouvez supprimer les espaces entre 1et orpour enregistrer +1 octet. Belle solution!
Amphibologique
Mec, je pensais avoir essayé ça. Bonne prise!
Jack Brounstein
2

APL (Dyalog Unicode) , SBCS 10 octets

Fonction tacite anonyme. Peut prendre n'importe quel tableau d'entiers en argument.

≠⌿12∘⊥⍣¯1

Essayez-le en ligne!

2∘⊥⍣¯1 convertir en binaire, en utilisant autant de chiffres que nécessaire en fonction du nombre le plus grand, séparer les chiffres le long de l'axe principal

1⍪ les préfixes le long de l'axe principal

≠⌿ Réduction XOR le long de l'axe primaire

Adam
la source
2

J , 9 octets

Fonction tacite anonyme. Peut prendre n'importe quel tableau entier en argument.

1-2|1#.#:

Essayez-le en ligne!

1- un moins (ie négation logique de)

2| le mod-2 de

1#. la somme (lit. l'évaluation de base 1) de

#: la représentation binaire

Adam
la source
Joli! l'approche ennuyeuse est de 9 octets:2|1+1#.#:
Conor O'Brien
Cela ne semble fonctionner que parce que 777 dans l'entrée fait que chaque nombre est représenté sur 10 bits. Remplacez-le par exemple par 480 et la sortie bascule.
FrownyFrog
@ ConorO'Brien Les atouts ennuyeux sont incorrects.
Adám
@FrownyFrog Fixe.
Adám