% ####################################################################################
%    П      Р      Е      О      Б      Р      А      Ж      Е      Н      И      Е
% ####################################################################################
%                                     пасхальная
%                                     энумерация
%                                     окрестовая
%                                 massive && signed
%                                      радоница
%                                       учение
%                                     вознесение
%                                    преполовение
%                                    преображение
%                             19-04-2020 -::- 19-08-2020
%                                     20-08-2020
% ####################################################################################

clear all
clc

%  события:

% #####################################
% христосе явление
  sobytie = 0;
                tot = 11; draai = 1;
% #####################################

% #####################################
% радоница воскресение
  sobytie = 1;
                tot = 12; draai = 1;
% #####################################

% #####################################
% воскресе преполовение
  sobytie = 2;
% феникс
                tot = 13; draai = 0;
% феникс
% #####################################

% ############
% преображение
  sobytie = -1;
                tot = 10;  draai = 1;
% преображение
% ############

% ... ################## ...
% ... присносущная жизнь ...
  TOT = 2^tot+1;         ...
% ... присносущная жизнь ...
% ... ################## ...

% ##################
  tekst = 0; % или 1
% ##################

% ################
  if sobytie == -1
   'ΜΕΤΑΜΟΡΦΟΣΙΣ'
  end
% ################


% ##################
% главная энумерация
for n = 1:TOT

 N(n) = n;

 % ##################################################
 zbinm = io10_(dec2bin(n));
 % ##################################################
 if sobytie > 0 zbinm(1) = []; end % без первого бита
 % ##################################################
 zbinm_(n) = biio_(zbinm);
 % ##################################################

 % ########################################
 % поколение
 t(n) = length(zbinm); t_(n) = nstr_(t(n));
 % поколение
 % ########################################

 % ##############
 % раннее событие
 if sobytie <= 1
  draw_binm = zbinm;
  if n > 1
   znaki(n) = zbinm(1);
   znakj(n) = zbinm(1);
  else
   znaki(n) = -1;
   znakj(n) = -1;
  end
 end
 % раннее событие
 % ###############


 % ###############
 % позднее событие
 if sobytie == 2
  if t(n) >= 2
   if zbinm(2) == 0
    draw_binm = [zbinm(2) ~zbinm(3:end)];
   else
    draw_binm = [zbinm(2)  zbinm(3:end)];
   end
   znaki(n) =  zbinm(1) ~= zbinm(2);
   znakj(n) =  zbinm(1);
  else
   draw_binm = [];
   znaki(n) =  -1;
   znakj(n) =  -1;
  end
  znaki_(n) = nstr_(znaki(n));
  znakj_(n) = nstr_(znakj(n));
 end
 % позднее событие
 % ###############

 % ###############################
 draw_binm_(n) = biio_(draw_binm);
 % ###############################

 % ############################################################
 if sobytie == 0
  if mod(t(n),2) == 0 draw_binm_(n) = negb_(draw_binm_(n)); end
 end
 % ############################################################

 % ##################################################################
 if sobytie == -1 draw_binm_(n) = negb_(draw_binm_(n)); znak = 0; end
 % ##################################################################

 % ###################################################
 draw_chfm_(n) = zbinm_to_zchfm_pasen_(draw_binm_(n));
 % ###################################################

 draw_c(n) = getc_(draw_chfm_(n)); draw_c_(n) = nstr_(draw_c(n));
 draw_s(n) = gets_(draw_chfm_(n)); draw_s_(n) = nstr_(draw_s(n));
 draw_z(n) = getz_(draw_chfm_(n));

 draw_i(n) = draw_c(n) * (-1).^znaki(n); draw_i_(n) = nstr_(draw_i(n));
 draw_j(n) = draw_s(n) * (-1).^znakj(n); draw_j_(n) = nstr_(draw_j(n));

 if draai == 0
  number(n) = (draw_i(n)            ) + i * (            draw_j(n));
 else
  number(n) = (draw_i(n) - draw_j(n)) + i * (draw_i(n) + draw_j(n));
 end
 number_(n) = nstc_(number(n));

 % ##########################################################################
 % словарное сравнение в порядке преображения (znak_gedaanteverandering == 0)
 % ##########################################################################
 if sobytie == -1
  znak_gedaanteverandering = 0;
  [kern_,left_,righ_,body_,okchf] = zchfm_to_matter_pasen_(draw_chfm_(n),znak_gedaanteverandering);

                             orderleri(n) =  lexi_(left_,righ_,-1);
                             orderleke(n) =  lexi_(left_,kern_,-1);

  if mod(n,4) == 1           orderlebo(n) =  lexi_(left_,body_,-1); end
  if mod(n,4) == 2           orderlebo(n) =  lexi_(left_,body_,-1); end
  if mod(n,4) == 3           orderlebo(n) =  same_(left_,body_   ); end
  if mod(n,4) == 0           orderlebo(n) =  lexi_(left_,body_,-1); end

  if mod(n,4) == 1           orderboke(n) =  lexi_(body_,kern_,-1); end
  if mod(n,4) == 2           orderboke(n) =  same_(body_,kern_   ); end
  if mod(n,4) == 3           orderboke(n) =  lexi_(body_,kern_,-1); end
  if mod(n,4) == 0           orderboke(n) =  lexi_(kern_,body_,-1); end % μεταμόρφωσις

                             orderkeri(n) =  lexi_(kern_,righ_,-1);

  if n > 1
   order_(n) = lexi_(draw_chfm_(n-1),draw_chfm_(n-0),-1);
   if order_(n) == 0
    gedantenverandering = [nstr_(n) ' : ' draw_chfm_(n-1) ' > ' draw_chfm_(n-0)];
   end
  end

 end
 % ##########################################################################
 % словарное сравнение в порядке преображения (znak_gedaanteverandering == 0)
 % ##########################################################################

end
% главная энумерация
% ##################

% ==============================
% порядок преображения в порядке
% ==============================

if sobytie == -1
 all_in_order = ([all(orderleri) ...
                  all(orderleke) ...
                  all(orderlebo) ...
                  all(orderkeri)...
                  all(orderboke)])
end

% ==============================
% порядок преображения в порядке
% ==============================


% ###########
% изображение
% ###########
if 1 == 1
 figure(1);
 set(1,'color',[.5,.5,.5])
 plot(number,'r.','MarkerSize',10); hold on; plot(number,'w','LineWidth',2);   % == plot(draw_i,draw_j);
  if sobytie == -1 title('ПРЕОБРАЖЕНИЕ','color','w');  end
  if sobytie ==  0 title('ЯВЛЕНИЕ','color','w');       end
  if sobytie ==  1 title('ВОСКРЕСЕНИЕ','color','w');   end
  if sobytie ==  2 title('ПРЕПОЛОВЕНИЕ''color','w');   end
  axis off
  if tekst == 1
   for in = 1:n;
    if in >= 1 text(real(number(in)),imag(number(in)),num2str(in)); end
  end
 end
end
% ###########
% изображение
% ###########


% #################################
%                   ###############
%                    Ф У Н К Ц И И
%                   ###############
% #################################


% #########################################################################
%                                       пасха
%                                 zbinm_ TO zchfm_
%                            19-04-2020 -::- 19-08-2020
%                           MASSIVE && SIGNED && OPPOSED
%
% #########################################################################
% #########################################################################
function [zchfm_] = zbinm_to_zchfm_pasen_(zbinm_);
%    the signed massive diatomic opposed zchfm_     #######################
%
% of the signed massive binary           zbinm_     #######################
% #########################################################################

 zbinm = io10_(zbinm_);

 if isempty(zbinm)
  zchfm = [];
  zchfm_ = iipm_(zchfm);
  return;
 end

 % ######################################
 tzbinm = length(zbinm); znak = zbinm(1);
 % ######################################

 % ################################
 zchfm = []; zchfm_ = iipm_(zchfm);
 for i = 1:tzbinm
  [kern_,left_,righ_,body_,okchf] = zchfm_to_matter_pasen_(zchfm_,znak);
  if zbinm(i) ~= znak
   RIGH_ = kern_ ;
  else
   RIGH_ = righ_ ;
  end
  LEFT_ = zchfm_;
  zchfm_ = fusi_(LEFT_,RIGH_);
   [biio_(zbinm(1:i)) zchfm_];
 end
% ################################

end
% #


% #################################################################################
function [kern_,left_,righ_,body_,okchf] = zchfm_to_matter_pasen_(zchfm_,znak);
%         идея  дух   сын   отец                                  сусам
%         ядро
% #################################################################################
%                             пасхальная материализация
%                           19-04-2020 -:- 19-08-2020
%
%                   !! знак только для начального пустого слова !!
%
% #################################################################################

 kern = [];
 righ = [];
 left = [];
 body = [];

 zchfm = pmii_(zchfm_);
 % ######################################
 % знак только для начальных пустых слов
 if isempty(zchfm) zchfm = (-1).^znak; end
 % знак только для начальных пустых слов
 % ######################################

 wrd = zchfm; o = length(wrd); i = 1;

 [okchf,z,l,r] = ischf(wrd);
 [oklap,Z,L,R] = islap(wrd);

 ok = [okchf oklap];
 zn = znak;

 if oklap
  kern = zchfm(1:Z+0);
  left = zchfm(1:L+0);
  righ = zchfm(L+1:Z);

  % ####################
  % три body возможности
  % две znak возможности

  if okchf
   if r > l
    % (01) chf: righ длинней чем left: cut righ(left)
    [okrig,zl,ll,rl] = ischf(left);
    % body is a lap (01)
    body = zchfm(1:o-rl);
   else
    % (11) chf: lef не короче чем rig: cut righ, то есть оставь left
    % body is a chf (11)
    body = left;
   end

   % ##########
   zn = 0+znak;
   % ##########
  else
   % (00) or (10) lap: cut one kern
   % body is either a lap (00) or a chf (10)
   body = zchfm(1:o-Z);
   % ##########
   zn = 1-znak;
   % ##########
  end
 end

 % три body возможности
 % две znak возможности
 % ####################


 % ######################################
 if Z == 1 righ = -kern;  end
 % ######################################

 kern_ = iipm_(kern);
 left_ = iipm_(left);
 righ_ = iipm_(righ);
 body_ = iipm_(body);

end
% #


% ##########################
% nstc_
% ##########################
function [cel_] = nstc_(num);

 if imag(num) == 0
  if real(num) >= 0
   cel_ = cellstr(['+' num2str(num)  '+0i' ]);
  else
   cel_ = cellstr([''  num2str(num)  '+0i' ]);
  end
 else
  if real(num) >= 0
   cel_ = cellstr(['+' num2str(num)]);
  else
   cel_ = cellstr([    num2str(num)]);
  end
 end

end
% #

% ##########################
% nstr_
% ##########################
function [cel_] = nstr_(num);

 cel_ = cellstr(num2str(num));

end
% #


% ##########################
% getz_
% ##########################
function [z] = getz_(word_);

 z = length(pmii_(word_));

end
% #


% ##########################
% getc_
% ##########################
function [c] = getc_(word_);
 word = pmii_(word_);
 c = length(find(word<0));
end
% #


% ##########################
% gets_
% ##########################
function [s] = gets_(word_);
 word = pmii_(word_);
 s = length(find(word>0));
end
% #


% ############################
% negb_
% ############################
function [Bin_] = negb_(bin_);

 Bin_ = biio_(~(io10_(bin_)));

end
% #


% ###########################
% io10_
% ###########################
function [bin] = io10_(bin_);

 Bin_ = char(bin_);
 bin = zeros(1,length(Bin_));
 bin(findstr('1',Bin_)) = 1;
 bin(findstr('0',Bin_)) = 0;

end
% #


% ###########################
% biio_
% ###########################
function [bin_] = biio_(bin);
 BIN = [''];
 BIN(find(bin==+1)) = '1';
 BIN(find(bin== 0)) = '0';
 bin_ = cellstr(BIN);
end
% #


% #############################
% pmmp_
% #############################
function [DIA_] = pmmp_(dia_ );

 DIA_ = iipm_(-pmii_(dia_));

end
% #


% ###########################
% iipm_
% ###########################
function [dia_] = iipm_(dia);

 dia_ = [''];
 dia_(find(dia == +1)) = '+';
 dia_(find(dia == -1)) = '-';
 dia_ = cellstr(dia_);

end
% #


% ###########################
% pmii_
% ###########################
function [dia] = pmii_(dia_);

 Dia_ = char(dia_);
 dia = zeros(1,length(Dia_));
 dia(findstr('+',Dia_)) = +1;
 dia(findstr('-',Dia_)) = -1;

end
% #


% ###################################
% fusi_
% ###################################
function [chf_] = fusi_(chf1_,chf2_);

 chf_ = iipm_([pmii_(chf1_) pmii_(chf2_)]);

end
% #


% #######################################################
% lexi % determines whether lexicographically bino < bini
% #######################################################
function [olessi] = lexi_(bino_,bini_,type)

if type < 0
 bino = pmii_(bino_); bino = (bino + 1)./2;
 bini = pmii_(bini_); bini = (bini + 1)./2;
else
 bino = io10_(bino_);
 bini = io10_(bini_);
end

% ==========================================
%if any(bino == -1) bino = (bino + 1)./2; end
%if any(bini == -1) bini = (bini + 1)./2; end
% ==========================================

olessi = lexi(bino,bini);

end
% #


% ##################################
% lexi NON-IMPLICATION bino </- bini
% ##################################
function [olessi] = lexi(bino,bini)

 to = length(bino);
 ti = length(bini);

 j = 0;
 olessi = 1;

 % ==============================
 % emptyness
 % is smaller than
 % emptyness
 if to == 0 & ti == 0 return; end
 % ==============================

 while 1 == 1
  j = j + 1;
  if j > ti olessi = 0; break; end
  if j > to             break; end
  if bino(j) > bini(j)
   olessi = 0;
   break;
  end
  if bino(j) < bini(j)
   break;
  end
 end
end
% #


% ############################################
% same_ % determines whether all(bino == bini)
% ############################################
function [olessi] = same_(bino_,bini_)

bino = io10_(bino_);
bini = io10_(bini_);

olessi = same(bino,bini);

end
% #


% ################################
% same
% ################################
function [oksam] = same(bino,bini)

 % works char as well

 to = length(bino);
 ti = length(bini);

 oksam = 0;
 if to == ti
  if all(bino == bini)
   oksam = 1;
  end
 end

end
% #


% #################################
% ischf
% #################################
function [okchf,z,l,r] = ischf(wrd);

 % =================================
 if any(wrd == 0) wrd = 2*wrd-1; end
 % =================================

 okchf = 0; z = 0; l = 0; r = 1;

 i = 1; o = length(wrd);

 if o == 0 okchf = 0; r = 1; return; end

 % ###############
 noi = negi(wrd,i);
 nio = negi(noi,o);
 % ###############

 rdw = wrd;
 for j = 0:o
  % #########################################################
  if all(rdw == nio) l = o-j; r = j; z = l+r; okchf = z; end;
  % #########################################################
  rdw = trni(rdw);
 end

end
% #


% ##########################
% negi
% ##########################
function [neg] = negi(wrd,i);

 neg    = wrd;
 neg(i) = -neg(i);

end
% #


% #########################
% trni
% #########################
function [rdw] = trni(wrd);

 if length(wrd) > 1; rdw = [wrd(2:end) wrd(1) ]; else rdw = wrd; end

end
% #


% ##################################
% islap
% ##################################
function [oklap,Z,L,R] = islap(wrd);

 % =================================
 if any(wrd == 0) wrd = 2*wrd-1; end
 % =================================

 okchf = 0; l = 0; r = 1; z = 0;
 oklap = 0; L = 0; R = 1; Z = 0;

 i = 1; o = length(wrd);

 rdw = wrd;
 for j = i:o

  [okchf,z,l,r] = ischf(wrd(i:j));
  rdw = trni(rdw);

  % ##########################################
  if (all(rdw == wrd) & okchf) oklap = j; end;
  % ##########################################

  Z = oklap;
  L = max(l,L);
  R = max(r,R);

 end

end
% #

% :::::::::::::::::::::::::::::::::::::::::::::::::::
% www.chf.nu Current History of the Future 19-08-2020
% :::::::::::::::::::::::::::::::::::::::::::::::::::
ans =

    'ΜΕΤΑΜΟΡΦΟΣΙΣ'


all_in_order =

  1×5 logical array

   1   1   1   1   1