Mantık Kapıları ile Gerrymandering


16

Çoğunluk işlevi, üç boole girişi alan ve en yaygın olanı döndüren bir boolean işlevidir. Örneğin maj(x,y,z), çoğunluk işlevi Tdoğruysa ve Fyanlış'ı gösterirse, o zaman:

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

Bu soru, çoğunluk işlevlerinin bileşimi olarak boole işlevlerinin yazılmasıyla ilgilidir. Çoğunluk fonksiyonlarının 5-ary kompozisyonuna bir örnek verilebilir (x1,x2,x3,x4,x5) => maj(x1,x2,maj(x3,x4,x5)). Bu işlev, bu örnek giriş vektörlerinde aşağıdaki çıktıyı döndürür:

(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

Görev

Pozitif bir tamsayı n ve booleanların uzunluk n vektörlerinin bir listesini girip, mümkünse verilen vektörlerin hepsinde doğru olan çoğunluk kapıları ağacını çıktılayan bir program yazın. İşlev, sınırlamalar listesinde olmayan vektörlerde doğru veya yanlış döndürebilir.

  • Vektörlerin listesi istediğiniz formatta girilebilir. İsterseniz, vektörü girmek yerine, vektördeki gerçek konumların listesini girebilirsiniz. Örneğin, [TTF,TFT,FTT]veya [[T,T,F],[T,F,T],[F,T,T]]veya [[1,2],[1,3],[2,3]](gerçek pozisyonların listesi) hepsi iyidir.

  • Çıktı geçerli herhangi bir ağaç biçimi olabilir. Örneğin maj(maj(x1,x2,x3),x4,x5)çalışır. Büyük olasılıkla, değişkenleri için olduğu gibi tek sayılar stand-in olarak kullanmak isteyeceksiniz [[1,2,3],4,5]. 123m45mÖrneğin, ters cila da uygundur.

  • Çalışan bir işlev yoksa, programınız bir hata oluşturmalı veya bir falsey değeri çıkarmalıdır.

  • Çalışan birden çok işlev varsa, programınız bunlardan herhangi birini döndürebilir. Fonksiyonun basitleştirilmesine gerek yoktur. Örneğin maj(x1,x1,x2)veya x1eşdeğerdir.

puanlama

Bu kod golf: Bayt en kısa çözüm kazanır.

Test senaryoları:

Bu durumların her biri için birçok olası çıkış olduğunu unutmayın, bu nedenle çıktınızı bir işleve dönüştüren bir denetleyici komut dosyası yazmalı ve işlevinizin belirtilen giriş vektörlerinin her birinde doğru olup olmadığını kontrol etmelisiniz.

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]]]]]

"Çoğunluk işlevlerinin 5-ary bileşimi (x1, x2, x3, x4, x5) => maj (x1, x2, maj (x3, x4, x5))" nasıl? X1 = x2 = F ise cevap ne olmalıdır; X3 = X4 = X5 = r- arasından seçilir; ?
tsh

Bir doğruluk tablosu ekleyeceğim.
Hood

1
1 çıktısı ne anlama geliyor?
Mhmd

2
Önerilen başlık: Mantık kapıları ile Gerrymandering
Robert Fraser

1
@trichoplax Hayır, kalan tüm vektörlerin çıktısı herhangi bir şey olabilir. Bunu açık hale getirmek için güncelleyeceğim.
Hood

Yanıtlar:


2

JavaScript (ES6), 260 bayt

Girdiyi boole dizisi dizisi olarak alır. 1 dizinli çoğunluk geçidi ağacını döndürür veya çözüm yoksa yineleme hatası (1) atar .

Ana f () işlevi , F () çözücüsünü çağırarak ve her yinelemede maksimum iç içe yerleştirme düzeyini m artırarak özyinelemeli bir çözüm bulmaya çalışır .

(1) uzun bir süre sonra ve sonsuz bellek varsayarak

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)

gösteri

Misal

Aşağıda, demonun son test durumu için bulunan çözümün bir doğrulama tablosu bulunmaktadır.

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

Birisinin umarım bulabileceği verimli bir çözüm vardır. Bu arada, sanırım kaba kuvvet gibi işler ...
Hood

2

Mathematica, 121 bayt

İkinci argümanını, booleans vektöründeki gerçek konumlar listelerinin bir listesi olarak alan anonim bir işlev.

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}}))]

Biraz daha hoş biçimlendirilmiş:

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}}))]

Üçten az değişken varsa, tüm kısıtlamalarda ortak bir "Doğru" olup olmadığını görmek için kısıtlama vektörlerini kesiştirin. Bir tane varsa, sabit işlev (x_1, x_2) -> x_i çalışır, aksi takdirde imkansızdır (ve boş bir listenin ilk öğesini almaya çalışarak bir hata atar).

f1=f(x1,x1,x2,x3,,xn1)f2=f(x1,x2,x2,x3,,xn1)f3=f(x1,x2,x1,x3,,xn1)) , bunların her birini tekrar tekrar çözün, sonraf=maj(f1(x1,x3,x4,,xn),f2(x1,x2,x4,,xn),f2(x2,x3,x4,,xn)) .

Açıklama:

nn1ff(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,),f(x3,x2,x3,))

Birinci konumda, x2 yerine x1 , ikinci konumda x3 ile x2 ve üçüncü konumda x1 ile x3 .

Bu kimliği öğrendikten sonra, algoritma açıktır: iki veya daha az değişken olduğunda, sorun önemsizdir. Aksi takdirde, f(x1,x1,x3,x4,,xn) , f(x1,x2,x2,x4,,xn) ve f(x3,x2,x3,x4,,xn)) ve bunların çoğunu alın.

Bu neden doğru? Çoğunluk işlevi iki özelliği karşılar:

  1. "Tamamlayıcı" dır. Bu, eğer !x olumsuzlanmasıdır x , o zaman maj(!x,!y,!z)=!maj(x,y,z) . Sonuç olarak, çoğunluk fonksiyonundan oluşturabileceğimiz her fonksiyon tamamlayıcıdır.

  2. maj(x,y,False)maj(x,y,True)FalseTrue(x1,,xn)(y1,,yn)xiyiif(x1,xn)(y1,,yn)f(x1,xn)f(y1,,yn). Monotonik fonksiyonların bileşimi monotoniktir, bu nedenle çoğunluk fonksiyonundan oluşturabileceğimiz her fonksiyon monotoniktir.

Tamamlayıcı monotonik fonksiyonların tam olarak çoğunluk kapılarından yapılabilecek fonksiyon sınıfı olduğu ortaya çıkıyor.

ff(x1,,xn)=maj(f(x1,x1,x3,x4,,xn),f(x1,x2,x2,x4,,xn),f(x3,x2,x3,x4,,xn))

f1(x1,x2,x3,,xn)=f(x1,x1,x3,x4,,xn)f2(x1,,xn)=f(x1,x2,x2,x4,,xn)f3(x1,,xn)=f(x3,x2,x3,x4,,xn)f=maj(f1,f2,f3)f1f2f3fx1x2x3x1=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).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.