Биты и гексаграммы

Как-то, разглядывая одну из книг, посвящённых древней китайской философии, я с удивлением обнаружил, что на некоторых рисунках комбинации из сплошных и прерывистых чёрточек, которые называются триграммы или гексаграммы, в зависимости от количества палочек, располагаются в ужасно знакомом двоичном порядке. На рисунке приведены все возможные восемь триграмм, расположенных в порядке Фу-си.

Таким образом, можно предположить, что эти загадочные триграммы и гексаграммы, в первую очередь, не что иное, как двоичная запись чисел. Как оказалось, это пришло мне в голову не первому. Мысль двигалась дальше, и я уже с учётом этого обстоятельства рассматривал знаменитый знак Дао, символизирующий единство двух противоначал - мужского Ян и женского Инь. Теперь мне виделось в нём не что иное, как изображение бита - элементарной единицы измерения информации. Действительно, присмотритесь: бит должен выглядеть именно так. Некое единство, таящее в себе две потенциальные возможности - Да или Нет, 0 или 1. Таким образом, теперь я воспринимал рисунки древних китайских мудрецов едва ли не как плакаты для обучения информатике. Не буду настаивать на всемирном историческом значении своих открытий, но описанные ассоциации представляются вполне логичными, обоснованными и уместными.

Попробуем составить программу на языке Бейсик построения всех возможных три-, тетра-, пента- и так далее ...грамм. Их количество определяется формулой M=2n - два в степени количества чёрточек. То есть, общее количество триграмм равно M=23=8, общее количество тетраграмм равно M=24=16, общее количество пентаграмм равно M=25=32, общее количество гексаграмм M=26=64 и так далее... по степеням двойки.

В нашей программе последовательность непрерывных и прерывистых чёрточек опишем как массив, элементами которого будут нули и единицы. Ядром процедуры будет цикл, моделирующий прибавление единицы к двоичному числу, состоящему из заданного количества двоичных разрядов.

 
k=1
p=TRUE
while p
 if b(k)=0 then p=FALSE
 b(k)= NOT b(k)
 k=k+1
wend

Здесь k представляет собой счётчик позиций, который перед каждым очередным выполнением цикла устанавливается в 1. Цикл выполняется, пока значение p=TRUE. Если в массиве встречается элемент, равный 0, то p получает значение FALSE. При этом элемент b(k) всегда меняет своё текущее состояние на противоположное b(k)=NOT b(k), а счётчик позиций продвигается на 1 вперёд.

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

dim b(10)
n=6
for i=0 to 2^n-1
 for j=1 to n
  if b(j)=0 then
   line x,y,x+5,y
   line x+10,y,x+15,y
   y=y+4
  endif
  if b(j)=1 then
   line x,y,x+15,y
   y=y+4
  endif
 next j
 if x=140 then
  x=0
  y=y+10
 else
  x=x+20
  y=y-n*4
 endif
 k=1
 p=TRUE
 while p
  if b(k)=0 then p=FALSE
  b(k)= NOT b(k)
  k=k+1
 wend
next i

Если значение n=6, то результатом её работы будет всё множество возможных гексаграмм, расположенных в двоичном порядке.

Программа пригодна не только в качестве подспорья для гадания по Книге перемен, но и как основа для решения некоторых традиционных задачек по программированию, связанных с полным двоичным перебором всех возможных вариантов взаимных сочетаний элементов какого-либо множества. Кроме того, теперь вы можете путём загибания пальцев одной руки сосчитать не до пяти, как все прочие граждане, а до 32, а с помощью всех десяти пальцев - до 1024.

А. КОЛЕСНИКОВ,
andr61@mail.ru

Версия для печатиВерсия для печати

Номер: 

28 за 2007 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!