задачка, компьютерное
Feb. 14th, 2010 02:18 pmУбил на нее немало времени сегодня, но очень понравилась:
Придумайте схему, у которой есть три входа A, B, C и три выхода not-A, not-B, not-C. Можно пользоваться элементами AND, OR и NOT, но AND и OR сколько угодно, а NOT не более двух штук.
Я на время постараюсь скрывать правильные ответы. Но у меня есть предложение: если вы уже знаете решение, или нашли его компьютерным перебором, не пишите его в комментах - напишите просто, что нашли, например. Нет ничего плохого в компьютерном переборе, но не всем интересно. Мне хотелось именно найти решение самому аналитическим путем.
Придумайте схему, у которой есть три входа A, B, C и три выхода not-A, not-B, not-C. Можно пользоваться элементами AND, OR и NOT, но AND и OR сколько угодно, а NOT не более двух штук.
Я на время постараюсь скрывать правильные ответы. Но у меня есть предложение: если вы уже знаете решение, или нашли его компьютерным перебором, не пишите его в комментах - напишите просто, что нашли, например. Нет ничего плохого в компьютерном переборе, но не всем интересно. Мне хотелось именно найти решение самому аналитическим путем.
no subject
Date: 2010-02-14 12:57 pm (UTC)1)x xor 1 = not x
2)z or (not z ) = 1 (это для единички в xor)
3)xor = not(z) * y + not(y)+z
not(z) можно использовать из единички, которую получили в формуле 2
no subject
Date: 2010-02-14 01:35 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-02-14 01:36 pm (UTC)no subject
Date: 2010-02-14 01:51 pm (UTC)no subject
Date: 2010-02-14 01:55 pm (UTC)no subject
Date: 2010-02-14 02:44 pm (UTC)no subject
Date: 2010-02-14 02:45 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-02-14 07:17 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-02-14 03:36 pm (UTC)Что интересно, вначале я доказал, что это невозможно :). Потом понял, что не учёл, что выход с одного инвертора можно завести на другой (через промежуточную логику, разумеется). Когда понял, задача сразу решилась.
Одно время схема у меня даже висела на стенке.
Могу восстановить, если надо.
В общем, в мире есть всего два инвертора. Не дай Бог один сгорит.
no subject
Date: 2010-02-14 03:40 pm (UTC)О!
(no subject)
From:Осторожно, здесь решение!
From:no subject
Date: 2010-02-14 03:41 pm (UTC)no subject
Date: 2010-02-14 03:53 pm (UTC)no subject
Date: 2010-02-14 04:16 pm (UTC)(no subject)
From:no subject
Date: 2010-02-15 10:45 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2010-02-14 04:41 pm (UTC)no subject
Date: 2010-02-14 04:53 pm (UTC)(no subject)
From:(no subject)
From: (Anonymous) - Date: 2010-02-14 09:05 pm (UTC) - Expand(no subject)
From:(no subject)
From: (Anonymous) - Date: 2010-02-14 09:35 pm (UTC) - Expand(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-02-14 07:12 pm (UTC)no subject
Date: 2010-02-14 07:17 pm (UTC)Дальше подсказывать не буду.
У вас ошибка
Date: 2010-02-14 07:30 pm (UTC)Re: У вас ошибка
From:Re: У вас ошибка
From:Re: У вас ошибка
From:Re: У вас ошибка
From:Re: У вас ошибка
From:no subject
Date: 2010-02-14 10:21 pm (UTC)X2 = not (B + C)
not C = (X1 * X2)
X3 = X1 * (not C)
X4 = X2 + (not C)
not A = (X1 * X3)
not B = (X2 * X4)
Неверно
Date: 2010-02-14 10:26 pm (UTC)Re: Неверно
From:Re: Неверно
From:Re: Неверно
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-02-15 10:41 am (UTC)no subject
Date: 2010-02-15 10:44 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Спойлер (выделить текст мышью для просмотра)
From: (Anonymous) - Date: 2010-02-17 09:05 am (UTC) - ExpandRe: Спойлер (выделить текст мышью для просмотра)
From:Re: Спойлер (выделить текст мышью для просмотра)
From: (Anonymous) - Date: 2010-02-17 12:04 pm (UTC) - ExpandRe: Спойлер (выделить текст мышью для просмотра)
From:(no subject)
From:(no subject)
From:no subject
Date: 2010-02-16 09:41 am (UTC)no subject
Date: 2010-02-16 09:48 am (UTC)(no subject)
From:no subject
Date: 2010-02-17 07:46 pm (UTC)Формально:
X=NOT (AB OR AC OR BC)
Y=NOT (((A OR B OR C) X) OR ABC).
NOT A = (X (Y OR B OR C)) OR (YBC)
Вроде, так...
no subject
Date: 2010-02-18 01:42 am (UTC)a = 0x0f b = 0x33 c = 0x55 # three stages of list proliferation: before the first ~, after the first ~, after the second ~ # the stage counts picked empirically stages = [3,2,2] # adds to the list l all values that could be computed out of its elements with & and | def proliferate_list(l, stage, d = None): for i in range(stages[stage]): lset = frozenset(l) for v1 in lset: for v2 in lset: if v1 < v2: # for all unique pairs in l if not (v1 & v2) in l: l.append( v1 & v2 ) if not (v1 | v2) in l: l.append( v1 | v2 ) if d: # wraps operand in round brackets only when needed def wrap_operand( s, operation ): balance = 0 for c in s: if c in ['&','|'] and balance==0: return (c==operation) and s or '(%s)'%s elif c=='(': balance += 1 elif c==')': balance -= 1 return s # keep the most concise expression for each value s = wrap_operand(d[v1],'&') + '&' + wrap_operand(d[v2],'&') if not d.has_key(v1&v2) or len(d[v1&v2])>len(s): d[v1&v2] = s s = wrap_operand(d[v1],'|') + '|' + wrap_operand(d[v2],'|') if not d.has_key(v1|v2) or len(d[v1|v2])>len(s): d[v1|v2] = s if d: return l, d else: return l try: l = proliferate_list([a,b,c],0) for v1 in l: x = 0xff & ~v1 l1 = proliferate_list(l+[x], 1) for v2 in l1: y = 0xff & ~v2 if not y in l1: l2 = proliferate_list(l1+[y], 2) if len(set([0xf0, 0xcc, 0xaa]) & set(l2)) == 3: # all three of ~a,~b,~c are found # repeat the proliferation steps, this time keeping the dictionary of expressions d = { a:'a', b:'b', c:'c', x:'x', y:'y' } l3,d = proliferate_list([a,b,c],0,d) print ' x = ~(%s)' % d[v1] # have to print x here lest the more concise but y-dependent expression replaces it l3,d = proliferate_list(l3+[x],1,d) print ' y = ~(%s)' % d[v2] l3,d = proliferate_list(l3+[y],2,d) for v in [a, b, c]: print ' ~%s: %s' % (d[v], d[0xff&~v]) raise Exception except: passВот её результат:
7 минут
Date: 2010-02-18 09:23 pm (UTC)если А Б С принять за 0 1 2 ...
тогда
А&(Б||C)= ^B || ^C
B&C = ^A....
на этом, кажется, все...
Re: 7 минут
Date: 2010-02-19 06:40 am (UTC)Re: 7 минут
From:Re: 7 минут
From:Re: 7 минут
From:Re: 7 минут
From:no subject
Date: 2010-02-22 04:31 am (UTC)x6 = A and C
x7 = A and B
n1 = not (x4 or x6 or x7)
z2 = n1 and C
z3 = n1 and B
z5 = n1 and A
n2 = not (z2 or z3 or z5 or (A and B and C))
z1 = n1 and n2
z4 = x4 and n2
z6 = x6 and n2
z7 = x7 and n2
notA = z1 or z2 or z3 or z4
notB = z1 or z2 or z5 or z6
notC = z1 or z3 or z5 or z7
По совместительству код на Питоне:
c = 2
s = ''
for A in range(c):
for B in range(c):
for C in range(c):
...
s += '%i %i %i | %i %i %i | %i %i %i\n' % \
(A, B, C, not A, not B, not C, notA, notB, notC)
print s
no subject
Date: 2014-07-06 12:39 pm (UTC)no subject
Date: 2010-04-01 08:23 pm (UTC)NOT(A) = B OR X
NOT(B) = A OR X
NOT(C) = NOT(C)
Как то уж очень просто.
no subject
Date: 2010-04-01 08:28 pm (UTC)X=NOT(A AND B AND C)
NOT(A) = X OR B OR C
NOT(B) = X OR A OR C
NOT(C) = X OR A OR B
(no subject)
From: