파이썬 (3) , 177 (170) 163 130 바이트
lambda a,b:s(d(a)^d(b))
def s(n,x=0,s=''):
while n:n-=1;s+=chr(n%256);n>>=8
return s
def d(n,c=0):
while s(c)!=n:c+=1
return c
온라인으로 사용해보십시오!
notjagan 덕분에 -14 바이트
Leaky Nun (및 전환 엔디안) 덕분에 -33 바이트
파이썬에서 골프를 타려고하는 사업은 없지만이 방법에는 합리적인 길이의 찌르기를 작동시키기 위해 큰 정확한 정수가 필요하기 때문에 Lua를 사용하고 싶지 않았습니다. (참고 : 문자열 길이를 늘릴 때 알고리즘은 여전히 매우 느립니다.) 대부분 대답을 제공하기위한 것입니다.
각 문자열은 자기 역수이며 빈 문자열은 ID입니다. 이것은 단순히 문자열과 음이 아닌 정수 사이의 간단한 bijection에서 xor를 수행합니다. s
전단 사 함수를 (편도 만) 연산, 및 헬퍼 기능이다 d
반전된다.
비 느린 버전 (148 바이트, Leaky Nun 제공) :
lambda a,b:s(d(a)^d(b))
def s(n,x=0,s=''):
while n:n-=1;s=chr(n%256)+s;n>>=8
return s
def d(n,c=0):
while n:c=c*256+ord(n[0])+1;n=n[1:]
return c
온라인으로 사용해보십시오!
나는 그룹 이론 입문서를 위해 이것을 납치 할 것입니다.
권리 역은 왼쪽 역 : (+ INV (INV (a)) INV (a)) = INV (a) + A = (INV (a) + A) + E = (INV (a) + A) + inv (a) + (a + inv (a)) + inv (inv (a)) = (inv (a) + e) + inv (inv (a)) = inv (a) + inv (inv (a) ) = 전자
이것은 또한 a 가 inv (a) 의 역함을 의미합니다 .
모든 오른쪽 항등은 왼쪽 항등입니다. e + a = (a + inv (a)) + a = a + (inv (a) + a) = a
다른 정체성 f가 주어지면 그 정체성은 유일하다 : e = e + f = f
만일 A + X = A 후, X = E : X = E + X = (INV (a) + A) + X = INV (a) + (A + X) = INV (a) + A = E
a + x = e 인 경우 역은 고유합니다 . . x = e + x = (inv (a) + a) + x = inv (a) + (a + x) = inv (a) + e = inv (a )
증거를 따르면 이러한 제안을 충족하지 않는 제안 된 솔루션에 대한 반례를 쉽게 구성 할 수 있어야합니다.
Lua 에서 구현 한 (그러나 골프는 아니었던)보다 자연스러운 알고리즘이 있습니다. 어쩌면 누군가에게 아이디어를 줄 것입니다.
function string_to_list(s)
local list_val = {}
local pow2 = 2 ^ (math.log(#s, 2) // 1) -- // 1 to round down
local offset = 0
list_val.p = pow2
while pow2 > 0 do
list_val[pow2] = 0
if pow2 & #s ~= 0 then
for k = 1, pow2 do
list_val[pow2] = 256 * list_val[pow2] + s:byte(offset + k)
end
list_val[pow2] = list_val[pow2] + 1
offset = offset + pow2
end
pow2 = pow2 // 2
end
return list_val
end
function list_to_string(list_val)
local s = ""
local pow2 = list_val.p
while pow2 > 0 do
if list_val[pow2] then
local x = list_val[pow2] % (256 ^ pow2 + 1)
if x ~= 0 then
x = x - 1
local part = ""
for k = 1, pow2 do
part = string.char(x % 256) .. part
x = x // 256
end
s = s .. part
end
end
pow2 = pow2 // 2
end
return s
end
function list_add(list_val1, list_val2)
local result = {}
local pow2 = math.max(list_val1.p, list_val2.p)
result.p = pow2
while pow2 > 0 do
result[pow2] = (list_val1[pow2] or 0) + (list_val2[pow2] or 0)
pow2 = pow2 // 2
end
return result
end
function string_add(s1, s2)
return list_to_string(list_add(string_to_list(s1), string_to_list(s2)))
end
아이디어는 기본적으로 길이의 2의 제곱 구성 요소를 기준으로 문자열을 분할 한 다음 0을 나타내는 누락 구성 요소와 1에서 256 ^ n까지의 숫자를 나타내는 누락되지 않은 구성 요소가있는 필드로 처리하는 것입니다. 총 256 ^ n + 1 값입니다. 그런 다음 이러한 표현을 컴포넌트 단위 모듈로 256 ^ n + 1에 추가 할 수 있습니다.
참고 :이 Lua 구현에는 7보다 큰 크기의 문자열에 대해 숫자 오버 플로우 문제가 발생하지만 길이가 7 이하인 문자열 세트는이 추가에서 닫힙니다.
온라인으로 사용해보십시오!