#!/bin/sh

cat <<EOF
# prog.sh  (Fibonacci-Nim game)
# permet de déterminer les coups à jouer dans le jeu de Fibonacci-Nim
# en construisant une image (fractale) des coups possibles à tout moment
# lorsque le nombre d'allumettes du tas est inférieur ou égal à N
#
# le programme n'utilise pas la numération de Zeckendorf
# la recherche du noyau s'effectue en utilisant la définition du graphe
# dont les sommets sont les couples (a, b) où a est le nombre d'allumettes
# du tas et b est le nombre maximum d'allumettes dont le retrait est autorisé
# (a, b) a pour successeurs (a-i, 2*i) avec 1<= i <= b
#
# il est possible de modifier la règle et d'adapter ce programme à des
# variantes de Fibonacci-Nim
#
# il est aussi possible de construire la fonction de Grundy dans un fichier html
# Décommenter la ligne   # htmltable("tableGrundy.html") en retirant le #
# pour obtenir :         htmltable("tableGrundy.html")
#
# Copyright 2003-2005 Jean-Paul Davalan <jpdvl@wanadoo.fr>
# http://perso.wanadoo.fr/jean-paul.davalan/jeux/nim/fibonacci/
#
EOF

# nécessite gawk (ou awk, dans ce cas modifier ci-dessous) 
AWK=gawk

# gnuplot 
# pstoimg  (fichier perl de la distribution de latex2html)

# Nombre maximum de pions (ou d'allumettes) du tas au moment de jouer

N=100

echo ""| $AWK -v N=$N '
function Grundy(a, b,    u,i,m,k) {
  if(a==0) {
    t[a, b]=0
    return 0;
  }
  if(t[a, b] != "") return t[a, b];
  u=b;
  if(u>a) u=a;
  for(i=1;i<=u;i++) {
    k = Grundy(a-i, 2*i);
    m[k] = 1;
  }
  k=0;
  while(m[k]==1) k++;
  t[a, b] = k;
  delete m;
  return k;
}

function p2c( k,r,g) {
  # mise en forme
  for(k=N;k>=1;k--) {
    for(r=1;2*r<k;r++) {
      g=Grundy(k,2*r)
      if(g==0) {
        #print k+r " --> " k
        # on arrive en k en venant de k+r
        tk[ k+r, k] = 1;
      }
    }
  }
  for(k=1;k<=N;k++) {
    s="";
    for(r=1;r<k;r++) {
      if(tk[ k, r] == 1) print k"  "r;
    }
  }
}
function htmltable(fic) {
print "<html>\n<body>\n" > fic
print "<h1>Valeurs de la fonction de Grundy</h1>"   > fic
print "<table border=0 cellpadding=1>\n<tr bgcolor=\"#ffff00\"><td>n\\p</td>"  > fic
for(i=1;i<=N;i++) 
  printf("<td>%2s</td>",i)  > fic

print "</tr>"  > fic

for(i=N;i>=0;i--) {
  if(i%2==0)bg="#55ff88" 
  else bg="#b5ffd3"
  printf("<tr bgcolor=\"%s\"><td bgcolor=\"#ff9696\">%d</td>",bg,i)  > fic
  for(j=1;j<=N;j++) {
    if(j<=i) printf("<td>%d</td>",Grundy(i,j))   > fic
    else printf("<td>&nbsp;</td>")   > fic
  }
  print "</tr>"  > fic
}
print "</table></body></html>"  > fic
}
END {
  if(N=="") N=100
  # htmltable("tableGrundy.html") 
  p2c() 
} '  > "pts100.g";


echo 'set terminal postscript eps color "TimesNewRoman" 12;set output "fig100.eps"; set nokey;set grid;plot "pts100.g" with points,x with lines'|gnuplot

pstoimg -antialias -aaliastext -scale 1.3 -type png -o fig100.png fig100.eps


