spamsink: (lenin)
[personal profile] spamsink
Октябрьская задачка на IBM Ponder This прямо как доктор прописал:

Нужно построить логическую цепь, вычисляющую сумму 12 однобитных значений, использовав минимальное число функций "5 бит -> 2 бита".

Пока рекорд, если верить количеству звездочек в списке решивших задачу, 6 функций (upd: раньше казалось, что 5, но там в одном месте в количестве звездочек была опечатка). [livejournal.com profile] ftdf столько может, и я тоже.

А кто сколько может? Кто из программистов может думать в терминах логических цепей?



Пусть 12 входных значений обозначены буквами A-L. Выходы будем обозначать, как это сделал kcmamu в своем решении из 7 функций, буквами U, D, Q, O для разряда единиц, двоек, четверок и восьмерок соответственно, и номером функции. UU, DD, QQ, OO - окончательные результаты.

Первым делом сложим (по модулю 4, с разрядом четверок разберемся позже) две группы по 5 входов:
{D1,U1} = A+B+C+D+E
{D2,U2} = F+G+H+I+J

Теперь как можно быстрее получим окончательное значение разряда единиц (тоже складывая по модулю 4):

{D3,UU} = U1+U2+K+L

Осталось сложить D1, D2, D3 и соответствующие разряды четверок ("Q1", "Q2" и "Q3"), которые нужно как-то образовать.
Заметим, что при сложении 5 однобитных значений для получения разряда четверок достаточно посмотреть на значение суммы по модулю 4 (S) и на два любых входных значения: если S = 2 или S = 3, то разряд четверок гарантированно 0; если S = 0, то достаточно посмотреть на любые 2 входных бита, чтобы отличить 0 от 4 - хотя бы один из них должен быть равен единице, чтобы в результате было 4; если S = 1, то тоже достаточно посмотреть на любые 2 входных бита, чтобы отличить 1 от 5 - оба должны быть равны единице, чтобы в результате было 5. Таким образом, нужно всего 4 входа для получения разряда четверок при суммировании 5 бит, т.е. Qx=f(Dx, Ux, Y, Z), где Y и Z - любые 2 входа при вычислении {Dx,Ux}. Подчеркнём, что Qx и Dx не могут быть равны единице одновременно.

Тогда, виртуальное Q1 (функцию, зависящую от D1, U1 и любых двух входов первой суммы, пусть A и B) можно сложить с D1 (которое уже есть на входе) и с D3 (пятым входом) с помощью одной функции. В результате переноса в третий бит не возникнет, т.к. Q1 и D1 не могут быть равны единице одновременно (это от меня при решении в уме ускользнуло).

{Q4, D4} = 2*"Q1" + D1 + D3, где Q1 = f(D1, U1, A, B)

Осталось сложить D2, D4, "Q2" и "Q3". С Q2, D2 и D4 поступаем аналогично:

{Q5, DD} = 2*"Q2" + D2 + D4, где Q2 = f(D2, U2, F, G)

Тем самым образуется окончательное значение разряда двоек, т.к. больше в разряде двоек складывать нечего.

Осталось сложить "Q3", Q4 и Q5. "Q3" получилось в результате суммирования не пяти, а четырех бит, поэтому для того, чтобы Q3 было единице, D3 и UU должны быть равны нулю, а любой произвольный входной бит - единице. Это можно записать и как Q3 = f(D3, UU, U1, 0).

{OO, QQ} = "Q3" + Q4 + Q5, где Q3 = f(D3, UU, U1, 0).

(Описанное решение принадлежит ftdf, мое решение начинается с
{D1,U1} = A+B+(C^D^E)
{D2,U2} = F+G+(H^I^J)
т.е. пользуется разрывом трехбитных сумматоров на две части, как у kcmamu)
Page 1 of 3 << [1] [2] [3] >>

Date: 2015-10-13 04:23 am (UTC)
From: [identity profile] maksa.livejournal.com
10 минут ушло на понимание задачи.

Я правильно догадался, что это надо на компьютере решать?

Date: 2015-10-13 04:49 am (UTC)
From: [identity profile] maksa.livejournal.com
Эх. В другой жизни этим займусь. )

Date: 2015-10-13 06:06 am (UTC)
From: [identity profile] rezkiy.livejournal.com
а я вообще так и не понял.

Date: 2015-10-13 09:56 am (UTC)
From: [identity profile] mtve.livejournal.com
очень коряво у них сформулировано, "надо мягше"...

например, считаются разные функции или кол-во использованных функций?

Date: 2015-10-13 10:26 am (UTC)
From: [identity profile] rezkiy.livejournal.com
так, жесткач, завтра буду пытаться вникнуть. Спасибо за попытку объяснить!

Date: 2015-10-14 11:52 am (UTC)
From: [identity profile] mtve.livejournal.com
Мне было бы понятней как-то так:

"Есть булевы функции, n бит на входе, m бит на выходе, назовём их n->m.

Закодируем такую функцию в виде перечня входов, и значений выходов для всех вариантов входов.

Например, если n=3 и m=2, то для трёх входов a, b и c будет 8 вариантов их значений (000, 001 и т.д.), и для всех вариантов входов можно закодировать выходы как какие-то значения функции (например 00, 10, 01, ...) десятичным цифрами, тем самым представить такую функцию можно в виде abc02113302 (где 0 это 00, 2 это 10, и т.д.). Первый бит является самым старшим.

Из нескольких функций можно составить другую функцию, используя входы и уже вычисленные выходы.

Например, [тут описание примера с компаратором]
acd02113302
bef21133123
7 8


Задача: нужно из нескольких произвольных функций 5->2 составить функцию 12->4, которая бы вычисляла сумму входных значений, то есть сделать сумматор. Чем меньше используется функций 5->2 тем лучше, их должно быть не больше 9.

Формат: [тут чёткое описание в каком формате присылать решения]"

И, кстати, когда функций больше 8, то строчных английских букв для выходов не хватит, если например в 9-й функции использовать результаты 8-й, то есть формат немного недодуман]

Date: 2015-10-14 12:20 pm (UTC)
From: [identity profile] mtve.livejournal.com
хотя наверное нет, снимаются все возражения. если такой тупой что не понял задачи, незачем и соваться)

Date: 2015-10-14 08:27 pm (UTC)
From: [identity profile] mtve.livejournal.com
Думаю что верифицируют ответ они всё-таки формально.

Это интересная и сложная хорошая задача. Просто странное описание иногда отталкивает, возникает ощущение снобизма у авторов "догадайся что мы имели в виду". Без Вашей наводки, например, в эту - я даже не стал бы вчитываться, ещё раз спасибо.

Сочинения учили писать так: введение, основная часть, заключение, и всегда радуешься хорошо сформулированной задаче.

Date: 2015-10-14 09:56 pm (UTC)
From: [identity profile] no more turtles (from livejournal.com)
А что мешает программисту закодировать задачу в битовой строчке и запустить ее в эволюционный алгоритм? Где-то видел, что как раз с задачами такого типа они неплохо справляются.

Date: 2015-10-14 10:17 pm (UTC)
From: [identity profile] no more turtles (from livejournal.com)
pyevolve позволяет такое примерно за полчасика реализовать. Все же проще чем в уме варианты гонять ;)

Date: 2015-10-15 07:51 pm (UTC)
From: [identity profile] no more turtles (from livejournal.com)
> За часик я написал прототип с нуля на С++
Вы просто монстр какой-то ;) А я вот даже полчасика не нашел. Может на выходных руки дойдут.

Кстати может на плюсах даже лучше, потому как считает раз в 5 примерно быстрее чем питон. Я когда-то с сишной библиотекой работал, она тоже была неплоха, но на скорую руку, там труднее было.

Date: 2015-10-15 11:26 pm (UTC)
From: [identity profile] ftdf.livejournal.com
Я пока придумал 8, не совсем понимаю, как сделать меньше. Надо думать :)

Date: 2015-10-16 02:53 am (UTC)
From: [identity profile] ftdf.livejournal.com
Для тренировки сделал, это было более-менее очевидно.
Page 1 of 3 << [1] [2] [3] >>

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 6th, 2026 07:12 am
Powered by Dreamwidth Studios