বিপরীত এক্সওর গণনা করুন


13

চলুন fযে ফাংশনটি {0 1}আকারের একটি বিটফিল্ড ( ) মাপের n+1বিটফিল্ডকে মঞ্চের বিটফিল্ডে মঞ্চ দিন এবং তম এবং বিটটিতে nপ্রয়োগ XORকরে এবং নতুন বিটফিল্ডে ফলাফল লিখে।ii+1

উদাহরণ: f("0101") = "111"

অনানুষ্ঠানিক গণনা:

0 XOR 1 = 1

1 XOR 0 = 1

0 XOR 1 = 1

f_inverseএর বিপরীত ফাংশন করা যাক f। বিপরীতটি অনন্য নয় বলে f_inverseএকটি বৈধ সমাধান দেয়।

ইনপুট: স্ট্রিং হিসাবে বিটফিল্ড (যেমন "0101111101011") এবং প্রদত্ত প্রাকৃতিক সংখ্যাk

আউটপুট: স্ট্রিং হিসাবে বিটফিল্ড, যাতে স্ট্রিংটিতে ফলাফল থাকে যদি ইনপুট বিটফিল্ডে সময় f_inverseপ্রয়োগ kকরা হয়। (অর্থাত্ f_inverse(f_inverse(f_inverse(input))))

জয়ের মানদণ্ড: স্বল্পতম অক্ষর

বোনাস:

-25অক্ষরগুলি যদি f_inverseপুনরাবৃত্তভাবে / পুনরাবৃত্তভাবে প্রয়োগ না করা হয় তার পরিবর্তে আউটপুট স্ট্রিংটি সরাসরি গণনা করা হয়

Testscript:

a = "011001"
k = 3

def f(a):
    k = len(a)
    r = ""
    for i in xrange(k-1):
        r += str(int(a[i]) ^ int(a[i+1]))
    return r

def iterate_f(a, k):
    print "Input ", a
    for i in xrange(k):
        a = f(a)
        print "Step " + str(i+1), a

iterate_f(a, k)

আপনি উদাহরণস্বরূপ এটি এখানে পেস্ট করতে পারেন এবং তারপরে এটি চেষ্টা করে দেখতে পারেন।


3
আপনি যাচাই করার জন্য কিছু পরীক্ষার কেস দিতে পারেন।
অপ্টিমাইজার

3
আপনি কি তাদের - {0-1}বিটফিল্ড কল করা বন্ধ করতে পারেন? এছাড়াও আমি সংজ্ঞাটি বুঝতে পারি না f, iকোথা থেকে এসেছে? এক্সওর-এর দ্বিতীয় যুক্তি কী? আমরা পেতে পারি 111থেকে 0101?
mniip

এর চেয়ে ভাল নাম কী? আমি সূচকটি বোঝায়
এনভিডিয়া

কেবল একটি "বিটফিল্ড" করবে। এর / মান / কত i? "0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1কোনও কিছুর ব্যাখ্যা দেয় না: আমি জানি কীভাবে এক্সওআর কাজ করে তবে আমরা কী জোরিং করছি এবং ফলাফলটি কোথায় সংরক্ষণ করছি?
mniip

9
আমি মনে করি তিনি অর্থ: f([a,b,c,d]) = [a^b, b^c, c^d]। তিনি যে ফাংশনের বিপরীত, অর্থাৎ চায় f'([x,y,z]) = [a,b,c,d]যেমন যে a^b=x, b^c=y, c^d=z
মেরিনাস

উত্তর:


14

Pyth, 33 30 - 25 = 5 বাইট

Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ

এটি স্টিডিনের মতো ইনপুট দ্বারা চালান (অনলাইন দোভাষী: https://pyth.herokuapp.com/ ):

111
3

এবং ফলাফল stdout লিখিত হবে।

এটি সরাসরি অনুবাদ:

পাইথন 2, 127 118 79 - 25 = 54 বাইট

def i(s,k):
 l=int(s,8);t=len(s)+k
 while k<1<<t:l^=l/8;k+=1
 print'%0*o'%(t,l)

এটিকে কল করুন i("111", 3)এবং ফলাফলটি স্টডআউটে লেখা হবে।

নোট করুন যে আমরা আশা করি কে খুব বেশি বড় হবে না, যেহেতু কোড-গল্ফিংয়ের উদ্দেশ্যে অভ্যন্তরীণ লুপটি ও (2 কে ) বারের জন্য চলবে ।


আমি মনে করি আমরা সাধারণত এই অপারেশনটিকে "xorshift" বা কিছু বলি। আমরা যদি ইনপুটটিকে বড়-এন্ডিয়ান পূর্ণসংখ্যার হিসাবে প্রকাশ করি, তবে ফাংশনটি সহজভাবে:

  • f (x) = x ⊕ (x ≫ 1)

আমরা দুবার প্রয়োগ করলে আমরা পাবেন:

  • f 2 (x) = x ⊕ (x ≫ 2)

তবে 3 বার প্রয়োগ করার ক্ষেত্রে আলাদা প্যাটার্ন থাকবে:

  • f 3 (x) = x ⊕ (x ≫ 1) ⊕ (x ≫ 2) ⊕ (x ≫ 3)

4 বার প্রয়োগ করে মূল ফর্মটিতে ফিরে যান:

  • f 4 (x) = x ⊕ (x ≫ 4)

এবং আরও:

  • f 2 k (x) = x ⊕ (x ≫ 2 কে )

মনে রাখবেন যে আমরা যদি বড় পরিমাণে 2 কে বেছে নিই , তবে (x ≫ 2 কে ) = 0, অর্থ f 2 কে (এক্স) = এক্স, এবং বিপরীতটি তুচ্ছভাবে পরিচয় ফাংশন!

চ খোঁজার জন্য কৌশল তাই -k কলিং চ ছাড়া (x) এর -1 (x) এর এ সব হল:

  1. কে এমন সন্ধান করুন যে:

    • কে ≥ কে
    • কে> লগ 2 এক্স
    • কে 2 এর শক্তি
  2. এক্সপ্রেস চ -k (x) এর = চ -K + + (গান Kk) (x) এর = চ -K (চ গান Kk (x) এর) = চ গান Kk (x) এর

  3. সুতরাং, ফলাফল কে fকে বার বলা হয়

  4. 25 অক্ষর লাভ: পি


আপডেট 1 : বাইনারি পরিবর্তে অষ্টাল প্রতিনিধিত্ব ব্যবহৃত যাতে আমরা %প্রচুর বাইট সংরক্ষণ করতে ফর্ম্যাটিং ব্যবহার করতে পারি ।

আপডেট 2 : এর পর্যায়ক্রমিক কাঠামোটি শোষণ করুন f। পুনরাবৃত্ত সংস্করণটি অবসর নিয়েছে কারণ অ-পুনরাবৃত্তিটি -২২ বাইট বোনাস ছাড়াই ছোট হয়।

আপডেট 3 : পাইথ থেকে 3 বাইট হ্রাস করা হয়েছে, ধন্যবাদ ইসাক!


টিপসগুলিতে বর্ণিত হিসাবে: কোডগল্ফ.স্ট্যাকেক্সেক্সঞ্জ.com / a / 45280 / 20080 আপনি লুপ এবং অ্যাসাইনমেন্টগুলির জন্য একটি হ্রাস দ্বারা প্রতিস্থাপন করতে পারেন, এর মতো:Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
আইসএএاکজি

11

সিজেম, 15 14 বাইট

l~{0\{1$^}/]}*

ইনপুট লাগে

"111" 3

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

l~{0\{1$^}/]}*
l~             "Read and evaluate input.";
  {         }* "Repeat k times.";
   0\          "Push a 0 and swap it with the string/array.";
     {   }/    "For each element in the string/array.";
      1$       "Copy the previous element.";
        ^      "XOR.";
           ]   "Wrap everything in a string/array again.";

ফলাফলটি স্বয়ংক্রিয়ভাবে প্রোগ্রামের শেষে মুদ্রিত হয়।

আমি "স্ট্রিং / অ্যারে" বলি, কারণ আমি একটি স্ট্রিং দিয়ে শুরু করি (যা কেবলমাত্র অক্ষরের অ্যারে) তবে আমি তাদের মধ্যে এবং সংখ্যার মধ্যেও এক্সওআর নিতে থাকি। Character Character ^একটি পূর্ণসংখ্যা দেয় (কোড পয়েন্টগুলির XOR এর উপর ভিত্তি করে) Character Integer ^এবং Integer Character ^একটি অক্ষর দেয় (কোড পয়েন্ট সহ সংখ্যার XOR এর উপর ভিত্তি করে - কোড পয়েন্ট হিসাবে ব্যাখ্যা করা হয়)। এবং Integer Integer ^অবশ্যই কেবল একটি পূর্ণসংখ্যা দেয়।

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


সিজেমে চরিত্র / সংখ্যা টাইপের আচরণ সম্পর্কে আপনার দুর্দান্ত ব্যাখ্যা আমাকে আমার সমাধান বন্ধ করে একটি বাইট শেভ করতে দেয় 25 - 25 = 0 বাইটে পৌঁছে। ধন্যবাদ, এবং +1!
ইলমারি করোনেন

2
এই জাতীয় আচরণ হ'ল ভয়ঙ্কর (+1)।
বলস্টে 25

8

জে, 17 অক্ষর

সর্বদা 0 ব্যবহার করে অগ্রণী সংখ্যা হিসাবে।

   (~:/\@]^:[,~[$0:)

   3 (~:/\@]^:[,~[$0:) 1 1 1 
0 0 0 1 0 0

শীর্ষ সারির 128 1 এর রাজ্য (বাম) এবং একটি এলোমেলো অবস্থা (ডান) থেকে শুরু করে প্রথম 129 পুনরাবৃত্তির মাধ্যমে শেষ 128 সংখ্যা দেখায়।

   viewmat (~:/\)^:(<129) 128$1               viewmat (~:/\)^:(<129) ?128$2

পটভূমি পটভূমি


6

এপিএল 11

((0,≠\)⍣⎕)⎕

ব্যাখ্যা:

≠\  compare increasing number of elements (1 1 1 ->1 0 1)
0,    add a starting zero
()⍣⎕  repeat the function in parenthesis ⎕ times, ⎕ is the second argument
()⎕   apply all to ⎕, that is first argument

Tryapl.org এ চেষ্টা করুন


এটি ট্রাইপলটিতে চালাতে পারেনি (আপনি কীভাবে ইনপুট দেবেন?) তবে এর ≠\ পরিবর্তে 2|+\ কী কাজ করবে না ?
এলোমেলো

হ'ল ইনপুটস, আপনি যদি লিখেছেন একই এক্সপ্রেশনটি ব্যবহার করেন, প্রোগ্রামটি আপনাকে প্রথমে বাইনারি ভেক্টর, তারপরে পুনরাবৃত্তির সংখ্যার জন্য দ্বিতীয় বারের মতো আপনার সংখ্যাগুলির জন্য জিজ্ঞাসা করবে। আমি ট্রাইপল লিঙ্কে a এবং b ব্যবহার করেছি, সুতরাং এটি জিজ্ঞাসা না করেই কার্যকর করা হয়েছে। এছাড়াও for \ জন্য ধন্যবাদ!
মরিস জুকা

আমি যদি অনুলিপি ((0,≠\)⍣⎕)⎕করি তবে আমি অবৈধ টোকেন পাই। ট্রাইপল ইনপুট পরিচালনা করতে পারে না?
এলোমেলো

1
হুমমমম ... তুমি ঠিক বলেছো আমার সাথেও তাই হচ্ছে। আমি ডায়ালগ এপিএল ব্যবহার করছি এবং তারপরে কেবল পোস্ট করার জন্য ট্রাইপল, তাই আমি কখনই লক্ষ্য করিনি, সে সম্পর্কে দুঃখিত sorry
মরিস জুকা

5

সিজেএম, 25 - 25 = 0 বাইট

q~1,*_@{[\{1$^}/_](;)\}/;

এটি নীচের গল্ফস্ক্রিপ্ট উত্তরের সরাসরি একটি সিজাম বন্দর, যেহেতু মার্টিন বাটনার এর উত্তর পড়ার পরে আমি বুঝতে পেরেছিলাম যে সিজেমের পূর্ণসংখ্যা এবং চরিত্রের ধরণের পরিচালনা করার কারণে আমি একটি বাইট সংরক্ষণ করতে পারি। (মূলত, গল্ফস্ক্রিপ্ট কোডে 1&ASCII অক্ষরগুলিকে বিট করার জন্য সিজেমের ব্যবহারের প্রয়োজন হয় না , তবে qইনপুটটি পড়ার জন্য একটি প্রেন্টেন্টের প্রয়োজন হয় such ) আমি সাধারণত এ জাতীয় তুচ্ছ বন্দরটিকে একটি সস্তা কৌশল হিসাবে বিবেচনা করব তবে শূন্য স্কোর অর্জন করতে পারব I এটি আইএমও সার্থক।

যাইহোক, এই প্রোগ্রামটি নীচের মূল গল্ফস্ক্রিপ্ট প্রোগ্রামের মতো কাজ করে, সুতরাং দয়া করে এর বিবরণ এবং ব্যবহারের নির্দেশাবলী দেখুন। যথারীতি, আপনি এই অনলাইন দোভাষী ব্যবহার করে সিজেএম সংস্করণ পরীক্ষা করতে পারেন ।


গল্ফস্ক্রিপ্ট, 26 - 25 = 1 বাইট

~1,*.@{[1&\{1$^}/.](;)\}/;

এই সমাধানটি কেবল একবার ইনপুট স্ট্রিংয়ের মাধ্যমে পুনরাবৃত্তি করে, তাই আমি বিশ্বাস করি এটি −25 বাইট বোনাসের জন্য যোগ্যতা অর্জন করে। এটি অভ্যন্তরীণভাবে একটি কে- এলিমেন্ট অ্যারে বজায় রেখে কাজ করে যা প্রতিটি কে -প্রাক-পুনরাবৃত্তির বর্তমান বিট সঞ্চয় করে ।

স্ট্যান্ডিনের মাধ্যমে ইনপুট দেওয়া উচিত, বিন্যাসে "1111111" 3, অর্থাত্ কোট করা স্ট্রিং 0এবং 1অক্ষর হিসাবে, তার পরে k সংখ্যাটি । উদ্ধৃতি ছাড়াই বিটস্ট্রিং হিসাবে আউটপুট স্টাডাউট হবে।

এই কোডটি অনলাইনে পরীক্ষা করুন। (যদি প্রোগ্রামটি শেষ হয়ে যায় তবে এটি আবার চালানোর চেষ্টা করুন; ওয়েব গল্ফস্ক্রিপ্ট সার্ভারটি এলোমেলো সময়সীমার জন্য কুখ্যাত is


মন্তব্যগুলির সাথে এই প্রোগ্রামটির একটি প্রসারিত সংস্করণ এখানে রয়েছে:

~             # eval the input, leaving a string and the number k on the stack

1,*           # turn the number k into an array of k zeros ("the state array")
.             # make a copy of the array; it will be left on the stack, making up the
              # first k bits of the output (which are always zeros)

@             # move the input string to the top of the stack, to be iterated over
{
  [           # place a start-of-array marker on the stack, for later use
  1&          # zero out all but the lowest bit of this input byte
  \           # move the state array to the top of the stack, to be iterated over

  { 1$^ } /   # iterate over each element of the state array, XORing each
              # element with the previous value on the stack, and leave
              # the results on the stack

  .           # duplicate the last value on the stack (which is the output bit we want)
  ]           # collect all values put on the stack since the last [ into an array
  (;          # remove the first element of the array (the input bit)
  )           # pop the last element (the duplicated output bit) off the array
  \           # move the popped bit below the new state array on the stack
}
/             # iterate the preceding code block over the bytes in the input string

;             # discard the state array, leaving just the output bits on the stack

মূলত, বেশিরভাগ পুনরাবৃত্ত সমাধানগুলির মতো, এই কোডটি পুনরাবৃত্তিটি প্রয়োগ করে বোঝা যায়

        i , j : = b i , ( j −1)b ( i −1), ( j −1) ,

যেখানে b 0, j হ'ল j -th ইনপুট বিট ( j ≥ 1 এর জন্য), b k , j হ'ল j -th আউটপুট বিট, এবং b i , 0 = 0 অনুমান দ্বারা। পার্থক্যটি হ'ল, যদিও পুনরাবৃত্ত সমাধানগুলি কার্যকরভাবে পুনরাবৃত্তিটি "সারি সারি সারি" গণনা করুন (অর্থাত্ প্রথম 1, জে সমস্ত জে , তারপরে বি 2, , ইত্যাদি), এই সমাধানটি পরিবর্তে এটি দ্বারা কলামটি গণনা করে কলাম "(বা আরও সঠিকভাবে," তির্যক দ্বারা তির্যক "), প্রথম গণনা i , i এর জন্য 1 ≤ iকে , তারপরে বি i , i +1 , তারপরে বি i , i +2 ইত্যাদি

এই পদ্ধতির একটি (তাত্ত্বিক) সুবিধা হ'ল, নীতিগতভাবে, এই পদ্ধতিটি কেবল ও ( কে ) স্টোরেজ ব্যবহার করে একটি নির্বিচারে দীর্ঘ ইনপুট স্ট্রিং প্রক্রিয়া করতে পারে । অবশ্যই, গল্ফস্ক্রিপ্ট ইন্টারপ্রেটার স্বয়ংক্রিয়ভাবে প্রোগ্রাম চালানোর আগে সমস্ত ইনপুট মেমরির মধ্যে পড়ে, বেশিরভাগই এই সুবিধাটিকে তুচ্ছ করে।


2

পাইথন, 94 78

কমপক্ষে একবার মৃত্যুদন্ড কার্যকর করা হবে এবং এভাবে n=0এবং এর জন্য একই ফলাফল দেয়n=1

def f(x,n):
 c='0'
 for i in x:c+='10'[i==c[-1]]
 return f(c,n-1)if n>1 else c

পুরানো সংস্করণ যা স্ট্রিংটিকে একটি সংখ্যাসূচক অ্যারে রূপান্তরিত করে এবং মডুলো 2 "সংহত" করে

from numpy import*
g=lambda x,n:g(''.join(map(str,cumsum(map(int,'0'+x))%2)),n-1)if n>0 else x

2

পাইথন 2, 68

g=lambda l,n,s=0:n and g(`s`+(l and g(l[1:],1,s^(l>='1'))),n-1)or l

একটি সম্পূর্ণ recusive সমাধান। দুটি ফাংশনে বিভক্ত হলে এটি বোঝা সহজ

f=lambda l,s=0:`s`+(l and f(l[1:],s^(l>='1')))
g=lambda l,n:n and g(f(l),n-1)or l

যেখানে fএকের পর এক পার্থক্য গণনা করে এবং নিজের সাথে এন gটাইপ fকরে।

ফাংশনটি fক্রমযুক্ত এক্সওআরএস-এর অঙ্কগুলি গণনা করে l, যা ক্রমাগত এক্সওর-পার্থক্যের বিপরীত ক্রিয়াকলাপ। যেহেতু ইনপুটটিকে স্ট্রিং হিসাবে দেওয়া হয় int(l[0]), তাই আমাদের নিষ্কাশন করতে হবে , তবে স্ট্রিং তুলনা করে আরও খাটো করা l>='1'


পাইথন 2, 69

একটি execলুপ ব্যবহার করে একটি পুনরাবৃত্তি সমাধানটি 1 চরের লম্বা হয়ে উঠল।

l,n=input()
exec"r=l;l='0'\nfor x in r:l+='10'[l[-1]==x]\n"*n
print l

স্ট্রিং মোকাবেলা করার জন্য একটি ছোট উপায় থাকতে পারে। আমরা যদি ইনপুট / আউটপুট সংখ্যার তালিকা হতে পারি তবে এটি 5 টি অক্ষর বাঁচাতে পারে

l,n=input()
exec"r=l;l=[0]\nfor x in r:l+=[l[-1]^x]\n"*n
print l

1

পার্ল 5, 34

#!perl -p
s/ .*//;eval's/^|./$%^=$&/eg;'x$&

একটি স্পেস দ্বারা পৃথক স্ট্যান্ডার্ড ইনপুটটিতে দেওয়া প্যারামিটার।

$ perl a.pl  <<<"1101 20"
101111011011011011010110

1

জাভাস্ক্রিপ্ট ES6, 47 টি অক্ষর

f=(s,k)=>k?f(0+s.replace(s=/./g,x=>s^=x),--k):s

যাইহোক, কোনও পার্শ্ব প্রতিক্রিয়া নেই :)


পুনরাবৃত্তির সংখ্যার জন্য আপনাকে আক প্যারামিটার গ্রহণ করতে হবে। (-২২ বোনাসটি পুনরাবৃত্তির ফলাফলকে গণনা করার জন্য যা আসলে পুনরাবৃত্তি না করেই করা হয়।)
ব্রিলিয়ানড

আমার স্পেসিফিকেশনটি মনোযোগ সহকারে পড়তে হবে (ফেসপাল)
কিওয়ারটি

1

সি # - 178 161 115 টি অক্ষর

static string I(string a, int k){var s = "0";foreach(var c in a)s+=c==s[s.Length-1]?'0':'1';return k<2?s:I(s,--k);}

জোরে জোরে

using System;
using System.Text;

namespace InverseXOR
{
    class Program
    {
        static string I(string a, int k)
        {
            var s = "0";
            foreach (var c in a)
                s += c == s[s.Length - 1] ? '0' : '1';
            return k < 2 ? s : I(s, --k);
        }

        static void Main(string[] args)
        {
            Console.WriteLine(I(args[0], Convert.ToInt32(args[1])));
        }
    }
}

0

সিজোম, 20 বাইট

q~{:~0\{1$!_!?}/]s}*

ইনপুট মত "111" 3

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


"011001" আপনার ইনপুটটির কোড থেকে ফলাফল তবে এটি সঠিক নয় যদি আপনি চেক করেন
এনভিডিয়া

@ user3613886 দুঃখিত, পুরানো সংস্করণ অনুলিপি করেছেন। এখনই স্থির
অপ্টিমাইজার 13
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.