Codegolf - Умножение По Геометрической Алгебре

  • Автор темы Arsenl469
  • Обновлено
  • 21, Oct 2024
  • #1

Базисные векторы геометрической алгебры:

$$(e_0=1), e_1, e_2,\dots,e_n$$

Все они квадратичны к 1 (мы не рассматриваем векторы, квадратичные к -1 или нулю)

$$e_i \cdot e_i = 1$$

Они ассоциативны и антикоммутативны (кроме \$e_0=1\$, который ассоциативен и коммутативный)

$$e_i \cdot e_j =-e_j \cdot e_i \: \; (i\neq j); \;и\; я,j > 0$$

Например, этот продукт упрощен до

$$e_1 \cdot e_3 \cdot e_3 \cdot e_5\cdot e_4 \cdot e_5 \\

= e_1 \cdot (e_3 \cdot e_3) \cdot (e_5\cdot e_4) \cdot e_5 \\

= e_1 \cdot (1) \cdot (-e_4\cdot e_5) \cdot e_5 \\

= e_1 \cdot (-e_4) \cdot (e_5 \cdot e_5) \\ = e_1 \cdot (-e_4) \cdot (1) \\

= - e_1 \cdot e_4$$

(обратите внимание, что упрощенный продукт сортируется по индексу \$e\$)

Испытание

Если произведение базисных векторов представлено целым числом со знаком, где каждый бит равен 1, если вектор присутствует, или 0, если вектор отсутствует. $$\begin{выравнивание}

0101011 & = e_0 \cdot e_1 \cdot e_3 \cdot e_5 \\ & = e_0^1 \cdot e_1^1 \cdot e_2^0 \cdot e_3^1 \cdot e_4^0 \cdot e_5^1 \cdot e_6^0 \\ -0101011 & = -e_0 \cdot e_1 \cdot e_3 \cdot e_5

\end{align}$$

Учитывая два целых числа со знаком \$a\$, \$b\$ (вы можете выбрать числовую кодировку для отрицательных значений), выведите произведение \$c= a \:. б\$

Входные данные представляют собой только 2 целых числа со знаком. Есть много

способы кодирования целых чисел со знаком

. Вы можете выбрать кого угодно, но входные данные — только две переменные.

Обратите внимание, что \$| с |= |а|\; исключающее ИЛИ \; |b|\$ , но самое сложное — найти знак.

Если язык не позволяет целочисленному типу кодировать нули со знаком (\$-00000\$), код должен возвращать \$-00001\$ (поскольку \$-e_0^0=-e_0^1=-1\ $)

Поскольку \$x=e_0 \cdot x=x \cdot e_0\$, то \$x=x \;OR\; 1\$, поэтому одинаково допустимо возвращать 0 или 1 для \$e_0\$

Вам следует рассчитать как минимум 4 базисных вектора \$e_0=1, e_1, e_2, e_3\$

Вот генератор таблицы умножения

(для проверки правильных ответов), который также предлагает код на C++, C#, Python и Rust (на веб-странице необходимо вручную указать, сколько векторов соответствует 1, -1 и 0. Вы можете установить 3 (или более) положительных, 0 отрицательный и 0 Ноль)

Вот

Код Rosetta на многих языках


по геометрической алгебре

Пример:

учитывая а, б:$$a=e_1 \cdot e_2=00110$$

 

"""3D Projective Geometric Algebra.

Written by a generator written by enki.
"""

__author__ = 'Enki'

import math

class R300:

def __init__(self, value=0, index=0):

"""Initiate a new R300.

 

Optional, the component index can be set with value.

"""

self.mvec = [0] * 8

self._base = ["1", "e1", "e2", "e3", "e12", "e13", "e23", "e123"]

#self._base = ["0001", "0010", "0100", "1000", "0110", "1010", "1100", "1110"]

if (value != 0):

self.mvec[index] = value

 

@classmethod

def fromarray(cls, array):

"""Initiate a new R300 from an array-like object.

The first axis of the array is assumed to correspond to the elements

of the algebra, and needs to have the same length. Any other dimensions

are left unchanged, and should have simple operations such as addition 

and multiplication defined. NumPy arrays are therefore a perfect 

candidate. 

:param array: array-like object whose length is the dimension of the algebra.

:return: new instance of R300.

"""

self = cls()

if len(array) != len(self):

raise TypeError('length of array must be identical to the dimension '

'of the algebra.')

self.mvec = array

return self

 

def __str__(self):

if isinstance(self.mvec, list):

res = ' + '.join(filter(None, [("%.7f" % x).rstrip("0").rstrip(".") + (["",self._base[i]][i > 0]) if abs(x) > 0.000001 else None for i,x in enumerate(self)]))

#res = ' + '.join([x for i,x in enumerate(self)])

else:  # Assume array-like, redirect str conversion

res = str(self.mvec)

if (res == ''):

return "0"

return res

def __getitem__(self, key):

return self.mvec[key]

def __setitem__(self, key, value):

self.mvec[key] = value

 

def __len__(self):

return len(self.mvec)

def __invert__(a):

"""R300.Reverse

 

Reverse the order of the basis blades.

"""

res = a.mvec.copy()

res[0] = a[0]

res[1] = a[1]

res[2] = a[2]

res[3] = a[3]

res[4] = -a[4]

res[5] = -a[5]

res[6] = -a[6]

res[7] = -a[7]

return R300.fromarray(res)

def Dual(a):

"""R300.Dual

 

Poincare duality operator.

"""

res = a.mvec.copy()

res[0] = -a[7]

res[1] = -a[6]

res[2] = a[5]

res[3] = -a[4]

res[4] = a[3]

res[5] = -a[2]

res[6] = a[1]

res[7] = a[0]

return R300.fromarray(res)

def Conjugate(a):

"""R300.Conjugate

 

Clifford Conjugation

"""

res = a.mvec.copy()

res[0] = a[0]

res[1] = -a[1]

res[2] = -a[2]

res[3] = -a[3]

res[4] = -a[4]

res[5] = -a[5]

res[6] = -a[6]

res[7] = a[7]

return R300.fromarray(res)

def Involute(a):

"""R300.Involute

 

Main involution

"""

res = a.mvec.copy()

res[0] = a[0]

res[1] = -a[1]

res[2] = -a[2]

res[3] = -a[3]

res[4] = a[4]

res[5] = a[5]

res[6] = a[6]

res[7] = -a[7]

return R300.fromarray(res)

def __mul__(a,b):

"""R300.Mul

 

The geometric product.

"""

if type(b) in (int, float):

return a.muls(b)

res = a.mvec.copy()

res[0] = b[0] * a[0] + b[1] * a[1] + b[2] * a[2] + b[3] * a[3] - b[4] * a[4] - b[5] * a[5] - b[6] * a[6] - b[7] * a[7]

res[1] = b[1] * a[0] + b[0] * a[1] - b[4] * a[2] - b[5] * a[3] + b[2] * a[4] + b[3] * a[5] - b[7] * a[6] - b[6] * a[7]

res[2] = b[2] * a[0] + b[4] * a[1] + b[0] * a[2] - b[6] * a[3] - b[1] * a[4] + b[7] * a[5] + b[3] * a[6] + b[5] * a[7]

res[3] = b[3] * a[0] + b[5] * a[1] + b[6] * a[2] + b[0] * a[3] - b[7] * a[4] - b[1] * a[5] - b[2] * a[6] - b[4] * a[7]

res[4] = b[4] * a[0] + b[2] * a[1] - b[1] * a[2] + b[7] * a[3] + b[0] * a[4] - b[6] * a[5] + b[5] * a[6] + b[3] * a[7]

res[5] = b[5] * a[0] + b[3] * a[1] - b[7] * a[2] - b[1] * a[3] + b[6] * a[4] + b[0] * a[5] - b[4] * a[6] - b[2] * a[7]

res[6] = b[6] * a[0] + b[7] * a[1] + b[3] * a[2] - b[2] * a[3] - b[5] * a[4] + b[4] * a[5] + b[0] * a[6] + b[1] * a[7]

res[7] = b[7] * a[0] + b[6] * a[1] - b[5] * a[2] + b[4] * a[3] + b[3] * a[4] - b[2] * a[5] + b[1] * a[6] + b[0] * a[7]

return R300.fromarray(res)

__rmul__ = __mul__

def __xor__(a,b):

res = a.mvec.copy()

res[0] = b[0] * a[0]

res[1] = b[1] * a[0] + b[0] * a[1]

res[2] = b[2] * a[0] + b[0] * a[2]

res[3] = b[3] * a[0] + b[0] * a[3]

res[4] = b[4] * a[0] + b[2] * a[1] - b[1] * a[2] + b[0] * a[4]

res[5] = b[5] * a[0] + b[3] * a[1] - b[1] * a[3] + b[0] * a[5]

res[6] = b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6]

res[7] = b[7] * a[0] + b[6] * a[1] - b[5] * a[2] + b[4] * a[3] + b[3] * a[4] - b[2] * a[5] + b[1] * a[6] + b[0] * a[7]

return R300.fromarray(res)

def __and__(a,b):

res = a.mvec.copy()

res[7] = 1 * (a[7] * b[7])

res[6] = 1 * (a[6] * b[7] + a[7] * b[6])

res[5] = -1 * (a[5] * -1 * b[7] + a[7] * b[5] * -1)

res[4] = 1 * (a[4] * b[7] + a[7] * b[4])

res[3] = 1 * (a[3] * b[7] + a[5] * -1 * b[6] - a[6] * b[5] * -1 + a[7] * b[3])

res[2] = -1 * (a[2] * -1 * b[7] + a[4] * b[6] - a[6] * b[4] + a[7] * b[2] * -1)

res[1] = 1 * (a[1] * b[7] + a[4] * b[5] * -1 - a[5] * -1 * b[4] + a[7] * b[1])

res[0] = 1 * (a[0] * b[7] + a[1] * b[6] - a[2] * -1 * b[5] * -1 + a[3] * b[4] + a[4] * b[3] - a[5] * -1 * b[2] * -1 + a[6] * b[1] + a[7] * b[0])

return R300.fromarray(res)

def __or__(a,b):

res = a.mvec.copy()

res[0] = b[0] * a[0] + b[1] * a[1] + b[2] * a[2] + b[3] * a[3] - b[4] * a[4] - b[5] * a[5] - b[6] * a[6] - b[7] * a[7]

res[1] = b[1] * a[0] + b[0] * a[1] - b[4] * a[2] - b[5] * a[3] + b[2] * a[4] + b[3] * a[5] - b[7] * a[6] - b[6] * a[7]

res[2] = b[2] * a[0] + b[4] * a[1] + b[0] * a[2] - b[6] * a[3] - b[1] * a[4] + b[7] * a[5] + b[3] * a[6] + b[5] * a[7]

res[3] = b[3] * a[0] + b[5] * a[1] + b[6] * a[2] + b[0] * a[3] - b[7] * a[4] - b[1] * a[5] - b[2] * a[6] - b[4] * a[7]

res[4] = b[4] * a[0] + b[7] * a[3] + b[0] * a[4] + b[3] * a[7]

res[5] = b[5] * a[0] - b[7] * a[2] + b[0] * a[5] - b[2] * a[7]

res[6] = b[6] * a[0] + b[7] * a[1] + b[0] * a[6] + b[1] * a[7]

res[7] = b[7] * a[0] + b[0] * a[7]

return R300.fromarray(res)

def __add__(a,b):

"""R300.Add

 

Multivector addition

"""

if type(b) in (int, float):

return a.adds(b)

res = a.mvec.copy()

res[0] = a[0] + b[0]

res[1] = a[1] + b[1]

res[2] = a[2] + b[2]

res[3] = a[3] + b[3]

res[4] = a[4] + b[4]

res[5] = a[5] + b[5]

res[6] = a[6] + b[6]

res[7] = a[7] + b[7]

return R300.fromarray(res)

__radd__ = __add__

def __sub__(a,b):

"""R300.Sub

 

Multivector subtraction

"""

if type(b) in (int, float):

return a.subs(b)

res = a.mvec.copy()

res[0] = a[0] - b[0]

res[1] = a[1] - b[1]

res[2] = a[2] - b[2]

res[3] = a[3] - b[3]

res[4] = a[4] - b[4]

res[5] = a[5] - b[5]

res[6] = a[6] - b[6]

res[7] = a[7] - b[7]

return R300.fromarray(res)

def __rsub__(a,b):

"""R300.Sub

 

Multivector subtraction

"""

return b + -1 * a

def smul(a,b):

res = a.mvec.copy()

res[0] = a * b[0]

res[1] = a * b[1]

res[2] = a * b[2]

res[3] = a * b[3]

res[4] = a * b[4]

res[5] = a * b[5]

res[6] = a * b[6]

res[7] = a * b[7]

return R300.fromarray(res)

def muls(a,b):

res = a.mvec.copy()

res[0] = a[0] * b

res[1] = a[1] * b

res[2] = a[2] * b

res[3] = a[3] * b

res[4] = a[4] * b

res[5] = a[5] * b

res[6] = a[6] * b

res[7] = a[7] * b

return R300.fromarray(res)

def sadd(a,b):

res = a.mvec.copy()

res[0] = a + b[0]

res[1] = b[1]

res[2] = b[2]

res[3] = b[3]

res[4] = b[4]

res[5] = b[5]

res[6] = b[6]

res[7] = b[7]

return R300.fromarray(res)

def adds(a,b):

res = a.mvec.copy()

res[0] = a[0] + b

res[1] = a[1]

res[2] = a[2]

res[3] = a[3]

res[4] = a[4]

res[5] = a[5]

res[6] = a[6]

res[7] = a[7]

return R300.fromarray(res)

def ssub(a,b):

res = a.mvec.copy()

res[0] = a - b[0]

res[1] = -b[1]

res[2] = -b[2]

res[3] = -b[3]

res[4] = -b[4]

res[5] = -b[5]

res[6] = -b[6]

res[7] = -b[7]

return R300.fromarray(res)

def subs(a,b):

res = a.mvec.copy()

res[0] = a[0] - b

res[1] = a[1]

res[2] = a[2]

res[3] = a[3]

res[4] = a[4]

res[5] = a[5]

res[6] = a[6]

res[7] = a[7]

return R300.fromarray(res)

def norm(a):

return abs((a * a.Conjugate())[0]) ** 0.5

 

def inorm(a):

return a.Dual().norm()

 

def normalized(a):

return a * (1 / a.norm())

e1 = R300(1.0, 1)
e2 = R300(1.0, 2)
e3 = R300(1.0, 3)
e12 = R300(1.0, 4)
e13 = R300(1.0, 5)
e23 = R300(1.0, 6)
e123 = R300(1.0, 7)

if __name__ == '__main__':

#print("e1*e1         :", str(e1*e1))

#print("pss           :", str(e123))

#print("pss*pss       :", str(e123*e123))

a = [R300(1.0, i) for i in range(0, 8) ]

b = [-1 * x for x in a]

a = a + b

print("Vectors:")

[print(str(x)) for x in a ]

print("Products")

 

def javascriptCode(a,b):

def ArnauldEncoding(x):

answer= str(x)

if answer[0]=="-":

return answer[1:]+"1"

else:

return answer+"0"

return "".join(["console.log(\"0b",ArnauldEncoding(a) , "\",\"*\",\"0b" , ArnauldEncoding(b),"\",\"=\",","f(0b" , ArnauldEncoding(a) , ")(0b" , ArnauldEncoding(b) , ").toString(2), \"== \",\"" , ArnauldEncoding(a * b),"\")"])

 

def RubyCode(a,b):

return "".join(["[","0b",str(a),",","0b",str(b),"],"]).replace("0b-","-0b")

if True:

Productos = ["".join([str(x),"*",str(y),"=",str(x * y)]) for x in a for y in a]

#Productos = [javascriptCode(x,y) for x in a for y in a]

#Productos = [RubyCode(x,y) for x in a for y in a]

#Productos = [str(x*y) for x in a for y in a]

 

Origen = ["1e1", "1e2", "1e3", "1e12", "1e13", "1e23", "1e123"]

Destino = ["0010", "0100", "1000", "0110", "1010", "1100", "1110"]

Reemplazo = dict(zip(Origen, Destino))

Binario = Productos

for key in sorted(Reemplazo, key=len, reverse=True): # Through keys sorted by length

Binario = [x.replace(key,Reemplazo[key]) for x in Binario]

[print(x) for x in Binario]

a = a

 

$$b=e_2 \cdot e_3=01100$$

возможные продукты:

Arsenl469


Рег
27 Nov, 2019

Тем
76

Постов
193

Баллов
603
  • 26, Oct 2024
  • #2

JavaScript (ES6), 73 65 байт

Ожидает

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 rules = {'11':'','22':'','33':'','10':'-01','13':'-31','20':'-02','21':'-12','30':'-03','31':'-13','32':'-23','3-':'-3','2-':'-2','1-':'-1','0-':'-0','--':'',}
def dorules(s):

for r in rules.keys():

s=s.replace(r,rules[r]).replace(' ','')

return s
def b2e(x):

s='-' if x<0 else ''

for i in range(1,3):

if abs(x) & (2**i):

s += str(i)

return s
def e2b(x):

s=0

for i in x:

try: s|=2**int(i)

except: pass

b=bin(s)[2:].zfill(4)

if x=='': return b

if x=='-': return '-'+b

if int(x)<0: return '-'+b

return b
def m(i,j):

s=['',b2e(i)+b2e(j)]

while True:

s += [dorules(s[-1])]

if s[-2] == s[-1] or s[-3] == s[-1]: break

return s[-1]
def sign(x): return '-' if int(x)<0 else ''
for i in range(-15,16):

for j in range(-15,16):

c=e2b(m(i,j))

print(sign(i)+bin(abs(i))[2:].zfill(4)+'*'+sign(j)+bin(abs(j))[2:].zfill(4)+'='+c)
 
, two integers where the least significant bit holds the sign (\$0\$ for positive, \$1\$ for negative) and all other bits are used to store the absolute value.

Возвращает продукт \$c\$ в том же формате.

--|\*.+

Попробуйте онлайн!

Как?

Мы вычисляем произведение \$p\$ чисел \$a\$ и \$b\$ следующим образом:

  • Начнем с \$p=a\operatorname{xor}b\$. Это немедленно дает правильное абсолютное значение и инициализирует знак в соответствии со знаками \$a\$ и \$b\$.
  • Для каждого установленного бита в \$b\$ с индексом \$i>0\$ мы инвертируем знаковый бит \$p\$, если в \$a\$ с индексом больше, чем \$i\$.

Прокомментировал

0 ||answer||

JavaScript (ES6), 42 байта

(стоя на плечах Арно)

Используя ту же кодировку, что и Арно. То есть: _ , two integers where the least significant bit holds the sign (\$0\$ for positive, \$1\$ for negative) and all other bits are used to store the absolute value. Returns the product \$c\$ in the same format.

1

Ожидает

  • Объяснение: 1 but using divisions instead of rightshifts to save a char each (taking advantage of the fact that the recursion stops on arithmetic underflow-- same crazy trick as Arnauld-- and that fractional parts are discarded by bitwise operators
  • действительно это
  • поскольку (b>>1) было изменено на (b/2), круглые скобки вокруг можно удалить.
  • b/2, поскольку / связывает сильнее, чем & 1 , same explanation as Arnauld.
  • +r`((0|(?<-3>1)|(1))*)((0)|1)((?<-7>.)*\*.*)1(?=(.)*) $#3*-$1$#5$6_ is "xor of all rightshifts of x", i.e. (.+)- -$1
  • и & связывается сильнее, чем ^, так что скобки здесь тоже не нужны ^'0P`\d+ is the parity of the number of bits set in \d\b 0
  • начать с \d\b 0 ^'0P`\d+ (.+)- -$1 +r`((0|(?<-3>1)|(1))*)((0)|1)((?<-7>.)*\*.*)1(?=(.)*) $#3*-$1$#5$6_ --|\*.+ is the parity of the number of swaps involving that position in (the magnitude part of) b # Convert both integers in the (implicit) input-pair to a binary # string D # Duplicate this pair of binary strings €¨ # Remove the trailing bit from each 0ìï # Prepend a "0", and cast it to an integer # (empty strings become "0", everything else remains the same) © # Store this in variable `®` (without popping) C # Change these binary strings to integers ` # Pop and push both values separated to the stack ^ # Bitwise-XOR them together s # Swap to get the pair of binary strings again €θ # Leave just the trailing bits # Convert the 0 to -1: · # Double both: 0→0; 1→2 < # Decrease both by 1: 0→-1; 2→1 P # Take the product of this as our starting sign ® # Push the binary string from `®` again €S # Convert both to a list of bits ` # Pop and push the lists separated to the stack .s # Get the suffices of the second one R # Reverse this list of suffices ‚ # Pair the two lists together ζ # Zip/transpose, swapping rows/columns, # implicitly using a space filler if they're of unequal lengths O # Sum each inner-most list # (the spaces are counted as 0 in the legacy version) Æ # Reduce both lists by subtracting .± # Get the sign of this (-1 if <0; 0 if ==0; 1 if >0) ! # Get the factorial of this: -1 if -1; 1 if 0 or 1) P # Take the product of these values * # Multiply it to our initial sign value ¨ # Remove the trailing "1" from this sign value ì # And prepend this "" or "-" in front of the XOR-ed value # (after which it is output implicitly as result) Обратите внимание, что 1100 ; that is, 12 .
каждая битовая позиция в

,поэтому желаемая четность общего количества свопов

25

будет четность количества бит, установленных в

 

MMColt


Рег
19 Jul, 2006

Тем
72

Постов
193

Баллов
563
  • 26, Oct 2024
  • #3

Питон 3

, 69 байт

Попробуйте онлайн!

Самый младший бит — это знак. Тестового сценария не существует, и все найденные мной общедоступные пакеты очень сложно применить здесь, поэтому я не проверял это тщательно. Пожалуйста, дайте мне знать, если это неверно.

-1100

Я не любитель кода, но любой может свободно использовать это решение и кодировать его. -12 is used as an aggregator of all its bits with XOR. It's tracking the parity - comparable to counting tail bits in more direct solutions. It took some thought to show that this equivalent.

Мне потребовалось некоторое время, чтобы придумать этот алгоритм... его немного сложно объяснить.

Имеет ли смысл хранить знаковый бит? В конце концов, положительное и отрицательное все равно должны сочетаться?Некоторые объяснения:

24

Самый низкий бит

 

Susirepka


Рег
07 Jan, 2011

Тем
67

Постов
167

Баллов
522
  • 26, Oct 2024
  • #4
1

Руби 0

, 98...62 байта

Попробуйте онлайн!

Вход: bD€¨0ìï©C`^s€θ·<P®€S`.sR‚ζOÆ.±!P*¨ì

Выход:

Спасибо Арно за идею разделить входные данные и сократить пару байтов.

Как это работает:, 35 Знак определяется количеством прыжков: пример:

e3*(e1e2) = -e1e3*(e2) = (-e1)*(-e2e3) = e1e2e3

В этом случае e3 должна «перепрыгнуть» через e1 и e2, чтобы попасть на свое место, и для четного числа прыжков знак будет положительным. [abs,sign] ) or positive ( [abs(a),sign(a),abs(b),sign(b)]

 

JeffreyChut


Рег
13 Dec, 2013

Тем
78

Постов
184

Баллов
584
  • 26, Oct 2024
  • #5
->c,w,d,x{[c^d,w*x*(~k=0)**((0..c+d).sum{|x|c[x]*k+=d[x-1]})]} 05AB1E (устаревший) b / def g(a, b): r = a ^ b b &= -2 # I think the sign bit needs to be cleared while a: a >>= 1 # iterate through all bits r ^= a & b & 1 # modify sign of result b = (b >> 1) ^ (b & 1) # iterate through bits of b, but lowest bit is XOR or all bits so far return r and input def g(a,b): r=a^b;b&=-2 while a:a>>=1;r^=a&b&1;b=b>>1^b&1 return r is g(g(a>>2)&(b>>1))&1 / g(a>>2)&(b>>1) ).

байты Введите два целых числа, где конечный бит их двоичного представления представляет собой отрицательное число ( ) (т.е. ввод.

является

b ||answer||

Попробуйте онлайнили

g(a>>2)&(b>>1)

проверьте еще несколько тестовых примеров Объяснение:

x

сетчатка

g(x)&1

, 102 байта

g(x) = x^(x>>1)^(x>>2)^...

Попробуйте онлайн!

g(x)

Ссылка включает тестовые примеры. Предполагается, что входные данные имеют двоичную форму, сгенерированную программой, указанной в вопросе. (Сохраните 9 байт, если входные данные всегда дополняются, и 7 байт, если они никогда не содержат e₀). Объяснение: a^b bit in the second number, working from e₁ upwards, use a .NET balancing group to find the matching bit in the first number and another .NET balancing group to count the parity of the a=>b=>a^b^(g=x=>x&&x^g(x>>1))(g(a>>2)&(b>>1))&1 Удалите e₀, если он появится. a=>b=>a^b^(g=x=>x&&x^g(x/2))(g(a/4)&b/2)&1 bit in the second number with a (a)(b) Дополните оба числа до одинаковой длины. (Обратите внимание, что при запуске набора тестов все числа в наборе дополняются до одинаковой длины.) a => b => // (a, b) = input integers a ^ b ^ ( // compute a XOR b XOR ... g = a => // ... the result of the recursive function g, taking a: (b /= 2) && // divide b by two; this is shorter than a right shift // and will eventually evaluate to zero because of // arithmetic underflow ( h = n => // h is another recursive function counting the bits // set in n, provided that the LSB of b is set: b & !!n && // stop if the LSB of b is not set or n = 0 !h(n & ~-n) // otherwise, invert the result and do a recursive // call where the least significant bit set in n // is cleared )(a) ^ // initial call to h with n = a g(a >> 1) // XOR the result with a recursive call to g with // floor(a / 2) )(a >> 2) // initial call to g with floor(a / 4), which discards // the sign bit and the 1st bit of the absolute value ).

a=>b=>a^b^(g=a=>(b/=2)&&(h=n=>b&!!n&&!h(n&~-n))(a)^g(a>>1))(a>>2)

Если второе число отрицательное, инвертируйте оба числа.

Для каждого

биты до этого бита. Если четность нечетная, отмените первое число. Переключите соответствующий бит в первом номере и замените

(игрок в гольф, чем

Удалите все двойные отрицания и второе число (которое на данный момент равно нулю).

 

Baraccuda


Рег
07 May, 2007

Тем
64

Постов
213

Баллов
563
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно