부울 공식 압축


17

통사론

~하지
/\
\/
t사실
f거짓
P , Q, FISH, 등 : 변수

(운영자는 우선 순위대로 제공됩니다)

소개

일부 부울 수식은 다른 형식으로 변경하여 더 짧게 만들 수 있습니다. 예를 들어

~(~P /\ ~Q)

더 짧은 형태로 변경할 수 있습니다

P\/Q

공식 동안

P \/ ~P

더 짧은 형태로 변경할 수 있습니다

t

도전

이 도전 만 사용하는 부울 식 주어진 것으로, 프로그램 작성에 필요한 /\, \/, ~, t, f하나 개 이상의 짧은 형태가있을 수 있으므로, 괄호 부울 (대문자) 변수, 공백 (최단 형태 출력 )를 변수의 모든 할당에 해당하는 표현식의 문자로 표시합니다. 가장 짧은 코드 (모든 언어)가 이깁니다. I / O는 합리적인 방법으로 수행 할 수 있습니다.

또한 답변을 확인하기가 어렵 기 때문에 코드 작동 방식에 대한 간단한 설명을 포함하는 것이 도움이되지만 필수는 아닙니다.


"도전"섹션에는 공백이 언급되지 않지만 예에는 공백이 있습니다. 내가 처리해야합니까?
Victor Stafusa

4
Florent의 요점은 골프는 물론 일반적인 문제를 해결하기가 어렵다는 것입니다. 무엇보다도, 파서는 두 개의 임의의 공식이 동일한 진리 조건을 갖는지 여부를 결정할 수 있어야합니다. p가 원자이면 p ^ ~ p를 줄이는 것은 쉽지만 ((A ^ B) v (A ^ C)) ^ ~ (A ^ (BvC))는 어떻습니까? 나는 그것이 멋진 문제라고 생각하고 일부 답변을보고 싶어합니다. 그러나 짧은 해답을 원한다면 접두사 표기법을 사용하는 A.와 필요한 감축 목록을 제공하는 B.가 골프에 더 도움이 될 수 있습니다.
dfernig

1
5000 자 이상의 유효한 (골프) 솔루션이 있습니다. 이것은 말도 안됩니다 ... 그것은 토크 나이저, AST 파서, AST 리 라이터 및 식 생성기로 구성됩니다.
Florent

1
Mathematica는 한 번의 함수 호출 ( BooleanMinimize)
Florent

1
레코드의 경우 sha256sum은 498 자 솔루션입니다 b9c98d088b78c30bb2108008a064a7b95722a4694d90ddad94a025c2eb4ed30a. 창의성을 억누르고 싶지 않기 때문에 나중에 실제 코드를 게시 할 것입니다.
Lily Chung

답변:


2

아 맞다, 나는 실제로 나의 답변을 게시하는 것을 잊었다. 그것은 본질적으로 KSab의 대답 과 똑같은 접근법을 사용합니다. 사용하지만 가장 짧은 유효한 식만 인쇄합니다.

파이썬 3, 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)

앞서 계산 한 해시는 후행 줄 바꿈을 포함했으며 골프 def e(x): return를 치기 전에였습니다 .e=lambda x:


1

파이썬 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

입력 / 출력 :

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

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

> (P \/ Q) /\ P
P
(P)
...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.