Esse número é mau?


34

Introdução

Na teoria dos números, um número é considerado mau se houver um número par de 1's em sua representação binária. No desafio de hoje, você identificará se um determinado número é mau ou não.

Desafio

Seu trabalho é escrever um programa ou função completo que aceite um número inteiro único e não negativo como entrada e saída (ou retorno), independentemente de esse número ser mau.

  • Você pode emitir qualquer valor verdadeiro se o número for ruim e qualquer valor falso se o número não for ruim.
  • Você pode inserir e enviar em qualquer formato aceitável .
  • As brechas padrão não são permitidas.
  • A sequência OEIS A001969 é a sequência que contém todos os números incorretos .
  • Aqui está uma lista dos primeiros 10000 números malignos, para referência (e mais casos de teste!)
  • Esta questão é , portanto, quanto menor, melhor.
  • Não se deixe levar por respostas extremamente curtas em idiomas de golfe. Convido você a enviar em qualquer idioma que desejar.
  • Aqui estão alguns casos de teste:

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

The Leaderboard

Na parte inferior da página, há um snippet de pilha que contém um cabeçalho para esta pergunta. (Obrigado, @MartinEnder)

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:

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

EDIT: Eu acredito que esta questão não é uma duplicata disso , porque, embora essa pergunta esteja pedindo a contagem do número de unidades, essa pergunta está perguntando se o número de unidades é par. Embora você possa realizar essa pergunta simplesmente contando os bits, há outras abordagens também .


2
Relacionado (XOR-ing cada dígito binário é o mesmo que pegar a soma módulo 2).
Kevin Cruijssen


2
@BetaDecay, mas isso não funciona ao contrário: ou seja, você não pode pegar todas essas respostas e remover o mod 2. Portanto, este desafio convida alguns novos métodos.
Anfibológico

13
Eu acredito que 666 => Falsedeveria ser um caso de teste.
user2390246

3
A tabela de classificação está quebrada para mim
Jo King

Respostas:


35

Conjunto Z80 (8 bits), 2 bytes

O código a seguir funciona apenas com valores de até 255:

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


Versão de 16 bits (funciona em todos os casos de teste), 3 bytes

Isso funciona com valores de até 65535.

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

Se você estiver se sentindo aventureiro, pode economizar 1 byte armazenando a entrada Ae Cassim por diante

      ld BC, 777
C5    push BC
F1    pop AF

e depois correndo

A9    xor C
C9    ret

No entanto, isso sobrecarrega o chamador; portanto, os dois bytes ( push BCe pop AF) também devem ser contados.


Eu gosto disso, mas como isso funciona? minha memória para a montagem (6502 + braço) são de que ors são bit a bit com 2 operandos
norte-Bradley

2
@ northern-bradley No Z80, está implícito que o segundo operando do ormnemônico é o acumulador A. Nesse caso, o comando não muda A. Ele apenas atualiza o registro de status (e, em particular, o sinalizador de paridade) para refletir o conteúdo do A.
cschultz2048

1
É Ppermitido conforme codegolf.meta.stackexchange.com/a/8509/29560 ? É um bit único no Fregistro (flags) que possui apenas três pares de instruções afetadas por ele. Além disso, essa resposta não menciona que está competindo apenas pelos valores de 8 bits, pois Aé um registro de 8 bits. Isso significa que ele é incapaz de dar uma resposta para 777, ou qualquer outro valor sem sinal mais 255.
CJ Dennis

2
Droga built-ins:P
Jo King

1
@ cschultz2048 Aestá emparelhado F, então eu não aceitaria ABou BAcomo um valor de 16 bits. BCé de 16 bits, mas você precisará de uma instrução extra para carregar um deles Aantes de executar o XOR no outro. Eu sempre mencionei que minhas respostas do Z80 funcionam totalmente até 255 ou 65535, dependendo da pergunta. Talvez adicione uma versão de 16 bits também? Então, 2 bytes para valores de 8 bits, 3 bytes para valores de 16 bits.
CJ Dennis

25

JavaScript (ES6), 18 bytes

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

Experimente online!

Explicação

A lógica bit a bit é assim:

  • Para números inteiros, ~-né equivalente a -(-n)-1, de modo que apenas outra maneira de fazer n-1. Nesse caso em particular, poderíamos realmente ter usado n-1.
  • n & (n-1)remove o bit menos significativo a 1 no n porque decrementing n transforma tudo arrastando 0 é em 1 's e limpa a 1 que se segue imediatamente (carry propagação), deixando tudo o resto inalterado.

    Exemplo para n = 24 (11000 em binário):

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

Portanto, temos o processo tantas chamadas recursivas, pois há 1 é na representação binária de n , invertendo o resultado cada vez com !. A última chamada sempre retorna 1 .

Exemplos:

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

Olá, eu entendo o que o código faz, mas simplesmente não consigo descobrir a lógica / raciocínio por trás dele, apesar de ter lido vários artigos sobre operações bit a bit, verificando se um número é uma potência de 2 etc. Eu sei o que é uma função recursiva . Eu simplesmente não entendo por que foi usado dessa maneira e por que isso funciona para responder ao quebra-cabeça, ou seja, o elo entre a recursão e! F (potência de dois) <==> número maligno. Se você tiver tempo, a explicação seria bem-vinda :) obrigado!
precisa saber é o seguinte

1
@supafly Adicionei uma explicação. E BTW: bem-vindo ao PPCG!
Arnauld

O processamento está muito claro agora. Ainda assim, a ideia / raciocínio é realmente mágica! Obrigado pela explicação!
precisa saber é

13

Python 2 , 25 bytes

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

Experimente online!

bin(n)dá um resultado como '0b10101'. Lendo isso como um número inteiro de base 13, obtemos

11135+1134+0133+1132+0131+1130
que reduz o módulo 2 para
115+114+013+112+011+110(mod2)
1+1+0+1+0+1(mod2).

Então, int(bin(n),13)%2é igual a 1 + (número de unidades em bin(n)) módulo 2.

Se né mau, então o resultado é 1; caso contrário, é 0.

Eu peguei esse truque no Noodle9 .


Uma vez que este é Python 2, o código pode ser ainda mais reduzido com a deprecated repr backtick sintaxe: lambda n:int(`n`,13)%2. Experimente online!
precisa saber é o seguinte

Sim, teve um pouco de peido no cérebro e esqueceu o objetivo do argumento base do int. Ops!
GarethPW

11

Japonês -h!, 5 4 3 bytes

¤å^

Tente


Explicação

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

@LuisfelipeDejesusMunoz, portar a solução 05AB1E de Kevin também funciona em 5 bytes, se você quiser tentar.
Shaggy

¤¬x vesta é a resposta de Kevin
Luis Felipe de Jesus Munoz

@LuisfelipeDejesusMunoz, sim, é isso.
Shaggy

8

C # (compilador interativo do Visual C #) , 43 38 bytes


Golfe Experimente online!

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

Ungolfed

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

Código completo com testes

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

Lançamentos

  • v1.1 - -5 bytes- Substituído CountparaSum
  • v1.0 - 43 bytes- Solução inicial.

Notas

  • Nenhum

2
Votado pelo riso que sua versão "não-destruída" me deu.
Jack Brounstein 2/08

8

Bash (sem utilitários externos), 56 44 bytes

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

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

Isso pressupõe que o número seja encontrado $1, tendo sido passado como o primeiro argumento da linha de comando. Ele também pressupõe que esse seja um script de shell (para que ele execpróprio possa ).

Ele recorre, de certa forma, usando exec $0, até o número (in $1) chegar a zero, dividindo-o por dois em cada iteração. Também soma (in $2) o número de vezes que obtemos um número ímpar. No final, o número original era "mau" se a soma $2não fosse ímpar.

Invocações de exemplo:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

Para 0:

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

Resultado correto, com um pouco de extra ao lado.


7

R , 37 26 bytes

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

Experimente online!

Uma alternativa à resposta de Robert S. , isso evita a divisão de bits incorporada, mas acaba com menos golfismo e, graças a JayCe e digEmAll, acaba sendo um pouco mais golfista.

Funciona apenas para números inteiros positivos menores que .2311


Por que não codifica 31 em vez de log2? Experimente online!
precisa saber é o seguinte

@digEmAll O que, por sua vez, significa que não há necessidade de definir x
JayCe

@digEmAll thanks! Eu não tinha certeza sobre problemas de precisão, embora suponha que passados (provavelmente) perdemos precisão nos operadores e , portanto, seria um ponto discutível. 2311%/%%%
Giuseppe

Também intToBits suporta apenas valores inteiros de até 2 ^ 31-1;)
digEmAll 1/18



5

R , 99 98 44 34 28 bytes

-1 graças a Kevin Cruijssen! -54 graças a ngm! -10 graças a Giuseppe! -6 agradecimentos a JayCe!

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

Experimente online!


Como alternativa, usando o binaryLogicpacote (39 bytes):

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

2
Não sei R muito bem, mas eu tenho certeza que ==0pode ser <1:)
Kevin Cruijssen



1
Isso funciona bem eu penso: 32 bytes , mas requer um pouco de explicações :)
digEmAll


5

C (gcc) , 36 bytes

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

Experimente online!

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

Deve ser compilado com o nível de otimização 0


Não compila no gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(a seta está apontando para fno nome da função). Quais sinalizadores de compilador são necessários?
villapx

1
Não funciona -O.
Nwellnhof

2
"Retorna 0 para verdade, 1 para falsey" Isso é legal? Não tentando desacreditar sua resposta, apenas curioso, e porque isso me salvaria um byte. Nota: A palavra verdade na pergunta está vinculada a esta resposta . E este comentário também menciona veracidade.
Borka223

@nwellnhof @villapx Compila bem no meu 7.3.0 - apenas verifique se você não está perdendo o -O0sinalizador do compilador.

@ Borka223 hmmm depois de meses lendo este site, fiquei com a impressão de que verdade e falsidade poderiam ser qualquer coisa, desde que sejam consistentes com a sua solução. No entanto, a resposta que você vinculou certamente parece contradizer isso. Fui em frente e adicionei o byte. Obrigado
vazt


4

PHP, 37 36 bytes

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

Para executá-lo:

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

Ou Experimente online!

Imprime 1para verdadeiro e 0para falso.

-1 byte graças a Benoit Esnard !


1
Eu acho que você pode salvar um byte, removendo a operação de módulo: <?=1&~substr_count(decbin($argn),1);. Este também imprime 0 para falso.
Benoit Esnard

Obrigado @BenoitEsnard! Isso é muito inteligente, eu atualizei minha resposta :) Você aprende algo novo todos os dias!
Davіd

4

Braquilog , 4 bytes

ḃo-0

Experimente online!

Com vários casos de teste (😈 é mau e 👼 não é).

Usa algo que descobri recentemente sobre o -predicado: sua documentação diz apenas "a diferença de elementos de [input]", mas o que realmente faz é "soma dos elementos indexados pares (a partir de 0) da entrada, menos a soma de ímpares" elementos de entrada indexados ".

Aqui,

converte o número em uma matriz de dígitos binários,

o classifica-os para reunir todos os 1s.

Agora, se houvesse um número par de 1s, haveria um número igual de 1s em índices pares e ímpares. Portanto, o -que se seguiu daria um 0. Mas se houvesse um número ímpar de 1s, haveria 1 extra, resultando na diferença sendo -1 ou 1.

Então, finalmente, afirmamos que a diferença é 0e obtemos um resultado verdadeiro ou falso de acordo com isso. Com requisitos de saída mais flexíveis , isso poderia ser removido para uma resposta de 3 bytes, com 0 como saída de verdade e -1 e 1 como ambas as saídas de falsey.


4

INTERCAL , 90 65 63 bytes

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

Experimente online!

Ungolfed e expandido (pelo que vale a pena) com comentários no estilo 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

Eu tive que fazer algumas concessões para tornar isso possível no INTERCAL. A primeira é que, como em todos os programas INTERCAL, a entrada numérica deve ser gravada. Então, se você quiser inserir, 707você forneceria SEVEN OH SEVEN.

A segunda é que INTERCAL realmente não tem valor de verdade ou falsidade. Em vez disso, ele emitirá o numeral romano I(1) se o número não for ruim ou um 0 (normalmente representado como -porque os algarismos romanos normalmente não podem representar 0).

Se você quiser inverter esses números para que os números maus retornem 1 e os números não maus retornem 0, você pode alterar as linhas 4 e 5 da versão não armazenada da seguinte maneira, embora adicione 3 bytes.

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


3

dc , 18 16 bytes

[2~rd1<M+]dsMx2%

Retorna (para a pilha) 0 para o mal e 1 para não o mal

Experimente online!

Bastante direto - aplica recursivamente o operador de quociente / restante combinado ~ao novo quociente e adiciona todos os restantes, depois mods por 2 (depois de gastar dois bytes para alternar para uma verdade / falsidade padrão) .

Editado para refletir o consenso de que 0 para verdade e 1 para falsidade são aceitáveis, especialmente em um idioma que não possui nenhum tipo de if(boolean)construção.


3

Python 2, 29 bytes

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

Experimente online!

Retorna 1 se True, caso contrário 0.

Converte o número em uma string binária como '0b11', conta o número de 1s, obtém o complemento do resultado e retorna o último bit do complemento (obrigado, https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​se o número original for par, 0 se for ímpar).


1
Não menos bytes, mas lambda n:~bin(n).count('1')&1substitui a divisão modular por algo potencialmente menos caro.
Cdlane #

3

x86-16, 3 bytes

Listagem NASM:

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

A função inteira de 16 bits arg no AX (destruída), retorna o valor em PF.

O hardware calcula a paridade do resultado para nós, no Parity Flag de x86 . O chamador pode usar jp/ jnppara ramificar ou o que quiser.

Funciona exatamente como a resposta Z80 / 8080 da @ cschultz ; de fato, o 8086 foi projetado para facilitar a transferência de fontes mecânica do 8080 .

Observe que PF é definido apenas a partir do byte baixo de resultados mais amplos; portanto test edi,edi, não funcionaria para uma versão x86-64. Você precisaria xor horizontal até 16 bits ou popcnt eax, edi/ and al,1(onde 0 é verdade).


3

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

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

Experimente online!


C ++ (clang) , 35 bytes

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

Experimente online!


Aqui está minha primeira tentativa no código de golfe, espero que não quebrei nenhuma regra que eu poderia ter perdido.

Edit:
- Saved 5 bytes, graças ao @ Jonathan Frech: substituídas !=por -e returnpelo i=(a última substituição não parece trabalhar com clang embora)
- Uma vez que não parece ser um debate se eu deveria usar gcc -O0 abuso, eu pensei que eu pudesse basta dar as duas versões


Bem-vindo ao PPCG! Você pode ser capaz de salvar um byte por golfe !=para -e outros quatro pelo golfe returnpara i=.
22878 Jonathan Frech #

@JonathanFrech Já faz muito tempo que eu fiz o C ++, ele implicitamente retorna a última expressão atribuída em uma função se não houver uma declaração de retorno? Acho que é uma coisa do GCC?
Sundar - Restabelece Monica

1
É um abuso de comportamento indefinido específico do gcc no nível de otimização O0.
Jonathan Frech

Ao mudar para o K&R C, você pode reduzi-lo para 23 bytes (muito impressionante!) Experimente online!
ErikF

@ JonathanFrech: por que as pessoas insistem em usar esse gcc -O0truque estúpido ? Não é como se o tamanho total da linguagem de um idioma importasse muito ao comparar implementações. Além disso, torna mais interessante escolher entre returnvs. chamada por referência (atualização *ino local). Prefiro escrever respostas C ou C ++, não apenas respostas não otimizadas para o gcc, porque não otimizadas para o gcc não é uma linguagem muito útil.
Peter Cordes

3

SML , 32 bytes

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

Explicação:

  • % é o nome da função
  • recebe entrada em repl e retorna 1 se mal, 0 caso contrário
  • n é entrada, retorna (n +% (n // 2))% 2

Feito por 2 estudantes entediados de Carnegie Mellon


Bem-vindo ao PPCG, e boa primeira resposta!
mbomb007

2

Quarto (gforth) , 53 bytes

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

Experimente online!

Explicação

Pega a xoroma dos dígitos da forma binária do número. (divide repetidamente por 2 e xou o restante com o valor "sum")

Código Explicação

: 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 graças a @Okx por algo que eu não deveria ter me esquecido ..

Experimente online.

Explicação:

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

Observe que os caracteres que codificam para 0e 1são 48e 49, mas somando-os e recebendo o módulo-2, ainda mantém os resultados corretos porque 48%2 = 0e 49%2 = 1.


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

@ Ok Não tenho certeza de como eu esqueci isso, lol .. Obrigado! ;)
Kevin Cruijssen

Se você tiver permissão para usar 1 e 0, em vez de verdadeiro e falso (não seguro para Java), poderá alterar para: ~n.toString(n,2).chars().sum()%2salvar um byte.
Mario Ishac 01/08/19

1
@MarDev Infelizmente 0e 1não são verdade / falsey em Java, apenas booleans/ Booleanssão. Se um desafio declarasse que duas saídas distintas são permitidas, isso <1poderia ter sido removido para economizar 2 bytes. :)
Kevin Cruijssen


2

Retina 0.8.2 , 28 bytes

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

11

^$

Experimente online! O link inclui casos de teste. Explicação:

.+
$*

Converta para unário.

+`(1+)\1
$+0

Conversão binária parcial (deixa zeros extras).

0

Exclua todos os zeros.

11

Módulo os dois por dois.

^$

Teste se o resultado é zero.


2

Montagem x86, 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 graças à sugestão de @ ceilingcat


@ceilingcat Boa captura!
Govind Parmar

1
Sugira em inc eaxvez de not eax. Também é possível mencionar que isso requer um processador com suporte para as popcntinstruções.
ceilingcat

1
Além disso, você não precisa tirar o arg da pilha. veja permitiu chamando convenções codegolf.stackexchange.com/a/161497/17360 (de Peter Cordes mais aprofundada resposta codegolf.stackexchange.com/a/165020/17360 )
QWR

1
Note que você pode retornar um boolean em bandeiras stackoverflow.com/a/48382679/3163618
QWR

666 não deveria ser um caso de teste?
Arcanist Lupus

2

Utilitários Bash + GNU, 33

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

Experimente online!

Lê a entrada de STDIN. Saídas 1 para True e 0 para False.

  • dc converte a entrada em uma sequência binária
  • tr remove zeros
  • wc conta os restantes (e a nova linha à direita, que corrige o senso de lógica
  • dc calcula contagem mod 2 e gera a resposta

2

Python 2, 28 27 bytes

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

Experimente online!

Retorna um valor verdadeiro se exatamente um de the ones-bit is a 1e the result of calling this function on n/2 is truthyfor verdadeiro (ou n==0). Funciona porque n/2é equivalente a um deslocamento de bits correto com a divisão do piso (somente no Python 2).

Versão alternativa, também 28 27 bytes

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

Experimente online!

Com base no método K&R de contagem de bits de conjunto referenciados por vazt.

Ambos podem ser dois bytes mais curtos se a saída permitir que falsey signifique mal.

Edit: Obrigado a Amphibological por salvar um byte!


Você pode remover os espaços entre 1e orpara salvar +1 byte. Ótima solução!
Anfibológico

Cara, eu pensei que tentei isso. Boa pegada!
Jack Brounstein

2

APL (Dyalog Unicode) , SBCS de 10 bytes

Função tácita anônima. Pode usar qualquer matriz de números inteiros como argumento.

≠⌿12∘⊥⍣¯1

Experimente online!

2∘⊥⍣¯1 converter para binário, usando quantos dígitos forem necessários para o maior número, separar dígitos ao longo do eixo primário

1⍪ precede aqueles ao longo do eixo primário

≠⌿ Redução de XOR ao longo do eixo primário


2

J , 9 bytes

Função tácita anônima. Pode usar qualquer matriz inteira como argumento.

1-2|1#.#:

Experimente online!

1- um menos (isto é, negação lógica de)

2| o mod-2 de

1#. a soma (lit. a avaliação de base 1) de

#: a representação binária


Agradável! a abordagem chata é de 9 bytes:2|1+1#.#:
Conor O'Brien

Isso parece funcionar porque 777 na entrada faz com que cada número seja representado em 10 bits. Substitua-o por, por exemplo, 480 e a saída vira.
precisa saber é o seguinte

@ ConorO'Brien Boring trumps incorreto.
Adám 02/08/18

@FrownyFrog Fixed.
Adám 02/08/18
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.