#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         G E N E R A T I O N   D E   L A   T A B L E   D E   M U L T I P L I C A T I O N                                             #
#         D ' U N   A U T O M A T E   C E L L U L A I R E   M O N O D I M E N S I O N N E L   B I N A I R E  :                        #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#              $xci/AutoC_1DB.01$Z <TableMultiplication>    "<regle1> ... <regle8>" [<EditerRegles> [<RendreContinu> [<Multiple>]]]   #
#              $xci/AutoC_1DB.01$Z <TableMultiplication>    <CodeDecimalRegle>      [<EditerRegles> [<RendreContinu> [<Multiple>]]]   #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xci/AutoC_1DB.01$Z' :                                                                                           #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, 20021005160000).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set       TableMultiplication=$1
set       Regles=($2)
set       EditerRegles=$3
set       RendreContinu=$4
                                        # Parametre introduit le 20081122174922...                                                    #
set       Multiple=$5
                                        # Parametre introduit le 20081126144027 et n'ayant de sens que si '$RendreContinu==$EXIST'... #

setArgum  EditerRegles                  $NEXIST

setArgum  RendreContinu                 $NEXIST

setArgum  Multiple                      1

XYmaxNe   $NOIR $BLANC $NOIR $BLANC
                                        # Dimensionnement de l'album a generer en {X,Y}.                                              #

$xci/AutoC_1DQ.01$Z "$xci/init$X n=$NOIR R=$TableMultiplication.%04d $formatI"
                                        # Initialisation a '$NOIR' de la table de multiplication (le 20021005190511 a ete introduite  #
                                        # l'utilisation de '$xci/AutoC_1DQ.01$Z', le 20021023161522 '$TableMultiplication', son       #
                                        # premier Argument ayant ete supprime car ne servant a rien...).                              #

source    $xci/AutoC_NDB$vv$Y
                                        # Definitions utiles a la definition d'un automate cellulaire binaire.                        #

if        ($#Regles == 1) then
                                        # La possibilite d'introduire le numero decimal du jeu de regles, plutot que ce jeu lui-meme  #
                                        # a ete introduite le 20030117142623. En particulier la regle '30' donne une structure        #
                                        # aleatoire, la regle '90' donne une structure fractale de type "Sierpinski", la regle        #
                                        # '250' donne une structure fixe...                                                           #

          set       VaLiDe=`echo $Regles | $GRE "^[$Alphabet_0_9]*"'$'`

          if        ("$VaLiDe" != "$K_VIDE") then
                    set       Puissance=256

                    set       LRegles=($K_VIDE)
                    set       LRegles=($LRegles $PointNoir_$PointNoir_$PointNoir_$SeparateuR)
                    set       LRegles=($LRegles $PointNoir_$PointNoir_$PointBlanc$SeparateuR)
                    set       LRegles=($LRegles $PointNoir_$PointBlanc$PointNoir_$SeparateuR)
                    set       LRegles=($LRegles $PointNoir_$PointBlanc$PointBlanc$SeparateuR)
                    set       LRegles=($LRegles $PointBlanc$PointNoir_$PointNoir_$SeparateuR)
                    set       LRegles=($LRegles $PointBlanc$PointNoir_$PointBlanc$SeparateuR)
                    set       LRegles=($LRegles $PointBlanc$PointBlanc$PointNoir_$SeparateuR)
                    set       LRegles=($LRegles $PointBlanc$PointBlanc$PointBlanc$SeparateuR)

                    set       IRegles=1
                                        # Liste des 8 regles a generer et index de parcours...                                        #

                    if        (($Regles < $Puissance) && ($Regles >= 0)) then
#20111214165404____:                              set       Cumul="$K_VIDE"                                                           #
                              SET1      Cumul = "$K_VIDE"

                              set       Nombre=$Regles

                              while     ($Puissance > 1)
                                        @         Puissance = $Puissance / 2

                                        set       Cumul="$Cumul"" $LRegles[$IRegles]"

                                        if        ($Nombre >= $Puissance) then
                                                  set       Cumul="$Cumul""$PointNoir_"
                                        # Cas d'un "1" binaire...                                                                     #

                                                  @         Nombre = $Nombre - $Puissance
                                        else
                                                  set       Cumul="$Cumul""$PointBlanc"
                                        # Cas d'un "0" binaire...                                                                     #
                                        endif

                                        @         IRegles = $IRegles + 1
                              end

                              set       Regles=`echo "$Cumul" | $SE -e "s/^ *//"`
                    else
                              EROR      "Le numero du jeu de regles est incorrect (1)."
                    endif
          else
                    EROR      "Le numero du jeu de regles est incorrect (2)."
          endif
else
endif

if        ($#Regles > 8) then
          EROR      "Le nombre de regles maximal est 8 alors qu'il y en a $#Regles."
else
endif

if        ($EditerRegles == $EXIST) then
          echo      "Regles utilisees : {$Regles}."

          FileTmpB  MiSe_A_JoUr_1 $sed
          FileTmpB  MiSe_A_JoUr_2 $sed

          echo      "$Regles"                                                                                                     |     \
          $R        "$K_BLANC" "$K_NL"                                                                                            |     \
          $GRE      -v '^ *$'                                                                                                     |     \
          $AW       ' { print "s/" $1 "/" $1 "/" } '                                                                              |     \
          $SE       -e "s/\(=\)./\1?/1"                                                                                                 \
                                                                                                    >   $MiSe_A_JoUr_1

          $CA       $MiSe_A_JoUr_1                                                                                                |     \
          $SE       -e "s/=/:/g"                                                                                                        \
                    -e 's+\(/\)[^/]*:\(./\)$+\1\2+'                                                                                     \
                                                                                                    >   $MiSe_A_JoUr_2

          $CA       $xci/AutoC_1DB.01$D/cubes.01$vv$T                                                                             |     \
          $SE       -f $MiSe_A_JoUr_1                                                                                                   \
                    -f $MiSe_A_JoUr_2
                                        # Edition des regles sous forme de deux cubes (introduite le 20081204091948)...               #

          FileTmpE  MiSe_A_JoUr_2
          FileTmpE  MiSe_A_JoUr_1
else
endif

foreach   Regle     ($Regles)
                                        # Un bon exemple est la regle numero '110' en notation francaise :                            #
                                        #                                                                                             #
                                        #                   "NNN=B NNB=N NBN=N NBB=B BNN=N BNB=N BBN=N BBB=B"                         #
                                        #                                                                                             #
                                        # ou en notation anglaise :                                                                   #
                                        #                                                                                             #
                                        #                   "BBB=W BBW=B BWB=B BWW=W WBB=B WBW=B WWB=B WWW=W"                         #
                                        #                                                                                             #
                                        # en prenant "bord=$BLANC" pour eviter les effets de bord...                                  #
          set       Points=`echo "$Regle" | $SE -e "s/$SeparateuR//" -e "s/\(.\)/\1 /g" -e 's/  *$//'`

          if        ($#Points == 4) then
                    if        ($Points[1] == $PointNoir_) then
                              set       PointGauche=$NOIR
                    else
                              if        ($Points[1] == $PointBlanc) then
                                        set       PointGauche=$BLANC
                              else
                                        EROR      "La regle '$Regle' est mal formee (1)."

                                        set       PointGauche=$NOIR
                              endif
                    endif

                    if        ($Points[2] == $PointNoir_) then
                              set       PointCourantAvant=$NOIR
                    else
                              if        ($Points[2] == $PointBlanc) then
                                        set       PointCourantAvant=$BLANC
                              else
                                        EROR      "La regle '$Regle' est mal formee (2)."

                                        set       PointCourantAvant=$NOIR
                              endif
                    endif

                    if        ($Points[3] == $PointNoir_) then
                              set       PointDroite=$NOIR
                    else
                              if        ($Points[3] == $PointBlanc) then
                                        set       PointDroite=$BLANC
                              else
                                        EROR      "La regle '$Regle' est mal formee (3)."

                                        set       PointDroite=$NOIR
                              endif
                    endif

                    if        ($Points[4] == $PointNoir_) then
                              set       PointCourantApres=$NOIR
                    else
                              if        ($Points[4] == $PointBlanc) then
                                        set       PointCourantApres=$BLANC
                              else
                                        EROR      "La regle '$Regle' est mal formee (4)."

                                        set       PointCourantApres=$NOIR
                              endif
                    endif

                    set       PointCourantAvant=`$xci/nombres$X A="$K_VIDE" premiere=$PointCourantAvant derniere=$PointCourantAvant`

                    $xci/S_point$X      A=$TableMultiplication.$PointCourantAvant                                                       \
                                        X=$PointDroite Y=$PointGauche                                                                   \
                                        niveau=$PointCourantApres                                                                       \
                                        R=$TableMultiplication.$PointCourantAvant                                                       \
                                                                                                                        $formatI
                                        # On n'oubliera pas les correspondances suivantes :                                           #
                                        #                                                                                             #
                                        #                   point_a_gauche  --> Y                                                     #
                                        #                   point__courant  --> Z                                                     #
                                        #                   point_a_droite  --> X                                                     #
                                        #                                                                                             #
                                        # soit encore :                                                                               #
                                        #                                                                                             #
                                        #                   X               --> point_a_droite                                        #
                                        #                   Y               --> point_a_gauche                                        #
                                        #                   Z               --> point__courant                                        #
                                        #                                                                                             #
                                        # ('v $xiii/Images$DEF AUTOMATE_CELLULAIRE.automate_cellulaire').                             #
          else
                    EROR      "La regle '$Regle' est mal formee (5)."
          endif
end

if        ($RendreContinu == $EXIST) then
                                        # Test introduit le 20081122174922...                                                         #
          alias     GetNiVo   'set       CooX=\!:1 ; set CooY=\!:2 ; set CooZ=\!:3                                                ;    \\
                               set       NuMeRo=`$xci/nombres$X A="$K_VIDE" premiere=$CooZ derniere=$CooZ`                        ;    \\
                               $xci/print$X   A=$TableMultiplication.$NuMeRo X=$CooX Y=$CooY editerX=FAUX editerY=FAUX Prme=VRAI  ;    \\
                               unset     CooX CooY CooZ NuMeRo'
                                        # Recuperation de l'automate cellulaire binaire...                                            #

          set       Niveau_X0_Y0_Z0=`GetNiVo $NOIR  $NOIR  $NOIR`
          set       Niveau_X0_Y0_Z1=`GetNiVo $NOIR  $NOIR  $BLANC`

          set       Niveau_X1_Y0_Z0=`GetNiVo $BLANC $NOIR  $NOIR`
          set       Niveau_X1_Y0_Z1=`GetNiVo $BLANC $NOIR  $BLANC`

          set       Niveau_X1_Y1_Z0=`GetNiVo $BLANC $BLANC $NOIR`
          set       Niveau_X1_Y1_Z1=`GetNiVo $BLANC $BLANC $BLANC`

          set       Niveau_X0_Y1_Z0=`GetNiVo $NOIR  $BLANC $NOIR`
          set       Niveau_X0_Y1_Z1=`GetNiVo $NOIR  $BLANC $BLANC`

          unalias   GetNiVo

          FileTmpB  File_Niv_X0_Y0
          FileTmpB  File_Niv_X1_Y0
          FileTmpB  File_Niv_X1_Y1
          FileTmpB  File_Niv_X0_Y1
          FileTmpB  File_Z
          FileTmpB  File_CoMmAnDeS
          FileTmpB  File_CoNtInU $Y

          if        ($Multiple == 1) then
                    set       RendreMultiple="multiple=FAUX"
          else
                    set       RendreMultiple="multiple=VRAI unite=$Multiple"
                                        # Possibilite introduite le 20081126144027 afin d'introduire des "discontinuites" dans        #
                                        # les interpolations qui suivent...                                                           #
          endif

          $xci/valeurs_inte$X           premiere=$NOIR derniere=$BLANC                                                                  \
                                        lineaire=VRAI                                                                                   \
                                        entiers=VRAI epsilon=0.000001                                                                   \
                                        $RendreMultiple                                                                                 \
                                        vD=$Niveau_X0_Y0_Z0 vA=$Niveau_X0_Y0_Z1                                                         \
                                                                                                    >   $File_Niv_X0_Y0
                                        # Interpolation du niveau suivant la coordonnee 'Z' pour X=0 et Y=0.                          #
          $xci/valeurs_inte$X           premiere=$NOIR derniere=$BLANC                                                                  \
                                        lineaire=VRAI                                                                                   \
                                        entiers=VRAI epsilon=0.000001                                                                   \
                                        $RendreMultiple                                                                                 \
                                        vD=$Niveau_X1_Y0_Z0 vA=$Niveau_X1_Y0_Z1                                                         \
                                                                                                    >   $File_Niv_X1_Y0
                                        # Interpolation du niveau suivant la coordonnee 'Z' pour X=1 et Y=0.                          #
          $xci/valeurs_inte$X           premiere=$NOIR derniere=$BLANC                                                                  \
                                        lineaire=VRAI                                                                                   \
                                        entiers=VRAI epsilon=0.000001                                                                   \
                                        $RendreMultiple                                                                                 \
                                        vD=$Niveau_X1_Y1_Z0 vA=$Niveau_X1_Y1_Z1                                                         \
                                                                                                    >   $File_Niv_X1_Y1
                                        # Interpolation du niveau suivant la coordonnee 'Z' pour X=1 et Y=1.                          #
          $xci/valeurs_inte$X           premiere=$NOIR derniere=$BLANC                                                                  \
                                        lineaire=VRAI                                                                                   \
                                        entiers=VRAI epsilon=0.000001                                                                   \
                                        $RendreMultiple                                                                                 \
                                        vD=$Niveau_X0_Y1_Z0 vA=$Niveau_X0_Y1_Z1                                                         \
                                                                                                    >   $File_Niv_X0_Y1
                                        # Interpolation du niveau suivant la coordonnee 'Z' pour X=0 et Y=1.                          #
          $xci/nombres$X                A="$K_VIDE"                                                                                     \
                                        premiere=$NOIR derniere=$BLANC                                                            |     \
          $R                            "$K_BLANC" "$K_NL"                                                                        |     \
          $GRE                          -v '^ *$'                                                                                       \
                                                                                                    >   $File_Z
                                        # Interpolation de la coordonnee 'Z'...                                                       #
                                        #                                                                                             #
                                        # On notera le "epsilon=0.000001" destine en particulier a faire que si 'vD=vA' (par exemple  #
                                        # egal a '$BLANC'...), alors toutes les valeurs entieres editees sont egales entre-elles et   #
                                        # aux bornes 'vD' et 'vA"...                                                                  #

          set       FoRmAtR=`echo $formatI | $SE -e "s/\(=\)/R\1/g"`
          set       VaLiDeA="ValiderAxes=FAUX"

          set       ChAiNe0='$xci/init$X niveau=$NOIR'
          set       ChAiNe1=' $VaLiDeA $formatI | $xci/S_point$X x=$Xmin y=$Ymin niveau='
          set       ChAiNe2=' $VaLiDeA $formatI | $xci/S_point$X x=$Xmax y=$Ymin niveau='
          set       ChAiNe3=' $VaLiDeA $formatI | $xci/S_point$X x=$Xmax y=$Ymax niveau='
          set       ChAiNe4=' $VaLiDeA $formatI | $xci/S_point$X x=$Xmin y=$Ymax niveau='
          set       ChAiNe5=' $VaLiDeA $formatI | $xci/format.01$X mode=1 R=$TableMultiplication.'
          set       ChAiNe6=' $VaLiDeA $FoRmAtR'
                                        # Definition des commandes destinees a rendre "pseudo-continu" l'automate cellulaire par      #
                                        # interpolation via '$xci/format.01$X mode=1'. On notera qu'il serait aussi possible          #
                                        # d'utiliser '$xci/fract_2D.01$X source=VRAI', mais le passage par des coordonnees {X,Y}      #
                                        # normalisees (et donc des conversions entiers <--> flottants) risque de conduire, de temps   #
                                        # en temps, a des anomalies...                                                                #

          $PAST                         $File_Niv_X0_Y0 $File_Niv_X1_Y0 $File_Niv_X1_Y1 $File_Niv_X0_Y1 $File_Z                   |     \
          $AW                           ' { print "=0==1=" $1 "=2=" $2 "=3=" $3 "=4=" $4 "=5=" $5 "=6=" } '                       |     \
          $SE                           -e "s+=0=+$ChAiNe0+"                                                                            \
                                        -e "s+=1=+$ChAiNe1+"                                                                            \
                                        -e "s+=2=+$ChAiNe2+"                                                                            \
                                        -e "s+=3=+$ChAiNe3+"                                                                            \
                                        -e "s+=4=+$ChAiNe4+"                                                                            \
                                        -e "s+=5=+$ChAiNe5+"                                                                            \
                                        -e "s+=6=+$ChAiNe6+"                                                                            \
                                                                                                    >   $File_CoMmAnDeS

          $CA       $xcs/csh$Y                                                                                                          \
                                                                                                    >   $File_CoNtInU

          $CA       $File_CoMmAnDeS                                                                                                     \
                                                                                                    >>! $File_CoNtInU

          SformatI
          XYmaxNe   0 1 0 1
          source    $File_CoNtInU
          RformatI
                                        # Et ainsi, on rend "pseudo-continu" l'automate cellulaire binaire...                         #

          FileTmpE  File_CoNtInU
          FileTmpE  File_CoMmAnDeS
          FileTmpE  File_Z
          FileTmpE  File_Niv_X0_Y1
          FileTmpE  File_Niv_X1_Y1
          FileTmpE  File_Niv_X1_Y0
          FileTmpE  File_Niv_X0_Y0
else
endif



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.