সত্য স্ট্রিং সংযোজন কার্যকর করুন


29

অনেকগুলি ভাষা স্ট্রিংগুলিকে "যুক্ত" করতে দেয় +। তবে এটি সত্যই সংক্ষিপ্ত বিবরণ, একটি সত্য সংযোজন গ্রুপের অক্ষগুলি অনুসরণ করবে:

  • এটি বন্ধ রয়েছে (যে কোনও দুটি স্ট্রিংয়ের সংযোজন সর্বদা একটি স্ট্রিং থাকে)

  • এটি সাহসী ( (a + b) + c = a + (b + c) )

  • একটি পরিচয় আছে ( :e: a + e = a )

  • প্রতিটি উপাদানের একটি বিপরীত থাকে ( :a: ∃b: a + b = e )

(কনটেন্টেশন চতুর্থ গ্রুপ অ্যাক্সিয়ম লঙ্ঘন করে)

সুতরাং আপনার কাছে আমার কাজটি হ'ল একটি সত্য স্ট্রিং সংযোজন বাস্তবায়ন করা, এটি এমন একটি ফাংশন যা দুটি স্ট্রিং প্রতিনিধিত্ব করে স্ট্রিং উপস্থাপন করে এবং একটি তৃতীয়াংশ ফেরত দেয় যাতে আপনার ফাংশনটি সমস্ত গোষ্ঠী অক্ষরেখাকে বাইটের ক্রমানুসারে সন্তুষ্ট করে।

এটি অবশ্যই নাল বাইট সহ স্ট্রিংগুলিকে উপস্থাপন করে সমস্ত বাইটের ক্রমানুসারে কাজ করবে।

এটি তাই কম বাইট ভাল হওয়ার সাথে উত্তরগুলি বাইটে স্কোর করা হবে।

উত্তর:


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 বাইটস

-৩৩ বাইটস লিকি নুনকে ধন্যবাদ জানায় (এবং এন্ডিয়াননেস পরিবর্তন করেছেন)

পাইথনে কোনও গল্ফ দেওয়ার চেষ্টা করার মতো আমার কোনও ব্যবসা নেই, তবে আমি লুয়া ব্যবহার করতে চাইনি কারণ যুক্তিযুক্ত দৈর্ঘ্যের স্টিংগুলিতে কাজ করার জন্য এই পদ্ধতির বড় সঠিক পূর্ণসংখ্যার প্রয়োজন। (দ্রষ্টব্য: স্ট্রিংয়ের দৈর্ঘ্যটি র‍্যাম্পিং করার সময় অ্যালগরিদমটি এখনও সত্যিই ধীর হয়)) এটি বেশিরভাগ ক্ষেত্রে কেবল উত্তর সরবরাহ করার জন্য;)

প্রতিটি স্ট্রিং স্ব-বিপরীত এবং খালি স্ট্রিংটি পরিচয়। এটি স্ট্রিং এবং অ-নেতিবাচক পূর্ণসংখ্যার মধ্যে একটি সাধারণ দ্বিচারের মধ্যে কেবল জোর করে। 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 (ক) + একটি = (INV (ক) + একটি) + E = (INV (ক) + একটি) + + (INV (ক) + + INV (INV (ক))) = inv (a) + (a + inv (a)) + inv (inv (a)) = (inv (a) + e) ​​+ inv (inv (a)) = inv (a) + inv (a) ) = ই

এর অর্থ এটিও হ'ল 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

বিপরীতগুলি অনন্য, যদি একটি + x = ই হয় তবে: x = ই + এক্স = (ইনভ (ক) + ক) + এক্স = ইনভ (ক) + (এ + এক্স) = ইনভ (ক) + ই = ইনভ (এ) )

প্রমাণগুলি অনুসরণ করে প্রস্তাবগুলির সমাধানগুলির জন্য প্রতিবিম্ব তৈরি করা মোটামুটি সহজ হওয়া উচিত যা এই প্রস্তাবগুলি সন্তুষ্ট করে না।

এখানে একটি আরো প্রাকৃতিক অ্যালগরিদম আমি বাস্তবায়িত (কিন্তু গলফ না) এর অ্যাপ্লিকেশন 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

ধারণাটি মূলত তার দৈর্ঘ্যের দুটি-পাওয়ার উপাদানগুলির উপর ভিত্তি করে স্ট্রিংকে বিভক্ত করা এবং তারপরে শূন্যকে উপস্থাপনকারী অনুপস্থিত উপাদানগুলির সাথে ক্ষেত্র হিসাবে বিবেচনা করা হবে এবং প্রতিটি অনুপস্থিত উপাদান 1 থেকে 256 ^ n পর্যন্ত সংখ্যা উপস্থাপন করে, সুতরাং 256 ^ n + 1 টি মোট মান। তারপরে এই উপস্থাপনাগুলি উপাদান অনুসারে মডুলো 256 ^ n + 1 যোগ করা যেতে পারে।

দ্রষ্টব্য: এই লুয়া বাস্তবায়নে 7 টিরও বেশি আকারের স্ট্রিংয়ের জন্য সংখ্যাযুক্ত ওভারফ্লো সমস্যা থাকবে But

এটি অনলাইন চেষ্টা করুন!


মজাদার ঘটনা: যেহেতু প্রতিটি উপাদান তার নিজস্ব বিপরীত হয়, তাই এই গ্রুপটিও আবেলীয়।
গম উইজার্ড

4

জেলি , 8 বাইট

‘ḅ⁹^/ḃ⁹’

এই ব্যবহারের একটি bijective ম্যাপিং φ অ নেতিবাচক পূর্ণসংখ্যার থেকে বাইট অ্যারে থেকে 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 না, এর সংখ্যা bijective 1 256 করার জন্য (সহ) থেকে বেস 256 পরিসীমা।
ডেনিস

তাই ḅ⁹থেকে bijective বেস 256 পূর্ণসংখ্যা কিভাবে? কি দেয় A+A? chr(-1)?
তিতাস

@ টিটাস বেস-টু-ইন্টিজার রূপান্তর প্রক্রিয়াটি বাইজেক্টভ এবং "সাধারণ" বেসগুলির জন্য অভিন্ন। [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)আরও একটি বাঁচায়
লিন

@ লিন কি দ্বিতীয়টি বড় ডি এর জন্য কাজ করতে চলেছে?
নীল

স্ট্রিংগুলি একই দৈর্ঘ্যের না হলে কীভাবে এটি কাজ করবে?
গম উইজার্ড

@ ওয়েট উইজার্ড স্ট্রিংগুলির দৈর্ঘ্য অপ্রাসঙ্গিক। স্ট্রিংস সেট থেকে পূর্ণসংখ্যার সেটে একটি বাইজিক ম্যাপিং রয়েছে। এর পরে পূর্ণসংখ্যার মানগুলি 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")
তেহম্মি

: | ওহ না, এটি ঠিক করা এত ব্যয়বহুল হতে চলেছে
ASCII- কেবল

1 or=>1or
জাকারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.