Ця ідея прийшла мені десь у 2008 році. Незалежно від Лю Цисіня з його "Проблемою трьох тіл". І я навіть спробував її реалізувати на базі Донецького коледжу промавтоматіки. Там у мене був добрий знайомий - викладач інформатики Олександр Лєбедев. Мета була - дати студентам розуміння, як все працює.
Але якось не склалося. Тоді я написав замітку у LinkedIn і відклав це.
Де зараз ці благословенні часи, коли не було війни і майбутнє видавалося безхмарним? Зараз я пишу тут, щоб не забути.
Проект
Для початку зробимо з людей бінарний суматор, який є одним з базових блоків комп'ютера.
Будемо робити 10-розрядний бінарний суматор з людей для отримання суми двох двійкових чисел.
Трохи теорії.
Однорозрядний елементарний двійковий суматор має два входи і один вихід. Він може складати тільки однорозрядні двійкові числа таким чином:
- 0+0=0
- 0+1=1
- 1+0=1
- 1+1=0 (тут має відбутись перенос розряду)
Якщо розглянути багаторозрядний двійковий суматор, то він для кожного розряду має три входи і два виходи:
- Входи:
Два входи - це відповідні розряди двох чисел, які ми складаємо.
Третій вхід - лінія переносу розряду від попереднього розряду суматора.
- Виходи:
Перший вихід - результат складання (0 чи 1).
Другий вихід - лінія переноса розряду до наступного розряду суматора.
Повний багаторозрядний суматор складається з двійкових суматорів для кожного розряду, які розташовані один за одним і з'єднані через лінії переносу розряду.
Наприклад схема чотирирозрядного суматора:
Щоб двійковий суматор для конкретного розряду виконав свою роботу, він повинен отримати коректні дані на всі свої входи.
Перед початком роботи для кожного розряду ми маємо значення для двох входів - це відповідні розряди двох початкових чисел. Щоб отримати значення на третьому вході розряду, повинна бути виконана робота двійковими суматорами у всіх попередніх розрядах. Тільки тоді ми дізнаємося, яке значення має вхід переносу розряду у цьому розряді.
Приймемо, що для виконання обчислення суматору кожного розряду потрібен один такт часу. Тоді, суматор i-го розряда отримає коректне значення на вході переносу розряду на i-му такті роботи. Таким чином, щоб скласти два n-розрядних двійкових числа нам потрібно n тактів часу.
Робимо 10-розрядний суматор із людей.
Він зможе складати двійкові числа, кожне з яких буде мати значення від 0 до 1024.
Результат складання також буде в межах від 0 до 1024.
Крім того ми матимемо значення переносу 10-го розряду, по якому
визначимо, чи не перевищив наш результат максимальне значення 1024.
Наш пристрій з людей буде складатися з двох регістрів вводу і самого суматора.
Кожен регістр вводу і сам суматор - це шеренги людей по 10 осіб.
Шеренги встановлюються паралельно.
Суматор - в середині. Регістри вводу - ззовні.
Крім того потрібен диригент, який буде грати роль тактового генератора, і який буде подавати команди наприклад громким голосом чи барабаном чи тарілками чи т.п. Диригент стає біля початку шеренг (там де перший розряд). Люди повернуті обличчями до диригента. Таким чином кожна людина у суматорі (крім першої) бачить, що робить попередній розряд.
Люди в регістрах вводу отримують по одному синьому прапорцю. Люди в суматорі отримують по два прапорця - однин білий і один чорний. Прапорцями в суматорі будуть наші виходи. Білим прапорецем показується результат складання у розряді, а чорним - пернос значення у наступний розряд. Звязок в нашому пристрої забезпечується не проводами і струмом, а зором і слухм людей.
Піднятий прапорець любого кольору означає 1. Опущений - 0.
Одна людина в нашому суматорі - це один розряд, точніше двійковий суматор одного розряду. В цьому випадку три входи - це люди зліва, справа і спереду.
Складаємо числа A і B.
Підоготовка початкових даних: На першому регістрі вводу встановлюємо двійкове значення числа A шляхом підйому прапорців у розрядах, де маємо 1. На другому регістрі вводу встановлюємо двійкове значення числа B аналогічним чином.
Робота суматора Після підоготовки початкових даних диригент починає подавати команди. Почувши команду від диригента людина в суматорі виконує свій алгоритм, після цього чекає наступної команди. Після 10 команд робота суматора зупиняється. По значенню чорного флажка останньго (10-го) розряду суматора ми побачимо, чи було переповнення. Результат - це значення білих прапорців.
Алгорим роботи людини у суматорі. Початковий стан прапорців - опущені.
-
Чекати. Коли почуєш сигнал від диригента, то:
1.1. Спочатку обробляєш значення від сусідів зліва і справа (відповідних розрядів вхідних регістрів). Тому дивишся по черзі наліво і направо.
1.1.1 - Якщо і там і там нема піднятих прапорців, то чорний прапорець - донизу, білий - без змін.
1.1.2 - Якщо один з прапорців піднятий, а інший опущений, то білий прапорець - уверх,а чорний - без змін.
1.1.3 - Якщо оба прапорця підняті, то білий прапорець - донизу і чорний прапорець - уверх.
1.2 Потім обробляєш значення входа переноса розряду. Тому дивишся на людину спереду себе.
- 1.2.1 - Якщо там чорний прапорець унизу, то нічого не робиш
- 1.2.2 - Якщо там чорний піднято уверх, то :
* 1.2.2.1 - Якщо у нас піднято білий прапорець, то білий - донизу, а чорний - уверх.
* 1.2.2.2 - Якщо у нас опущений білий прапорець, то білий - уверх, а чорний - без змін.
-
Перехід до п.1
Результат показано на малюнку
Якщо люди добре навчаться і зможуть виконувати дії одного такту за 10 секунд, то швидкість роботи нашого суматора буде 1 операція складання за 100 секунд.