Sua tarefa é bem simples. Dado dois flutuadores, bit a bit xou a representação binária deles, e a produz como flutuante.
Por exemplo,
Normal: 16.7472 ^ 123.61 = 7.13402e-37
Binary: 01000001100001011111101001000100 ^ 01000010111101110011100001010010 = 00000011011100101100001000010110
Normal: 2.2 ^ 4.4 = 1.17549e-38
Binary: 01000000000011001100110011001101 ^ 01000000100011001100110011001101 = 00000000100000000000000000000000
Normal: 7.898 ^ 3.4444 = 1.47705e-38
Binary: 01000000111111001011110001101010 ^ 01000000010111000110101001111111 = 00000000101000001101011000010101
Restrições / esclarecimentos:
- A entrada / saída pode ser fornecida por qualquer método conveniente .
- O programa pode ser um programa completo ou apenas uma função; qualquer um serve.
- O tipo de flutuação pode ter qualquer tamanho, mas o tamanho mínimo é 2 bytes.
- As brechas padrão são proibidas.
- O menor código vence.
code-golf
bitwise
floating-point
virchau13
fonte
fonte
Respostas:
código de máquina x86-64, 4 bytes
Na montagem:
Essa é uma função que pode ser chamada que aceita dois valores flutuantes ou duplos como argumentos (em
xmm0
exmm1
) e retorna um valor flutuante ou duplo (inxmm0
).Isso corresponde às convenções de chamada do Windows x64 e da x86-64 SysV ABI e funciona para carros alegóricos e duplos. (Eles são passados / retornados nos baixos 4 ou 8 bytes de registros XMM).
fonte
C ++ (gcc) ,
7432 bytesExperimente online!
Eu nunca tinha jogado golfe em C ++, por isso sou grato a todos aqueles que ajudaram a reduzir o tamanho do código pela metade! Uma macro que leva ponteiros para dois carros alegóricos como argumentos e modificou o primeiro para retornar o resultado.
Graças a @ 12Me1 por salvar 2 bytes e @Arnauld por salvar 4! Graças a @Nishioka por salvar outros 14, @Neil mais 6 e @AZTECCO e @Nishioka mais 11! Agradecemos a @PeterCordes por salvar 5 bytes!
fonte
z=*(int*)x^*(int*)y;
.#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
(*(int*)x^=*(int*)y)
.#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
Código de máquina do polegar ARM,
64 bytes48 40 70 47
Na montagem:
Sob a convenção de chamada de braço padrão, os dois primeiros parâmetros são passados nos registradores R0 e R1, os resultados são retornados em R0 e LR mantém o endereço de retorno. Supondo que você esteja usando a ABI de flutuação suave com flutuações de 32 bits, isso executará a operação desejada em 4 bytes.
-2 bytes graças a Cody Gray
fonte
EORS r0, r1
vez disso, para salvar 2 bytes? Essa é apenas uma instrução de 2 bytes (48 40
), em comparação com seus 4 bytesEOR
. Você já está segmentando o Thumb, então isso deve funcionar bem, até onde posso ver. A única diferença é que ele atualiza os sinalizadores de status, mas você não se importa com esse efeito colateral nesse caso.s0
es1
.Python 3 + numpy,
7559 bytesExperimente online!
Define um lambda que usa duas matrizes float32 numpy como argumentos e retorna uma matriz float32 numpy.
Agradecemos a @ShadowRanger por salvar 14 bytes e a Joel mais 2!
Se a importação puder ser descartada (como meu próprio lambda chama métodos em objetos numpy em vez de quaisquer funções numpy básicas), eu poderia salvar mais 13 bytes. Não tenho certeza disso nas regras padrão do código de golfe.
fonte
numpy.float32
para que você possa usar os métodos deles) e substituindo ambos osint32
usos por'i'
e ofloat32
uso por'f'
; odtype
parâmetro pode ser uma string que é convertida em realdtype
para você e, convenientemente,'i'
e'f'
são formas legais de criar esses tipos, o que elimina a necessidade de a função importarnumpy
coisas para seu namespace. Não tenho certeza se é Código Golf legal para remover a importação, mas ainda assumirnumpy
entradas ...f
int32
para'i'
, quatro defloat32
para'f'
), mas isso ainda é algo. Se a importação for estritamente necessária, você pode alterá-laimport numpy
para afirmar que o pacote existe, sem usarfrom numpy import*
para extrair nomes dele. Isso daria mais seis bytes, totalizando 61 bytes.Gelatina + numpy,
8977 bytesExperimente online!
Tem a honra duvidosa de ser maior que o código Python 3 que ele reproduz, em grande parte devido à necessidade de converter de / para um objeto numpy e pelo fato de que o numpy não é carregado pelo Jelly, então o
__import__()
built-in deve ser usado.Um link monádico usando os dois flutuadores como uma lista como argumento e retornando um flutuador.
Avalia o seguinte código Python 3:
onde
x
ey
são substituídos pela entrada.fonte
APL (Dyalog Unicode) , 14 bytes SBCS de
Programa completo. Solicita a matriz de 1 coluna de dois números de ponto flutuante IEEE 754 de 64 bits (binary64) do stdin. Imprime um desses números em stdout.
Experimente online!
⎕
prompt (números que são recolhidos para não-flutuantes podem ser forçados a flutuar com a função⊃⊢⎕DR⍨645,⍨⎕DR
)11⎕DR
convertido para um-bit binário (1) D ATA R ePresentation (2-fileira, matriz de 64 coluna)≠⌿
redução vertical de XOR645⎕DR
convertido para 64 bits flutuador (5) D ATA R ePresentation (número único)fonte
VAX BASIC (mais tarde VMS BASIC e depois Compaq Basic) , 11 bytes
Parece um pouco tolo para mim, obviamente, os idiomas mais antigos se sairão melhor porque não se preocuparam tanto com os problemas de digitação forte.
fonte
Oitava , 59 bytes
Experimente online!
Typecast é a maneira de transmitir MATLAB / Octave sem alterar os bits subjacentes. Isso é necessário porque
bitxor
funciona apenas em números inteiros. Não faço ideia por que eles nunca implementaram números de ponto flutuante, mesmo que você possa especificar explicitamenteAssumedType
como um terceiro argumento parabitxor
. Eu acho que o único uso é a programação recreativa.fonte
exp()
implementação. Mas suponho que o Octave já tenha funções / operadores para copysign e negação. E eles não se preocupam com micro-otimizações, como usar AND (com uma máscara constante) e depois o XOR para alternar condicionalmente o sinal de um valor com base no sinal de outro. Em um projeto de otimização real em asm (na verdade, C com intrínsecas AVX), usei o XOR de flutuadores e depois observei o bit de sinal para evitar cmp contra zero.C # (compilador interativo do Visual C #) , 92 bytes
Experimente online!
fonte
Perl 5
-p
,3127 bytes-4 bytes graças ao Grimy
Experimente online!
fonte
MATL , 10 bytes
Experimente online!
Dividir com
Z}
foi mais curto do que receber duas entradas,4Z%]
fonte
C, 23 bytes
Experimente online!
Isso pode ser um pouco complicado; leva os ponteiros para
float
s como ponteiros paraint
s.No entanto, funciona (afinal é C).
Isso tira proveito da entrada aceitável, pegando um ponteiro na variável e modificando-a no local. Nenhum valor (utilizável) é retornado.
fonte
JavaScript (Node.js) ,
105101 bytesVersão mais curta do nó sugerida por @Neil
Economizou mais 4 bytes graças a @ShieruAsakoto
Toma entrada como
(x)(y)
.Experimente online!
JavaScript (ES6), 115 bytes
Aceita entrada como uma matriz de 2 carros alegóricos.
Experimente online!
fonte
Buffer
salva alguns bytes:a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE())
.map
)new
nanew Buffer(4)
também deve trabalhar IIRCWolfram Mathematica , 50 bytes
Embora eu suspeite fortemente que isso possa ser mais complicado, os dois argumentos extras em
RealDigits
função parecem ser necessários para obter um resultado correto.Experimente online!
fonte
Lua , 73 bytes
Experimente online!
Esse código pressupõe números inteiros não assinados de 4 bytes e flutua com a configuração ativada
tio.run
. Execute como programa completo com entrada como argumentos.fonte
Ruby ,
7867 bytes-11 bytes graças a @grawity.
Experimente online!
Entrada é uma matriz de dois carros alegóricos.
fonte
x.map{|v|[v].pack(?g).unpack(?N)[0]}
⇒x.pack("gg").unpack("NN")
Java (JDK) ,
10976 bytesExperimente online!
Já faz um tempo desde que jogava golfe em Java e não tenho certeza se preciso da declaração no LHS como parte da contagem de bytes? Se ele usasse o DoubleBinaryOperator, o LHS seria mais curto, mas o RHS teria que usar o Double.doubleToLongBits e o Double.longBitsToDouble, então é mais longo.
Agradecemos a Neil por uma economia substancial na contagem de bytes!
fonte
Limpo , 36 bytes
Experimente online!
Felizmente, os tipos
Real
eInt
são do mesmo tamanho em plataformas de 64 bits ...Infelizmente, exige uma assinatura completa, caso contrário, o gráfico se transforma em um pretzel e tudo mais.
fonte