Questo numero è cattivo?


34

introduzione

Nella teoria dei numeri, un numero è considerato malvagio se nella sua rappresentazione binaria è presente un numero pari di 1. Nella sfida di oggi, identificherai se un determinato numero è cattivo.

Sfida

Il tuo compito è quello di scrivere un programma completo o una funzione che accetta un singolo intero non negativo come input e output (o restituisce) indipendentemente dal fatto che quel numero sia o meno male.

  • Puoi generare qualsiasi valore di verità se il numero è cattivo e qualsiasi valore di falsa se il numero non è cattivo.
  • È possibile immettere e produrre in qualsiasi formato accettabile .
  • Le scappatoie standard non sono ammesse.
  • La sequenza OEIS A001969 è la sequenza che contiene tutti i numeri cattivi.
  • Ecco un elenco dei primi 10000 numeri malvagi, per riferimento (e altri casi di test!)
  • Questa domanda è , quindi più breve è, meglio è.
  • Non lasciarti scoraggiare da risposte estremamente brevi nelle lingue del golf. Ti incoraggio a inviare in qualsiasi lingua tu voglia.
  • Ecco alcuni casi di test:

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

La classifica

Nella parte inferiore della pagina è presente uno snippet di stack contenente una classifica per questa domanda. (Grazie, @MartinEnder)

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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

EDIT: credo che questa domanda non sia un duplicato di questo , perché mentre quella domanda sta chiedendo di contare il numero di quelli, questa domanda sta chiedendo se il numero di quelli è pari. Sebbene sia possibile rispondere a questa domanda semplicemente contando i bit, esistono anche altri approcci .


2
Correlato (XORing ogni cifra binaria equivale a prendere la somma modulo-2).
Kevin Cruijssen,


2
@BetaDecay ma non funziona al contrario: cioè non puoi prendere tutte queste risposte e rimuovere la mod 2. Pertanto, questa sfida invita alcuni nuovi metodi.
Anfibologico

13
Credo che 666 => Falsedovrebbe essere un caso di prova.
user2390246

3
La classifica è rotta per me
Jo King il

Risposte:


35

Z80 Assembly (8 bit), 2 byte

Il codice seguente funziona solo con valori fino a 255:

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


Versione a 16 bit (funziona su tutti i casi di test), 3 byte

Funziona con valori fino a 65535.

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

Se ti senti avventuroso, puoi radere via 1 byte memorizzando l'ingresso Ae in questo Cmodo

      ld BC, 777
C5    push BC
F1    pop AF

e poi in esecuzione

A9    xor C
C9    ret

Tuttavia, ciò comporta un onere per il chiamante, quindi è possibile che vengano conteggiati anche i due byte ( push BCe pop AF).


mi piace ma come funziona? la mia memoria per il montaggio (6502 + arm) è che orsono bit per bit con 2 operandi
north-bradley

2
@ northern-bradley Sulla Z80, è implicito che il secondo operando del ormnemonico è l'accumulatore A. In questo caso, il comando non cambia A. Aggiorna solo il registro di stato (e in particolare il flag di parità) in riflette il contenuto di A.
cschultz2048, il

1
È Pconsentito secondo codegolf.meta.stackexchange.com/a/8509/29560 ? È un singolo bit all'interno del Fregistro (flags) che ha solo tre coppie di istruzioni interessate. Inoltre, questa risposta non menziona la sua concorrenza solo per i valori a 8 bit, poiché Aè un registro a 8 bit. Ciò significa che non è possibile fornire una risposta 777o qualsiasi altro valore non firmato oltre 255.
CJ Dennis

2
Dannati built-in:P
Jo King

1
@ cschultz2048 Aè associato F, quindi non accetterei ABo BAcome valore a 16 bit. BCè a 16 bit, ma è quindi necessaria un'istruzione in più per caricarne uno Aprima di XORare l'altro. Ho sempre detto che le mie risposte Z80 funzionano fino a 255 o 65535, a seconda della domanda. Forse aggiungi anche una versione a 16 bit? Quindi 2 byte per valori a 8 bit, 3 byte per valori a 16 bit.
CJ Dennis,

25

JavaScript (ES6), 18 byte

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

Provalo online!

Spiegazione

La logica bit a bit va così:

  • Per numeri interi, ~-nequivale a -(-n)-1, quindi solo un altro modo di fare n-1. In quel caso particolare, avremmo effettivamente potuto usare n-1.
  • n & (n-1)rimuove il bit meno significativo impostato su 1 in n poiché il decremento di n trasforma tutti gli 0 finali in 1 in e cancella l' 1 che segue immediatamente (portando la propagazione), lasciando invariato tutto il resto.

    Esempio per n = 24 (11000 in binario):

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

Pertanto, elaboriamo tutte le chiamate ricorsive quante sono 1 nella rappresentazione binaria di n , invertendo il risultato ogni volta con !. L'ultima chiamata restituisce sempre 1 .

Esempi:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false

Ciao, capisco cosa fa il codice, ma non riesco proprio a capire la logica / il ragionamento dietro di esso, nonostante abbia letto diversi articoli sulle operazioni bit a bit, controllando se un numero è una potenza di 2, ecc. So cos'è una funzione ricorsiva . Semplicemente non capisco perché sia ​​stato usato in questo modo e perché questo funzioni per rispondere al puzzle, ovvero il collegamento tra la ricorsione e! F (potenza di due) <==> numero malvagio. Se hai tempo, la spiegazione sarebbe benvenuta :) grazie!
supafly,

1
@supafly Ho aggiunto una spiegazione. E a proposito: benvenuti in PPCG!
Arnauld,

L'elaborazione è ora molto chiara. Tuttavia, l'idea / ragionamento è davvero magico! Grazie per la spiegazione!
supafly,

13

Python 2 , 25 byte

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

Provalo online!

bin(n)dà un risultato simile '0b10101'. Leggendolo come un intero di base 13, otteniamo

che riduce il modulo 2 a 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).

Quindi è int(bin(n),13)%2uguale a 1 + (numero di quelli in bin(n)) modulo 2.

Se nè cattivo, allora il risultato è 1; altrimenti è 0.

Ho preso questo trucco da Noodle9 .


Poiché questo è Python 2, il codice può essere ulteriormente ridotto con lo sconsigliato repr backtick sintassi: lambda n:int(`n`,13)%2. Provalo online!
GarethPW,

Sì, aveva un po 'di scoreggia cerebrale lì e ha dimenticato lo scopo dell'argomento base di int. Ops!
GarethPW,

11

Japt -h!, 5 4 3 byte

¤å^

Provalo


Spiegazione

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated

@LuisfelipeDejesusMunoz, il porting della soluzione 05AB1E di Kevin funziona anche a 5 byte, se vuoi provarlo.
Shaggy

¤¬x vquesta è la risposta di Kevin
Luis Felipe De Jesus Munoz,

@LuisfelipeDejesusMunoz, sì, tutto qui.
Shaggy

8

C # (compilatore interattivo Visual C #) , 43 38 byte


Golf Provalo online!

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

Ungolfed

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

Codice completo con test

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();

Uscite

  • v1.1 - -5 bytes- Sostituito CountaSum
  • v1.0 - 43 bytes- Soluzione iniziale.

Gli appunti

  • Nessuna

2
Ho votato a favore della risatina che mi ha dato la tua versione "ungolfed".
Jack Brounstein,

8

Bash (nessuna utility esterna), 56 44 byte

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

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

Ciò presuppone che il numero sia stato trovato $1, essendo stato passato come primo argomento della riga di comando. Presuppone anche che si tratti di uno script di shell (in modo che possa farlo da execsolo).

Si ricorre, dopo una moda, usando exec $0, fino a quando il numero (in $1) raggiunge lo zero, dividendolo per due in ogni iterazione. Somma anche (in $2) il numero di volte in cui otteniamo un numero dispari. Alla fine, il numero originale era "malvagio" se la somma $2non è dispari.

Invocazioni di esempio:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

Per 0:

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

Risultato corretto, con un po 'di extra sul lato.


7

R , 37 26 byte

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

Provalo online!

Un'alternativa alla risposta di Robert S. , questo evita la suddivisione dei bit incorporata ma finisce per essere meno golfoso e grazie a JayCe e digEmAll finisce per diventare leggermente più golfista.

2311


Perché non hardcode 31 invece di log2? Provalo online!
digEmAll

@digEmAll Che a sua volta significa che non è necessario definire x
JayCe

2311%/%%%

Inoltre intToBits supporta solo valori interi fino a 2 ^ 31-1;)
digEmAll

6

05AB1E , 4 byte

bSOÈ

Provalo online o verifica tutti i casi di test .

Spiegazione:

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


5

R , 99 98 44 34 28 byte

-1 grazie a Kevin Cruijssen! -54 grazie a ngm! -10 grazie a Giuseppe! -6 grazie a JayCe!

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

Provalo online!


In alternativa, usando il binaryLogicpacchetto (39 byte):

!sum(binaryLogic::as.binary(scan()))%%2

2
Non conosco R troppo bene, ma sono abbastanza sicuro che ==0possa essere <1:)
Kevin Cruijssen il



1
Funziona anche secondo me: 32 byte, ma richiede un po 'di spiegazioni :)
digEmAll


5

C (gcc) , 36 byte

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

Provalo online!

Metodo da K&R https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

Deve essere compilato con il livello di ottimizzazione 0


Non si compila su gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(la freccia indica fil nome della funzione). Di quali flag del compilatore ho bisogno?
villapx,

1
Non funziona con -O.
nwellnhof,

2
"Restituisce 0 per verità, 1 per falsità" È legale? Non cercare di screditare la tua risposta, solo curioso, e perché mi farebbe risparmiare un byte. Nota: la parola verità nella domanda si collega a questa risposta . E questo commento menziona anche la verità.
Borka223,

@nwellnhof @villapx Compila bene sul mio 7.3.0 - assicurati solo di non perdere il -O0flag del compilatore.

@ Borka223 hmmm dopo mesi passati a esaminare questo sito, avevo l'impressione che la verità e la falsità potessero essere qualsiasi cosa, purché fossero coerenti con la tua soluzione. Tuttavia, la risposta che hai collegato sembra certamente contraddirla. Sono andato avanti e ho aggiunto il byte. Grazie
vazt


4

PHP, 37 36 byte

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

Per eseguirlo:

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

O provalo online!

stampe 1 per vero e0 per falso.

-1 byte grazie a Benoit Esnard !


1
Penso che è possibile salvare un byte, eliminando l'operazione di modulo: <?=1&~substr_count(decbin($argn),1);. Questo stampa anche 0 per falso.
Benoit Esnard,

Grazie @BenoitEsnard! È molto intelligente, ho aggiornato la mia risposta :) Ogni giorno impari qualcosa di nuovo!
Davito il

4

Brachylog , 4 byte

ḃo-0

Provalo online!

Con più casi di test (😈 è male e 👼 non lo è).

Usa qualcosa che ho scoperto di recente sul - predicato: la sua documentazione dice semplicemente "la differenza di elementi di [input]", ma ciò che effettivamente fa è "somma di elementi a indice pari (a partire da 0) di input, meno la somma di dispari -indexed elementi di input ".

Qui,

converte il numero in una matrice di cifre binarie,

o li ordina per riunire tutti gli 1.

Ora, se ci fosse un numero pari di 1, ci sarebbe un numero uguale di 1 in indici pari e indici dispari. Così la- successivo darebbe uno 0. Ma se ci fosse un numero dispari di 1, ci sarebbe un ulteriore 1 che sporge, con conseguente differenza di -1 o 1.

Quindi, infine, affermiamo che la differenza è 0e otteniamo un risultato vero o falso in base a ciò. Con requisiti di output più flessibili , questo potrebbe essere rimosso per una risposta a 3 byte, con 0 come output true e -1 e 1 come entrambi output output.


4

INTERCAL , 90 65 63 byte

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

Provalo online!

Ungolfed ed espanso (per quello che vale) con commenti in stile 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

Ho dovuto fare alcune concessioni per renderlo possibile in INTERCAL. Il primo è, come con tutti i programmi INTERCAL, l'input numerico deve essere scritto. Quindi, se si desidera inserire, 707si fornirebbe SEVEN OH SEVEN.

Il secondo è che INTERCAL non ha davvero un vero valore di verità o falsità. Invece, produrrà il numero romano I(1) se il numero non è cattivo, o uno 0 (tipicamente rappresentato come -dato che i numeri romani normalmente non possono rappresentare 0).

Se vuoi capovolgerli in modo che i numeri malvagi restituiscano 1 e i numeri non malvagi restituiscano 0, puoi cambiare le righe 4 e 5 dalla versione non golf come segue, anche se aggiunge 3 byte.

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


3

dc , 18 16 byte

[2~rd1<M+]dsMx2%

Restituisce (in pila) 0 per il male e 1 per il male

Provalo online!

Abbastanza semplice: applica ricorsivamente l'operatore ~di quoziente / resto combinato al nuovo quoziente e aggiunge tutti i resti insieme, quindi le mod di 2 (dopo aver speso due byte per passare a una verità / falsa standard) .

Modificato per riflettere il consenso sul fatto che 0 per la verità e 1 per la falsità vanno bene, specialmente in un linguaggio che non ha alcun tipo di if(boolean)costrutto.


3

Python 2, 29 byte

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

Provalo online!

Restituisce 1 se Vero, altrimenti 0.

Converte il numero in una stringa binaria come '0b11', conta il numero di 1s, ottiene il complemento del risultato e restituisce l'ultimo bit del complemento (grazie, https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​se il numero originale era pari, 0 se era dispari).


1
Non meno byte ma lambda n:~bin(n).count('1')&1sostituisce la divisione modulare con qualcosa di potenzialmente meno costoso.
cdlane,

3

x86-16, 3 byte

Elenco NASM:

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

Funzione intera 16 bit arg in AX (che viene distrutta), restituisce valore in PF.

L'hardware calcola la parità del risultato per noi, nella Parity Flag di x86 . Il chiamante può usare jp/jnp per diramare o qualunque cosa gli piaccia.

Funziona esattamente come la risposta Z80 / 8080 di @ cschultz ; infatti l'8086 è stato progettato per semplificare il porting meccanico della sorgente dall'8080 .

Si noti che PF è impostato solo dal byte basso di risultati più ampi, quindi test edi,edinon funzionerebbe per una versione x86-64. Dovresti orizzontale-xo fino a 16 bit, o popcnt eax, edi/ and al,1(dove 0 è vero).


3

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

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

Provalo online!


C ++ (clang) , 35 byte

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

Provalo online!


Ecco il mio primo tentativo di giocare a golf con il codice, spero di non aver infranto nessuna regola che avrei potuto perdere.

Edit:
- Saved 5 bytes thanks to @Jonathan Frech : replaced != by - and return by i= (the last replacement does not seem to work with clang though)
- Since there seems to be a debate whether I should use gcc -O0 abuse, I thought I could just give both versions


Welcome to PPCG! You may be able to save a byte by golfing != to - and another four by golfing return to i=.
Jonathan Frech

@JonathanFrech It's been a long time since I did C++, does it implicitly return the last assigned expression in a function if there's no return statement? I'm guessing it's a gcc thing?
sundar - Reinstate Monica

1
It is a gcc specific undefined behaviour abuse on optimization level O0.
Jonathan Frech

By switching to K&R C, you can get it down to 23 bytes (very impressive!) Try it online!
ErikF

@JonathanFrech: why do people insist on using that stupid gcc -O0 hack? It's not like the length of a language's total boilerplate matters much when comparing implementations. Also, it makes it more interesting to choose between return vs. call-by-reference (updating *i in place). I'd rather write C or C++ answers, not un-optimized-gcc-only answers, because un-optimized-gcc isn't a very useful language.
Peter Cordes

3

SML, 32 Bytes

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

Explaination:

  • % is function name
  • takes in input in repl and returns 1 if evil, 0 otherwise
  • n is input, returns (n + %(n//2)) % 2

Made by 2 bored Carnegie Mellon Students


Welcome to PPCG, and good first answer!
mbomb007

2

Forth (gforth), 53 bytes

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

Try it online!

Explanation

Takes the xor-sum of the digits of the binary form of the number. (repeatedly divides by 2 and xors the remainder with the "sum" value)

Code Explanation

: 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

2

Java 8, 40 36 bytes

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

-4 bytes thanks to @Okx for something I shouldn't have forgotten myself..

Try it online.

Explanation:

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

Note that the character encoding for 0 and 1 are 48 and 49, but summing them and taking modulo-2 still holds the correct results because 48%2 = 0 and 49%2 = 1.


1
n.toString(n,2) saves 4 bytes.
Okx

@Okx Not sure how I forgot about that one, lol.. Thanks! ;)
Kevin Cruijssen

If you're allowed to use 1 and 0 instead of true and false (not sure for Java), you can change to: ~n.toString(n,2).chars().sum()%2 to save one byte.
Mario Ishac

1
@MarDev Unfortunately 0 and 1 aren't truthy/falsey in Java, only booleans/Booleans are. If a challenge would state two distinct outputs are allowed the <1 could have been removed to save 2 bytes indeed. :)
Kevin Cruijssen


2

Retina 0.8.2, 28 bytes

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

11

^$

Try it online! Link includes test cases. Explanation:

.+
$*

Convert to unary.

+`(1+)\1
$+0

Partial binary conversion (leaves extra zeroes).

0

Delete all the zeros.

11

Modulo the ones by two.

^$

Test whether the result is zero.


2

x86 Assembly, 12 11 bytes

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 byte thanks to @ceilingcat's suggestion


@ceilingcat Good catch!
Govind Parmar

1
Suggest inc eax instead of not eax. Also may want to mention that this requires a processor with support for the popcnt instruction.
ceilingcat

1
also you do not have to take arg from stack. see allowed calling conventions codegolf.stackexchange.com/a/161497/17360 (Peter Cordes's more in-depth answer codegolf.stackexchange.com/a/165020/17360)
qwr

1
Note that you may return a boolean in FLAGS stackoverflow.com/a/48382679/3163618
qwr

Shouldn't 666 be a test case?
Arcanist Lupus

2

Bash + GNU utilities, 33

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

Try it online!

Reads input from STDIN. Outputs 1 for True and 0 for False.

  • dc converts input to a binary string
  • tr removes zeros
  • wc counts remaining ones (and trailing newline, which corrects sense of logic
  • dc calculates count mod 2 and outputs the answer

2

Python 2, 28 27 bytes

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

Try it online!

Returns a truthy value if exactly one of the ones-bit is a 1 and the result of calling this function on n/2 is truthy is true (or n==0). It works because n/2 is equivalent to a right bitshift with floor division (so Python 2 only).

Alternate version, also 28 27 bytes

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

Try it online!

Based on the K&R method of counting set bits referenced by vazt.

Both of these could be two bytes shorter if the output allowed falsey to mean evil.

Edit: Thanks to Amphibological for saving a byte!


You can remove the spaces between the 1 and the or to save +1 byte. Nice solution!
Amphibological

Man, I thought I tried that. Good catch!
Jack Brounstein

2

APL (Dyalog Unicode), 10 bytesSBCS

Anonymous tacit function. Can take any array of integers as argument.

≠⌿12∘⊥⍣¯1

Try it online!

2∘⊥⍣¯1 convert to binary, using as many digits as needed by the largest number, separate digits along primary axis

1⍪ prepend ones along the primary axis

≠⌿ XOR reduction along the primary axis


2

J, 9 bytes

Anonymous tacit function. Can take any integer array as argument.

1-2|1#.#:

Try it online!

1- one minus (i.e. logical negation of)

2| the mod-2 of

1#. the sum (lit. the base-1 evaluation) of

#: the binary representation


Nice one! the boring approach is 9 bytes: 2|1+1#.#:
Conor O'Brien

This only seems to work because 777 in the input makes every number be represented in 10 bits. Replace it with e.g. 480 and the output flips.
FrownyFrog

@ConorO'Brien Boring trumps incorrect.
Adám

@FrownyFrog Fixed.
Adám
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.