Boole formüllerini sıkıştırma


17

Sözdizimi

~değil
/\ve
\/ya
tgerçek
fsahte
P, Q, FISH, vs: değişkenler

(Operatörler öncelik sırasına göre verilir)

Giriş

Bazı boole formülleri, daha kısa hale getirmek için farklı formlara değiştirilebilir. Örneğin, formül

~(~P /\ ~Q)

daha kısa forma değiştirilebilir

P\/Q

formül iken

P \/ ~P

daha kısa forma değiştirilebilir

t

Meydan okuma

Bu sorun, sadece kullanarak herhangi bir Boole formül verilen bir programı yazmak için gereklidir /\, \/, ~, t, fbirden fazla kısa bir şekilde olabileceğinden, parantez, Boole (büyük harf) değişkenleri, ve boşluk (en kısa formunu verir ), ifadenin değişkenlerin tüm atamaları için eşdeğer olan karakterlerle. En kısa kod (herhangi bir dilde) kazanır. G / Ç herhangi bir makul şekilde yapılabilir.

Ayrıca, cevapların doğrulanması zor olduğu için, kodun nasıl çalıştığına dair kısa bir açıklama eklemek yararlı olacaktır (ancak zorunlu değildir).


"Zorluk" bölümünüzde herhangi bir boşluktan söz etmiyorsunuz, ancak örnekleriniz bunlara sahip. Onları idare etmeli miyim?
Victor Stafusa

4
Bence Florent'in amacı golf oynamak yerine genel olarak çözmenin zor bir problem olduğudur. Diğer şeylerin yanı sıra, ayrıştırıcının iki keyfi formülün aynı doğruluk koşullarına sahip olup olmadığını belirleyebilmesi gerekir. P atomikse p ^ ~ p'yi azaltmak yeterince kolaydır, ancak ((A ^ B) v (A ^ C)) ^ ~ (A ^ (BvC))? Bence bu harika bir problem ve bazı yanıtlar görmeyi merak ediyorum. Ancak kısa çözümler istiyorsanız sorun, ön ek notasyonu ve B. tarafından gerekli azaltmaların bir listesini kullanarak golf ile daha elverişli hale getirilebilir.
dfernig

1
5000 karakterden fazla geçerli (golf edilmiş) bir çözümüm var. Bu çok saçma ... Bir tokenizer, bir AST-ayrıştırıcı, bir AST-yeniden yazar ve bir ifade üretecinden oluşur.
Florent

1
Mathematica bir işlev çağrısında yapabilir ( BooleanMinimize)
Florent

1
Kayıt için, şimdi sha256sum olan 498 karakterli bir çözümüm var b9c98d088b78c30bb2108008a064a7b95722a4694d90ddad94a025c2eb4ed30a. Yaratıcılığı bastırmak istemediğim için gerçek kodu daha sonraki bir tarihte yayınlayacağım.
Lily Chung

Yanıtlar:


2

Evet, cevabımı asmayı unutmuşum. Esasen KSab'ın cevabının kullandığı yaklaşımın aynısını kullanır, ancak yalnızca en kısa geçerli ifadeyi yazdırır.

Python3, 493

e=lambda x:eval(x.replace('\\/','+').replace('/\\','%'),None,w)
class V(int):
 def __add__(s,o):return V(s|o)
 def __mod__(s,o):return V(s*o)
 def __invert__(s):return V(-s+1)
import re;from itertools import product as P;t=V(1);f=V(0);i=input();v=re.findall('[A-Z]+',i)
for k in range(1,len(i)):
 for m in P(''.join(v)+'~/\\tf',repeat=k):
  m=''.join(m)
  try:
   for d in P((V(0),V(1)),repeat=len(v)):
    w=dict(zip(v,d))
    if e(m)!=e(i):raise
  except:continue
  print(m);exit()
print(i)

Ben golfed önce daha önce firar yeni satır dahil oldu hesaplanmaktadır karma o Not def e(x): returniçine=lambda x:


1

Python 616

Özellikle verimli değildir, ancak sonuçları yaklaşık 5 veya 6 karakter olan girdiler için makul sürede çalışır. Bir dizenin eşleşip eşleşmediğini kontrol etmek için, tüm değişkenler için olası her doğruluk / yanlış değer kombinasyonundan geçer ve her birinin kabul ettiğinden emin olur. Bunu kullanarak, ilgili karakterlerden oluşan olası tüm dizeleri kontrol eder (sözdizimsel olarak doğru olanı bile olmayabilir).

Aslında (her boyutta) her eşdeğer ifadeyi yazdıracak ve aslında hiç sona ermeyecektir.

Kod:

c=['t','f'];o=['1 ','0 ']
def e(s,v):
 for k in v:s=s.replace(k,v[k])
 return eval(s)
def z(t,p='~/\\() '):
 w=[]
 if p=='':return[t]*(t not in['']+c)
 for s in t.split(p[0]):w.extend(z(s,p[1:]))
 w.sort(key=lambda v:-len(v));return w
def m(v):
 l=list('~\\/()')+v
 for s in l:yield s
 for r in m(v):
    for s in l:yield s+r
def n(x):
 if x<1:yield []
 else:
    for l in n(x-1):
     for b in o:yield[b]+l
t=raw_input();v=z(t)+c;l=len(v)
for s in m(v):
 g=1
 for y in n(l):
    y[-2:]=o;d=dict(zip(v+['/\\','\\/','~'],y+['and ','or ','not ']))
    try:
     if e(s,d)!=e(t,d):g=0
    except:g=0
 if g:print s

Giriş / çıkış:

> ~(~P /\ ~Q)
Q\/P
P\/Q
...

> P /\ ~P
f
~t
...

> (P \/ Q) /\ P
P
(P)
...
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.