নিম গুণ


17

পটভূমি

আপনি যদি অনেকগুলি কোড গল্ফিং করেন তবে আপনি সম্ভবত বিটওয়াইস এক্সওআর অপারেশন সম্পর্কে সচেতন । দুটি পূর্ণসংখ্যার দেওয়া, এটি 1বিটের যেখানে দুটি ইনপুট পৃথক হয় সেখানে আরও একটি পূর্ণসংখ্যা দেয় । সুতরাং, উদাহরণস্বরূপ 1010 XOR 0011 = 1001,।

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

তবে আমরা এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে পারি। নিম সংযোজন এবং নিম গুণনের একটি যথাযথ সংজ্ঞা দিয়ে আমরা অণুগঠিত পূর্ণসংখ্যার ক্ষেত্র তৈরি করতে পারি। তাই চ্যালেঞ্জ হ'ল গল্ফ নিম গুণকে।

সংজ্ঞা

নিম গুণটি নীচের নিয়মগুলি মান্য করে:
কোনও ফার্মেট 2-পাওয়ার এন = (2 ^ (2 ^ কে)) এর কোনও ছোট সংখ্যার নিম পণ্যটি হ'ল সাধারণ পণ্য।
নিজের সাথে একটি ফার্ম্যাট ২-পাওয়ার এন এর নিম পণ্যটি 3n / 2।
নিম গুণকে নিম সংযোজনের উপর বিতরণ করে।
নিম গুণ হ'ল কমিটিকেটিভ এবং এসোসিয়েটিভ (যেমন নিম সংযোজন)।
গুণক পরিচয় 1 (এবং সংযোজনীয় পরিচয় 0)।

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

উদাহরণ

এটি ছিল বেশ বিমূর্ত, সুতরাং আসুন একটি উদাহরণ দিয়ে কাজ করা যাক। আমি +নিম সংযোজন (এক্সওআর) বোঝাতে এবং *নিম গুণনের জন্য ব্যবহার করব ।

6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15

অতিরিক্ত পরীক্ষার কেস

4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42

চ্যালেঞ্জ

কোনও প্রোগ্রাম বা ফাংশন লিখুন যা কোনও সুবিধাজনক আকারে দুটি নন-নেগেটিভ পূর্ণসংখ্যার দেওয়া হয়, তাদের নিম পণ্যটি গণনা করে।

এটি , তাই সংক্ষিপ্ততম জমাটি জয়ী।


1
যদি এটি পাঠকদের কাছে পরিষ্কার না হয় তবে এটি এক্সওআর (বহনবিহীন) গুণণের থেকে পৃথক, এবং সেই চ্যালেঞ্জটির সদৃশ নয়।
xnor

1
ওএআইএস-এ নিম গুণনের সারণী: A051775 , A051776 , A051910 , A051911
আরনাউল্ড


ফারম্যাট নম্বরগুলি 2 2 ^ (2 ^ কে) +1 ফর্মের হয়, তাই আপনি যেটাকে একটি ফার্ম্যাট নাম্বার কল করছেন তা আসলে একটি কম।
কেলি লোডার 20

@ কেলিলাউডার হ্যাঁ, এটি সত্যই একটি ফার্ম্যাট ২-শক্তি।

উত্তর:


8

নিম , 120 বাইট

proc f(a,b:int):int=
 var s={0..a*b}
 for i in 0..<a*b:s=s-{f(i%%a,i/%a)xor f(a,i/%a)xor f(i%%a,b)}
 for i in s:return i

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

ঠিক আছে, এটি পাগল হতে পারে তবে কাউকে নিমে নিম গুণ করতে হয়েছিল ...

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


2
আমি ভাবছিলাম কখন এটি চেষ্টা করবে।


4

জেলি , 16 বাইট

p’ß/;ß"^/ʋ€ṭ‘ḟ$Ṃ

নিমবার গুণনের জন্য পুনরাবৃত্ত সূত্র xy = mex ({ay ⊕ xb ⊕ ab: a <x, b <y}) ব্যবহার করে

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

কিভাবে এটা কাজ করে

p’ß/;ß"^/ʋ€ṭ‘ḟ$Ṃ  Main link. Left argument: x. Right argument: y.

p                 Cartesian product; yield the array of all pairs [a, b] such that
                  0 < a ≤ x and 0 < b ≤ y.
 ’                Decrement, changing the conditions to 0 ≤ a < x and 0 ≤ b < y.
          ṭ       Tack; yield [y, x].
        ʋ€        Combine the four links to the left into a dyadic chain. Call it
                  with right argument [y, x] and each of the [a, b] as left one.
  ß/                  Reduce [a, b] by the main link, computing the product ab.
     ß"               Zip [a, b] with [y, x] using the main link, computing the
                      array of products [ay, xb].
    ;                 Concatenate, yielding [ab, ay, xb].
       ^/             Reduce by bitwise XOR, yielding ab ⊕ ay ⊕ xb.
                  All that's left is to compute the minimum excluded (mex) non-
                  negative integer.
             $    Combine the two links to the left into a monadic chain.
           ‘          Increment the XOR sums.
            ḟ         Filterfalse; remove all incremented sums that appear in the
                      original sums.
              Ṃ  Take the minimum if the resulting array is non-empty or yield 0.
                 If x = 0 or y = 0, the array of sums is empty and Ṃ yields 0.
                 If x > 0 and y > 0, since 0 is among the sums, this finds the
                 smallest non-sum n+1 such that n ≥ 0 is a sum.
                 In either case, Ṃ yields xy.

4

CGSuite ,52 39 22 বাইট

(a,b)->a.NimProduct(b)

এটির অন্তর্নিহিত, এবং বেনামে "পদ্ধতি" আছে বুঝতে পারি নি।

আসল সংস্করণ, 36 বাইট:

(a,b)->*a.ConwayProduct(*b).NimValue

অথবা ইনপুট / আউটপুট নিমবার হতে পারে যদি 25 বাইট:

(a,b)->a.ConwayProduct(b)

ঠিক আছে, আমি আশা করেছি *a**b/ a*bকাজ করব, তবে তা হয় না।


কাজের জন্য অবশ্যই সঠিক সরঞ্জাম।

3

পাইথ , 21 বাইট

Mf-TsmmxxgkdgkHgGdGH0

প্রদর্শন

হিসেবে দেওয়া, Nim গুণ ন্যূনতম বাদ উপাদান তৈয়ার ব্যবহার এখানে

দুটি নেস্টেড মানচিত্র সমস্ত ছোট মান ( mm ... GH) এর উপরে পুনরাবৃত্তি করতে ব্যবহৃত হয় , তারপরে ফলাফলগুলি সমতল হয় ( s)। চতুর অংশটি আসে f-T ... 0, যেখানে আমরা উপরে বর্ণিত সেটটিতে অন্তর্ভুক্ত না থাকা প্রথমটি খুঁজে পেতে 0 থেকে wardর্ধ্বমুখী পূর্ণসংখ্যার উপর পুনরাবৃত্তি করি। এইভাবে করে, আমাদের কয়েকটি বাইট সংরক্ষণ করে ওপেন বাউন্ডের একটি পুনরাবৃত্তি গণনা করার দরকার নেই।

শেষ পর্যন্ত, ফাংশন gনিম পণ্যটি গণনা করে।


3

জাভাস্ক্রিপ্ট (ES6), 142 128 বাইট

f=(x,y,z=Math.log2,v=x&-x,t=z(x),u=z(y),s=t&u,r=s&-s)=>x<2|y<2?x*y:x>v?f(v,y)^f(x^v,y):y&y-1?f(y,x):r?f(f(x>>r,y>>r),3<<r-1):x*y
<div oninput=o.textContent=f(x.value,y.value)><input id=x><input id=y><pre id=o>

প্রথম পদক্ষেপ উভয় বিভক্ত হয় xএবং yশক্তি একজন XOR যাও মধ্যে 2, তাদের pairwise নেওয়া Nim পণ্য, এবং তারপর XOR যাও ফলাফল (কারণ XOR যাও উপর Nim পণ্য বিতরণ)। একবার আমরা 2 এর ক্ষেত্রে xএবং yউভয় শক্তির ক্ষেত্রে পুনরাবৃত্তি করেছিলাম , আমরা নোট করি যে ফার্মাট শক্তিগুলি সাধারণ গাণিতিক ব্যবহার করে একে অপরের সাথে বহুগুণে বৃদ্ধি পায়, সুতরাং আমরা ফলস্বরূপ xএবং yফার্মাট ক্ষমতাগুলিতে পরিণত করতে পারি । যদি xএবং yকোনও ফার্ম্যাট শক্তি ভাগ না করে আমরা প্রক্রিয়াটি বিপরীত করতে পারি এবং কেবল ফিরে আসতে পারি x * y। তবে যদি তারা একটি ফার্ম্যাট শক্তি ভাগ করে, তবে আমরা উভয়কে ভাগ করে xএবং yসেই শক্তি দ্বারা নিম পণ্যটি গণনা করি, তারপরে নিম পণ্যটি সেই ফার্ম্যাট শক্তির নিম স্কোয়ারের সাথে নিয়ে যাই। Ungolfed:

function nimprod(x, y) {
    if (x < 2 || y < 2) return x * y;
    var v = x & -x;
    if (x > v) return nimprod(v, y) ^ nimprod(x ^ v, y); // nimprod distributes over ^
    if (y & (y - 1)) return nimprod(y, x); // x is a power of 2 but y is not
    var t = Math.log2(x);
    var u = Math.log2(y);
    var s = t & u;
    if (!s) return x * y; // x and y do not share a Fermat power
    var r = s & -s;
    return nimprod(nimprod(x >> r, y >> r), 3 << r - 1); // square the Fermat power
}

1

ওল্ফ্রাম ভাষা (গণিত) , ৮১ বাইট a

x_±y_:=Min@Complement[Range[0,x*y],##&@@Array[BitXor[x±#2,#±y,±##]&,{x,y},0]]

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

সূত্র ব্যবহার:

αβ=মেক্স({α'β+ +αβ'+ +α'β':α'<α,β'<β})

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