লজিক গেটস সহ জেরিম্যান্ডারিং


16

সর্বাধিক ফাংশন হ'ল বুলিয়ান ফাংশন যা তিনটি বুলিয়ান ইনপুট নেয় এবং সর্বাধিক সাধারণটি দেয়। উদাহরণস্বরূপ, যদি maj(x,y,z)সংখ্যাগরিষ্ঠ ফাংশন হয় এবং Tসত্যকে Fচিহ্নিত করে এবং মিথ্যা চিহ্নিত করে:

maj(T,T,T) = T
maj(T,T,F) = T
maj(T,F,F) = F
maj(F,F,F) = F

এই প্রশ্নটি বুলিয়ান ফাংশনগুলি সংখ্যাগরিষ্ঠ ফাংশনের রচনা হিসাবে লেখার বিষয়ে উদ্বেগ প্রকাশ করে। সংখ্যাগরিষ্ঠ ফাংশনগুলির একটি 5-অ্যারি রচনার একটি উদাহরণ (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5))। এই ফাংশনটি এই নমুনা ইনপুট ভেক্টরগুলিতে নিম্নলিখিত আউটপুটটি প্রদান করে:

(T,T,F,F,F) => maj(T,T,maj(F,F,F)) = maj(T,T,F) = T
(T,F,T,T,F) => maj(T,F,maj(T,T,F)) = maj(T,F,T) = T
(T,F,T,F,F) => maj(T,F,maj(T,F,F)) = maj(T,F,F) = F
(F,F,F,T,T) => maj(F,F,maj(F,T,T)) = maj(F,F,T) = F

কার্য

এমন একটি প্রোগ্রাম লিখুন যা একটি ধনাত্মক পূর্ণসংখ্যা এন এবং দৈর্ঘ্য এন ভেক্টরগুলির বুলিয়ানগুলির একটি তালিকা এবং সংখ্যাগরিষ্ঠ গেটের একটি গাছকে আউটপুট দেয় যা যদি সম্ভব হয় তবে প্রদত্ত ভেক্টরগুলির সমস্ত ক্ষেত্রে সত্য হয়ে যায়। ফাংশন সীমাবদ্ধতার তালিকায় নয় ভেক্টরগুলিতে সত্য বা মিথ্যা প্রত্যাবর্তন করতে পারে।

  • ভেক্টরগুলির তালিকা আপনার পছন্দ মতো কোনও ফর্ম্যাটে ইনপুট হতে পারে। যদি আপনি পছন্দ করেন তবে ভেক্টরকে ইনপুট না দেওয়ার পরিবর্তে আপনি ভেক্টরের সত্য অবস্থানের তালিকাটি ইনপুট করতে পারেন। উদাহরণস্বরূপ, [TTF,TFT,FTT]বা [[T,T,F],[T,F,T],[F,T,T]]বা [[1,2],[1,3],[2,3]](সত্য অবস্থানের তালিকা) সব ঠিক আছে।

  • আউটপুট কোনও বৈধ ট্রি ফর্ম্যাট হতে পারে। উদাহরণস্বরূপ, maj(maj(x1,x2,x3),x4,x5)কাজ করে। আপনি সম্ভবত ভেরিয়েবলগুলির জন্য স্ট্যান্ড-ইন হিসাবে একক সংখ্যা ব্যবহার করতে চাইবেন [[1,2,3],4,5]। বিপরীত পোলিশ 123m45mএছাড়াও ঠিক আছে, উদাহরণস্বরূপ।

  • যদি কোনও ফাংশন কাজ করে না, আপনার প্রোগ্রামটির একটি ত্রুটি বা আউটপুট একটি মিথ্যা মান উত্পন্ন করা উচিত।

  • যদি এমন একাধিক ফাংশন কাজ করে তবে আপনার প্রোগ্রামটি সেগুলির কোনওটি ফিরিয়ে দিতে পারে। ফাংশনটি সরল করার প্রয়োজন নেই। উদাহরণস্বরূপ, maj(x1,x1,x2)বা x1সমতুল্য।

স্কোরিং

এটি কোড গল্ফ: বাইট জেতে সংক্ষিপ্ততম সমাধান।

পরীক্ষার কেস:

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

Input: 3, [TFF]
Output: 1 or [1,1,2] or [1,[1,2,2],[1,1,3]] or other equivalent

Input: 3, [TFF,FTF]
Output: Falsey or error (it's not possible)

Input: 3, [TTF,TFT]
Output: [1,2,3] or 1 or other equivalent

Input: 3, [TTF,TFT,FTT]
Output: [1,2,3] or [1,3,2] or other equivalent

Input: 4, [TTFF,TFTF,FFTT]
Output: Falsey or error

Input: 4, [TTTF,TTFT,TFTT,FTTT]
Output: [1, 2, 3] or [2,3,4], or many other options

Input: 5, [TTTFF,FTTFT,TFFFT]
Output: [1,[1,[1,2,5],[2,4,5]],3] or many other options 

Input: 6, [TTTFFF,FTFTTF,TFFTFT]
Output: [1, 2, 4] or [1, [1, 2, 4], [2, 3, 4]] or others

Input: 5, [TTTFF,TTFTF,TTFFT,TFTTF,TFTFT,TFFTT,FTTTF,FTTFT,FTFTT,FFTTT]
Output: [[1, [1, 3, 5], 4], [1, 2, [2, 4, 5]], [2, 3, [3, 4, 5]]] or others

Input: 7, [TTTTFFF,TTTFTFF,TTTFFTF,TTTFFFT,TTFTTFF,TTFTFTF,TTFTFFT,TTFFTTF,TTFFTFT,TTFFFTT,TFTTTFF,TFTTFTF,TFTTFFT,TFTFTTF,TFTFTFT,TFTFFTT,TFFTTTF,TFFTTFT,TFFTFTT,TFFFTTT,FTTTTFF,FTTTFTF,FTTTFFT,FTTFTTF,FTTFTFT,FTTFFTT,FTFTTTF,FTFTTFT,FTFTFTT,FTFFTTT,FFTTTTF,FFTTTFT,FFTTFTT,FFTFTTT,FFFTTTT]
Output: [[[1, [1, [1, 4, 7], 6], 5], [1, [1, 3, [3, 6, 7]], [3, 5, [5, 6, 7]]], [3, 4, [4, [4, 5, 7], 6]]], [[1, [1, [1, 4, 7], 6], 5], [1, 2, [2, [2, 5, 7], 6]], [2, [2, 4, [4, 6, 7]], [4, 5, [5, 6, 7]]]], [[2, [2, [2, 4, 7], 6], 5], [2, 3, [3, [3, 5, 7], 6]], [3, [3, 4, [4, 6, 7]], [4, 5, [5, 6, 7]]]]]

"সংখ্যাগরিষ্ঠ ফাংশনের 5-অ্যারি রচনাটি (এক্স 1, এক্স 2, এক্স 3, এক্স 4, এক্স 5) => মাজ (এক্স 1, এক্স 2, মাজ (এক্স 3, এক্স 4, এক্স 5))" কীভাবে? X1 = x2 = F হলে উত্তরটি কী হবে; X3 = X4 = X5 = টি; ?
tsh

আমি একটি সত্য টেবিল যোগ করব।
হুড

1
1 এর আউটপুট বলতে কী বোঝায়?
এমএমএইচএমড

2
প্রস্তাবিত শিরোনাম: লজিক গেটগুলির সাথে গেরিম্যান্ডারিং
রবার্ট ফ্রেজার

1
@ ট্রাইকোপল্যাক্স নং, বাকি সমস্ত ভেক্টরের আউটপুট যে কোনও কিছু হতে পারে। আমি তা স্পষ্ট করতে আপডেট করব।
হুড

উত্তর:


2

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

বুলিয়ানগুলির অ্যারের অ্যারে হিসাবে ইনপুট নেয়। 1 ইনডেক্সযুক্ত সংখ্যাগরিষ্ঠ গেটের একটি গাছ ফেরত দেয় বা পুনরাবৃত্তি ত্রুটি ছুড়ে ফেলে (1) কোনও সমাধান না থাকলে ।

মূল ফাংশন এফ () পুনরাবৃত্তভাবে সলভার এফ () কল করে এবং প্রতিটি পুনরাবৃত্তিতে সর্বাধিক নীড় স্তর স্তরের এম বাড়িয়ে সমাধান সমাধানের চেষ্টা করে ।

(1) একটি দীর্ঘ সময় পরে , এবং অসীম স্মৃতি ধরে

f=(a,m)=>(F=(a,d,I=a[i=0].map(_=>++i),g=(a,b)=>b[1]?b.reduce((s,i)=>s+g(a,i),0)>1:a[b-1])=>I.find(i=>a.every(a=>g(a,i)))||d&&(I.reduce((a,x)=>[...a,...a.map(y=>[...y,x])],[[]]).some(b=>r=b.length==3&&F(a.map(a=>[...a,g(a,b)]),d-1,[...I,b]))&&r))(a,m)||f(a,-~m)

ডেমো

উদাহরণ

নীচে ডেমোর সর্বশেষ পরীক্ষার কেসটির জন্য পাওয়া সমাধানের একটি বৈধতা সারণী রয়েছে।

12345 | [5,[1,2,4],[3,4,[1,2,3]]]
------+-------------------------------------------------------------
TTTFF | [F,[T,T,F],[T,F,[T,T,T]]] --> [F,T,[T,F,T]] -> [F,T,T] --> T
TTFTF | [F,[T,T,T],[F,T,[T,T,F]]] --> [F,T,[F,T,T]] -> [F,T,T] --> T
TTFFT | [T,[T,T,F],[F,F,[T,T,F]]] --> [T,T,[F,F,T]] -> [T,T,F] --> T
TFTTF | [F,[T,F,T],[T,T,[T,F,T]]] --> [F,T,[T,T,T]] -> [F,T,T] --> T
TFTFT | [T,[T,F,F],[T,F,[T,F,T]]] --> [T,F,[T,F,T]] -> [T,F,T] --> T
TFFTT | [T,[T,F,T],[F,T,[T,F,F]]] --> [T,T,[F,T,F]] -> [T,T,F] --> T
FTTTF | [F,[F,T,T],[T,T,[F,T,T]]] --> [F,T,[T,T,T]] -> [F,T,T] --> T
FTTFT | [T,[F,T,F],[T,F,[F,T,T]]] --> [T,F,[T,F,T]] -> [T,F,T] --> T
FTFTT | [T,[F,T,T],[F,T,[F,T,F]]] --> [T,T,[F,T,F]] -> [T,T,F] --> T
FFTTT | [T,[F,F,T],[T,T,[F,F,T]]] --> [T,F,[T,T,F]] -> [T,F,T] --> T

একটি কার্যকর সমাধান আছে, যা আশা করি কেউ খুঁজে পাবেন। এরই মধ্যে, আমি অনুমান করি নিষ্ঠুর বলের ধরণের কাজগুলি ...
হুড

2

গণিত, 121 বাইট

একটি বেনামে ফাংশন যা বুলিয়ান্স ভেক্টরের সত্যিকারের অবস্থানের তালিকার তালিকা হিসাবে এটির দ্বিতীয় যুক্তি গ্রহণ করে।

f[n_][s_]:=If[n<3,(Intersection@@s)[[1]],{#/. 2->1,#2/.{2->1,3->2},#3}&@@(1+f[n-1]/@(s-1/.{{0->1},{1->2,0->1},{0->2}}))]

সামান্য সুন্দর বিন্যাসিত:

f[n_][s_] := If[n < 3, (Intersection @@s)[[1]],
   {# /. 2 -> 1, #2 /. {2 -> 1, 3 -> 2}, #3} & @@ 
    (1 + f[n - 1] /@ (s - 1 /. {{0 -> 1}, {1 -> 2, 0 -> 1}, {0 -> 2}}))]

যদি তিনটিরও কম ভেরিয়েবল থাকে তবে সমস্ত সীমাবদ্ধতার মধ্যে একটি সাধারণ "সত্য" আছে কিনা তা দেখতে সীমাবদ্ধ ভেক্টরগুলিকে ছেদ করুন। যদি এটির একটি থাকে তবে ধ্রুবক ফাংশন (x_1, x_2) -> x_i কাজ করে, অন্যথায় এটি অসম্ভব (এবং একটি খালি তালিকার প্রথম উপাদানটি নেওয়ার চেষ্টা করে ত্রুটি নিক্ষেপ করবে)।

অন্যথায়, বিকল্প f1=f(x1,x1,x2,x3,,xn1) , f2=f(x1,x2,x2,x3,,xn1) , এবং f3=f(x1,x2,x1,x3,,xn1)) , এগুলির প্রতিটি পুনরাবৃত্তভাবে সমাধান করুন, তারপরে এফ = এম সেট করুন ( এফ 1 ( এক্স 1 , এক্স 3 , এক্স 4 , , এক্স এন ) , এফ 2 ( এক্স 1 , এক্স 2 , এক্স 4 , , এক্সf=maj(f1(x1,x3,x4,,xn),f2(x1,x2,x4,,xn),f2(x2,x3,x4,,xn))

ব্যাখ্যা:

এটি একটি পুনরাবৃত্তিমূলক অ্যালগরিদম যা n - 1 ভেরিয়েবল সমস্যার তিনটি সমাধান সন্ধান করার জন্য একটি n ভেরিয়েবল সমস্যার সমাধান অনুসন্ধানের সমস্যা হ্রাস করে । এই কাজটি করে এমন মূল পর্যবেক্ষণটি হ'ল f এর জন্য আমরা যে ফাংশনগুলির সন্ধান করছি তার মধ্যে রয়েছে: f ( x 1 , , x n ) = m a j ( f ( x 1 , x 1 , x 3 , x 4) , , এক্স এনn1ff(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,),f(x3,x2,x3,))

প্রথম অবস্থানে, আমরা x2 সাথে x1 , দ্বিতীয় অবস্থানে x3 সাথে x2 এবং তৃতীয় অবস্থানে x1 সাথে x3 স্থান পেয়েছি ।

একবার আপনি এই পরিচয়টি জানার পরে, অ্যালগরিদম স্পষ্ট: যখন দুটি বা তার চেয়ে কম ভেরিয়েবল হয়, তখন সমস্যাটি তুচ্ছ। অন্যথায়, যাও recursively প্রতিনিধিত্বমূলক তিনটি সমস্যার সমাধানের f(x1,x1,x3,x4,,xn) , f(x1,x2,x2,x4,,xn) , এবং f(x3,x2,x3,x4,,xn)) এবং তাদের বেশিরভাগ অংশ গ্রহণ করুন।

এটা সত্য কেন? বেশিরভাগ ফাংশন দুটি বৈশিষ্ট্য সন্তুষ্ট করে:

  1. !xxmaj(!x,!y,!z)=!maj(x,y,z)

  2. maj(x,y,False)maj(x,y,True)FalseTrue(x1,,xn)(y1,,yn) if xiyi for all i, then I say a function f is monotonic if (x1,xn)(y1,,yn) implies f(x1,xn)f(y1,,yn). The composition of monotonic functions is monotonic so every function we can build out of the majority function is monotonic.

It turns out that complementary monotonic functions are exactly the class of functions that can be built out of majority gates.

Now, we show that for f a complementary monotonic function, our identity holds: f(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,x4,,xn),f(x3,x2,x3,x4,,xn))

Let's set f1(x1,x2,x3,,xn)=f(x1,x1,x3,x4,,xn), f2(x1,,xn)=f(x1,x2,x2,x4,,xn) and f3(x1,,xn)=f(x3,x2,x3,x4,,xn). To show that f=maj(f1,f2,f3), we need to show that for any input, at least two of f1, f2, and f3 are equal to f. We divide up into cases based on the values of x1, x2 and x3. If x1=x2=x3 then f1=f2=f3=f.

Suppose not all of x1, x2, and x3 are the same. By permuting the variables of f, we can assume that x1=x2 and x3 is different and because f is complementary, it suffices to deal with the case x1=x2=False and x3=True. In this case, (x1,x1,x3)=(False,False,True)=(x1,x2,x3), (x1,x2,x2)=(False,False,False)(x1,x2,x3) and (x3,x2,x3)=(True,False,True)(x1,x2,x3). By monotonicity we deduce that f2f1=ff3. If f=False then f2False implies f2=False=f and if f=True then f3True implies f3=True. Thus, at least two of f1, f2, and f3 are equal to f in all cases so f=maj(f1,f2,f3).

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