बूलियन फार्मूले का अनुपालन


18

वाक्य - विन्यास

~नहीं
/\और
\/या
tसच
fझूठी
P, Q, FISH, आदि: चर

(ऑपरेटर्स पूर्वता के क्रम में दिए गए हैं)

परिचय

कुछ बूलियन फ़ार्मुलों को विभिन्न रूपों में बदलकर उन्हें छोटा किया जा सकता है। उदाहरण के लिए, सूत्र

~(~P /\ ~Q)

छोटे रूप में बदला जा सकता है

P\/Q

सूत्र के दौरान

P \/ ~P

छोटे रूप में बदला जा सकता है

t

चुनौती

इस चुनौती के लिए, आप एक प्रोग्राम है जो, किसी भी बूलियन सूत्र केवल का उपयोग कर दिया लिखने के लिए आवश्यक हैं /\, \/, ~, t, f, कोष्ठक, बूलियन चर (अपरकेस में), और रिक्त स्थान को, एक छोटा रूप आउटपुट (के बाद से वहाँ एक से अधिक कम से कम रूप हो सकता है ) उस अभिव्यक्ति के पात्रों में जो चर के सभी असाइनमेंट के लिए बराबर है। सबसे छोटा कोड (किसी भी भाषा में) जीतता है। I / O किसी भी उचित तरीके से किया जा सकता है।

इसके अलावा, चूंकि उत्तर सत्यापित करना मुश्किल है, इसलिए कोड कैसे काम करता है, इसकी एक संक्षिप्त व्याख्या शामिल करना सहायक (लेकिन आवश्यक नहीं है) होगा।


अपने "चैलेंज" खंड में आप किसी भी व्हाट्सएप का उल्लेख नहीं करते हैं, लेकिन आपके उदाहरण उनके पास हैं। क्या मुझे उन्हें संभालना चाहिए?
विक्टर स्टैफुसा

4
मुझे लगता है कि फ्लोरेंट की बात यह है कि सामान्य रूप से हल करना एक कठिन समस्या है, अकेले गोल्फ को। अन्य बातों के अलावा, पार्सर को यह निर्धारित करने में सक्षम होना चाहिए कि क्या दो मनमाने फॉर्मूले में एक ही सत्य स्थिति है। P ^ ~ को कम करना p काफी आसान है अगर p परमाणु है, लेकिन कैसे (A ^ B) v (A ^ C)) ^ ~ (A ^ (BvC)) के बारे में? मुझे लगता है कि यह एक अच्छी समस्या है और मैं कुछ प्रतिक्रियाओं को देखने के लिए उत्सुक हूं। लेकिन अगर आप छोटे समाधान चाहते हैं, तो समस्या को उपसर्ग संकेतन और बी का उपयोग करके ए द्वारा गोल्फ के लिए अधिक अनुकूल बनाया जा सकता है और आवश्यक कटौती की सूची प्रदान करेगा।
dfernig

1
मेरे पास 5000 से अधिक पात्रों में एक वैध (गोल्फ) समाधान है। यह हास्यास्पद है ... यह एक टोकन, एएसटी-पार्सर, एएसटी-पुनर्लेखक और एक अभिव्यक्ति जनरेटर से बना है।
फ्लोरेंट

1
Mathematica इसे एक फंक्शन कॉल ( BooleanMinimize)
फ्लोरेंट में कर सकते हैं

1
रिकॉर्ड के लिए, मेरे पास अब 498-चरित्र का समाधान है, जिसका शम 256 है b9c98d088b78c30bb2108008a064a7b95722a4694d90ddad94a025c2eb4ed30a। मैं बाद की तारीख में वास्तविक कोड पोस्ट करूंगा, क्योंकि मैं क्रिएटिविटी नहीं करना चाहता।
लिली चुंग

जवाबों:


2

अजगर 616

विशेष रूप से कुशल नहीं है, लेकिन इनपुट के लिए उचित समय में काम करता है जिसके परिणाम लगभग 5 या 6 वर्ण हैं। यदि यह मेल खाता है, तो यह देखने के लिए एक स्ट्रिंग की जांच करने के लिए, यह सभी चर के लिए सत्य / झूठे मूल्यों के हर संभव संयोजन से गुजरता है और सुनिश्चित करता है कि प्रत्येक एक सहमत है। इसका उपयोग करके यह हर संभव स्ट्रिंग की जांच करता है जिसमें संबंधित वर्ण शामिल होते हैं (जरूरी नहीं कि एक वाक्यात्मक रूप से सही भी हो)।

यह वास्तव में हर समकक्ष अभिव्यक्ति (हर आकार का) प्रिंट करेगा और वास्तव में कभी समाप्त नहीं होगा।

कोड:

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

इनपुट / ouput:

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

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

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

2

ओह ठीक है, मैं वास्तव में अपना उत्तर देना भूल गया। यह अनिवार्य रूप से सटीक वही दृष्टिकोण का उपयोग करता है जो का उपयोग करता है केसाब के उत्तर का उपयोग करता है, लेकिन केवल सबसे कम वैध अभिव्यक्ति को प्रिंट करता है।

पायथन 3, 493 484

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(1-s)
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(i+'~/\\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)

संपादित करें: एक बग तय किया है जहां कोष्ठक उत्पन्न नहीं हो सकता है, और mएक बिट की गणना गोल्फ । के -s+1साथ भी बदल दिया 1-s

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.