Python 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
ลองออนไลน์!
-14 ไบต์ขอบคุณ notjagan
-33 ไบต์ขอบคุณ Leaky Nun (และเปลี่ยน endianness)
ฉันไม่มีธุรกิจที่พยายามจะเล่นกอล์ฟอะไรใน Python แต่ฉันไม่ต้องการใช้ Lua เนื่องจากวิธีนี้ต้องการจำนวนเต็มจำนวนมากเพื่อทำงานกับ stings ความยาวที่เหมาะสม (หมายเหตุ: อัลกอริทึมยังคงช้าจริง ๆ เมื่อเพิ่มความยาวของสตริง) นี่เป็นเพียงเพื่อให้คำตอบ;)
แต่ละสตริงเป็นแบบย้อนกลับด้วยตนเองและสตริงว่างคือตัวตน สิ่งนี้จะทำการ xor ภายใต้ bijection อย่างง่ายระหว่างสตริงและจำนวนเต็มที่ไม่เป็นลบ s
เป็นฟังก์ชั่นตัวช่วยที่คำนวณ bijection (ทางเดียวเท่านั้น) และ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 (a) + a = (inv (a) + a) + e = (inv (a) + a) + (inv (a) + inv (a)) () inv (a) + (a + inv (a)) + inv (a ()) = (inv (a) + e) + inv (inv (a)) = inv (a) + inv (a) ) = e
นี่ก็หมายความว่าเป็นผกผันของInv (ก)
ตัวตนที่ถูกต้องใด ๆ คือตัวตนด้านซ้าย: 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
โดยพื้นฐานแล้วแนวคิดนี้จะแบ่งสตริงตามส่วนประกอบ power-of-two ของความยาวของมันจากนั้นปฏิบัติต่อสิ่งเหล่านี้เป็นฟิลด์ที่มีองค์ประกอบที่ขาดหายไปซึ่งเป็นศูนย์และแต่ละองค์ประกอบที่ไม่ขาดหายไปแทนตัวเลขตั้งแต่ 1 ถึง 256 ^ n ดังนั้นทั้งหมด 256 ^ n + 1 ค่าทั้งหมด จากนั้นตัวแทนเหล่านี้สามารถเพิ่มโมดูโลส่วนประกอบที่ชาญฉลาด 256 ^ n + 1
หมายเหตุ: การนำ Lua นี้ไปใช้จะมีปัญหาการล้นของตัวเลขสำหรับสตริงที่มีขนาดใหญ่กว่า 7 แต่ชุดของสตริงที่มีความยาว 7 หรือน้อยกว่านั้นจะถูกปิดภายใต้การเพิ่มนี้
ลองออนไลน์!