सही स्ट्रिंग जोड़ लागू करें


29

कई भाषाएं तार को "जोड़ा" जाने देती हैं +। हालाँकि, यह वास्तव में गूढ़ है, एक सही जोड़ समूह स्वयंसिद्धों का पालन करेगा:

  • यह बंद है (किसी भी दो तारों का जोड़ हमेशा एक तार होता है)

  • यह साहचर्य है ( (a + b) + c = a + (b + c) )

  • एक पहचान है ( :e: a + e = a )

  • हर तत्व का एक व्युत्क्रम होता है ( :a: :b: a + b = e )

(संघ 4 वें समूह स्वयंसिद्ध उल्लंघन)

तो मेरा काम आप के लिए एक सच्चे स्ट्रिंग जोड़ को लागू करना है, यह एक ऐसा फ़ंक्शन है जो स्ट्रिंग का प्रतिनिधित्व करने वाले बाइट्स के दो अनुक्रम लेता है और एक तीसरा लौटाता है जैसे कि आपका फ़ंक्शन बाइट्स के अनुक्रमों पर सभी समूह स्वयंसिद्धों को संतुष्ट करता है।

यह बाइट्स के सभी अनुक्रमों पर काम करना चाहिए जिसमें अशक्त बाइट्स के साथ तार शामिल हैं।

यह इसलिए उत्तर बाइट में कम बाइट के साथ बेहतर स्कोर किए जाएंगे।

जवाबों:


5

पायथन 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 बाइट्स लीकी नून (और स्विच किए गए धीरज) के लिए धन्यवाद

मेरे पास पायथन में कुछ भी करने की कोशिश करने वाला कोई व्यवसाय नहीं है, लेकिन मैं लुआ का उपयोग नहीं करना चाहता था क्योंकि इस विधि को उचित लंबाई के डंक पर काम करने के लिए बड़े सटीक पूर्णांक की आवश्यकता होती है। (नोट: एल्गोरिथ्म अभी भी बहुत धीमा है, जब स्ट्रिंग की लंबाई बढ़ जाती है।) यह ज्यादातर सिर्फ एक उत्तर देने के लिए है;)

प्रत्येक स्ट्रिंग आत्म-व्युत्क्रम है, और खाली स्ट्रिंग पहचान है। यह बस स्ट्रिंग और गैर-नकारात्मक पूर्णांकों के बीच एक सरल आक्षेप के तहत एक्सआर करता है। sएक सहायक फ़ंक्शन है जो बायजेस्ट (केवल एक ही रास्ता) की गणना करता है, और dव्युत्क्रम है।

गैर-धीमा संस्करण (148 बाइट्स, लीकी नन के सौजन्य से):

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)) + inv (inv (a)) = (inv (a) + e) ​​+ inv (निमंत्रण (a)) = inv (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 = ((a) + a + + x = inv (a) + (a + x) = inv (a) + a = e

व्युत्क्रम अद्वितीय हैं, यदि a + x = e फिर: x = e + x = ((a) + a + + x = inv (a) + (a + x) = inv (a) + e = inv (a) )

सबूतों के बाद प्रस्तावित समाधानों के लिए काउंटरटेक्मैंस का निर्माण करना काफी आसान होना चाहिए जो इन प्रस्तावों को संतुष्ट नहीं करते हैं।

यहाँ एक और अधिक प्राकृतिक एल्गोरिथ्म है जिसे मैंने लागू किया (लेकिन गोल्फ नहीं) लुआ में । शायद यह किसी को एक विचार देगा।

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

मूल रूप से इसकी लंबाई के दो-दो घटकों की शक्ति के आधार पर स्ट्रिंग को विभाजित करने के लिए विचार किया जाता है, और फिर इन्हें एक अनुपलब्ध घटक के साथ फ़ील्ड के रूप में माना जाता है, और प्रत्येक गैर-लापता घटक 1 से 256 ^ n तक की संख्या का प्रतिनिधित्व करता है, तो 256 ^ n + 1 मान। फिर इन अभ्यावेदन को घटक-वार मोडुलो 256 ^ n + 1 जोड़ा जा सकता है।

नोट: इस Lua कार्यान्वयन में 7. से अधिक आकार के तारों के लिए संख्यात्मक अतिप्रवाह समस्याएं होंगी। लेकिन 7 या उससे कम लंबाई के तारों का सेट इस अतिरिक्त के तहत बंद है।

इसे ऑनलाइन आज़माएं!


मजेदार तथ्य: क्योंकि प्रत्येक तत्व का अपना विलोम होता है, इसलिए यह समूह भी एबेलियन है।
गेहूं जादूगर

4

जेली , 8 बाइट्स

‘ḅ⁹^/ḃ⁹’

इस का उपयोग करता है एक द्विभाजित मानचित्रण φ गैर नकारात्मक पूर्णांक के लिए बाइट सरणियों से, XORs लागू करने का परिणाम φ दो इनपुट तार करने के लिए है, तो लागू होता है φ -1 परिणाम के लिए।

खाली सरणी तटस्थ तत्व है और प्रत्येक बाइट सरणियों का अपना व्युत्क्रम है।

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

‘ḅ⁹^/ḃ⁹’  Main link. Argument: [A, B] (pair of byte arrays)

‘         Increment all integers in A and B.
 ḅ⁹       Convert from base 256 to integer.
   ^/     XOR the resulting integers.
     ḃ⁹   Convert from integer to bijective base 256.
       ’  Subtract 1.

मैं सोच रहा था कि कौन से एसोलैंग्स में विशेषण आधार रूपांतरण बिल्डिंग्स थे ...
नील

कि आधार 257 नहीं होना चाहिए?
टाइटस

@Titus नहीं है, के अंकों द्विभाजित 1 256 को (सम्मिलित) से आधार 256 रेंज।
डेनिस

तो ḅ⁹से है द्विभाजित आधार 256 पूर्णांक के लिए? क्या A+Aदेता है? chr(-1)?
टाइटस

@Titus आधार-से-पूर्णांक रूपांतरण प्रक्रिया विशेषण और "सामान्य" आधारों के लिए समान है। [65] + [65]उपज देगा []
डेनिस

3

पायथन 2 , 114 बाइट्स

lambda a,b:s(d(a)^d(b))
d=lambda s:s and d(s[1:])*256+ord(s[0])+1or 0
s=lambda d:d and chr(~-d%256)+s(~-d/256)or''

इसे ऑनलाइन आज़माएं! ज़ोरिंग द्वारा काम करता है स्ट्रिंग्स को छोटे-एंडियन जीव विशेष आधार 256 के रूप में व्याख्या की जाती है।


d=lambda s:s>''and-~ord(s[0])+d(s[1:])*256तीन बाइट्स बचाता है; s=lambda d:d*'?'and chr(~-d%256)+s(~-d/256)एक और बचाता है।
लिन

@ लीन क्या वह दूसरी बड़ी डी के लिए काम करने वाला है?
नील

अगर यह तार एक ही लंबाई के नहीं हैं तो यह कैसे काम करता है?
गेहूं जादूगर

@WheatWizard तार की लंबाई अप्रासंगिक है। स्ट्रिंग्स के सेट से पूर्णांक के सेट तक एक विशेषण मानचित्रण है। पूर्णांक मान फिर XORed हैं, और मैपिंग उलट है।
नील

@ नील ठीक है धन्यवाद अब मैं देख रहा हूँ।
गेहूं जादूगर

1

पायथन 2 , 197 बाइट्स

def n(s):
 n=s and ord(s[0])+1 or 0
 for c in s[1:]:n=n*256+ord(c)
 return(-1)**n*n/2
def f(l,r,s=""):
 i=n(l)+n(r)
 i=abs(i*2+(i<=0))
 while i>257:s=chr(i%256)+s;i/=256
 return["",chr(i-1)+s][i>0]

इसे ऑनलाइन आज़माएं!

स्ट्रिंग को एक संख्या में बदल देता है (चारकोल से घटाकर), यदि विषम हो, तो आधा हो जाता है। गोल्फ के रूप में अन्य एक के रूप में नहीं है, लेकिन तेज: पी



1
nइंजेक्शन नहीं है, जो समस्याओं का कारण बनता है। उदाहरण के लिए n("\x00\x00")==n("\xff")यह विफल रहता है:print(f("\x00\x00","") == "\x00\x00")
तहती ४

: | अरे नहीं, यह तय करने के लिए इतना महंगा होने जा रहा है
केवल

1 or=>1or
Zacharý
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.