Quelles chances donnez vous à Daniël ?

Donnez votre avis !

Modérateur : Politburo

Quelle est d'après vous la proposition la plus invraisemblable

- C.Ret tu as bien fait Dani?l va pouvoir sauter ?ternellement sur cet ?chiquier infini; tu est un bienfaiteur des animaux de compagnie.
9
53%
- C.Ret tu es b?te, jamais Dani?l n'atteindra la case n?961.
0
Aucun vote
- C.Ret tu es un idiot, ce pauvre cavalier est maintenant condamn?, il ne fera pas plus de 2016 sauts.
1
6%
- C.Ret tu es un monstre, Dani?l va maintenant rester coinc? sur la case n?2084. Toi qui voulais que Dani?l soit libre ? jamais :(
7
41%
 
Nombre total de votes : 17

jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: Quelles chances donnez vous à Daniël ?

Message par jxano »

Je pouvais chercher longtemps avec un programme naïf sur fx-880P et "affichage" des résultats dans le Bloc-Notes... Mais ce matin, je me suis décidé à adapter tout ça en C et ce soir, c'est plié. J'ai vu.

J'ai l'impression d'avoir vu ça dans un bouquin, mais je n'arrive pas à me rappeler où.
Programmeur abscons.
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Quelles chances donnez vous à Daniël ?

Message par gege »

Bonjour,
Hop un petit programme pour Casio Graph 85 SD (ou pas d'ailleurs) :

Code : Tout sélectionner

SPIULAM
"N="?→N
0→X:0→Y:{1}→List 1
{2,1,2,‾‾1,1,2,1,‾2,‾2,1,‾2,‾1,‾1,2,‾1,‾2}→List 2:ClrGraph
ViewWindow ‾63,64,1,‾31,32,1
For 1→J To N:1ᴱ99→S

For 1→K To 15 Step 2
X+List 2[K]→T
Y+List 2[K+1]→U
Prog "SPINUM"
If R<S:Then 
Prog "SPIFIND"
If 0=I:Then 
R→S:T→V:U→W
IfEnd:IfEnd
Next

If 1ᴱ99≤S:Then 
"COINCE"▲
{J,X,Y}▲
Return:IfEnd

V→X:W→Y:Augment(List 1,{S})→List 1
PlotOn X,Y
Next
Avec ses deux potes sous-programmes :

Code : Tout sélectionner

SPINUM
Max({Abs T,Abs U})→P
4P²+3P+1→R
If U=‾P:Then R+T→R:Return:IfEnd:R-2P→R
If T=‾P:Then R-U→R:Return:IfEnd:R-2P→R
If U=P:Then R-T→R:Return:IfEnd:R-2P+U→R
Et :

Code : Tout sélectionner

SPIFIND
For Dim List 1→I To 1 Step ‾1
R=List 1[I]=>Return
Next:0→I
On pourrait coller les sous-programmes dans le programme principal mais ça me semble plus clair ainsi.

Le truc affiche le parcours de notre copain, et si on attend assez longtemps... :-)
G.E.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: Quelles chances donnez vous à Daniël ?

Message par jxano »

Et voici donc mon programme C (créer un projet "console" pour y insérer le source) :

Code : Tout sélectionner

/* Parcours du cavalier dans une spirale carrée, dite "d'Ulam". */

#include <stdio.h>
#include <string.h>

#define PRO "canaspir version Nov  2 2020"
#define SPI 40

int gaaiSpi[2*SPI][2*SPI], gaaiBon[2*SPI][2*SPI], giSpi= 5, giLim= 100;

void Construire ()
{ int i, j, iInf, iSup, n= 0;
for (i=0;i<(2*SPI);++i) for (j=0;j<(2*SPI);++j) gaaiBon[i][j]= 0;
for (i=0;i<SPI;++i)
  {
  iInf= SPI-i, iSup= SPI+i;
  for (j=iInf; j<=iSup; ++j) ++n, gaaiSpi[j][SPI-1-i]= n;
  for (j=iInf; j<=iSup; ++j) ++n, gaaiSpi[SPI+i][j]= n;
  iSup= SPI-1+i, iInf= SPI-1-i;
  for (j=iSup; j>=iInf; --j) ++n, gaaiSpi[j][SPI+i]= n;
  for (j=iSup; j>=iInf; --j) ++n, gaaiSpi[SPI-i-1][j]= n;
  }
}

void Cellule(int iL, int iC)
{ int iN= 1, iD; char c;
if (gaaiSpi[iL][iC]<1000) iN= 2;
if (gaaiSpi[iL][iC]<100) iN= 3;
if (gaaiSpi[iL][iC]<10) iN= 4;
if (iC)
  { iD= gaaiSpi[iL][iC] - gaaiSpi[iL][iC-1];
  if (iD==1 || iD==-1) c='_'; else c=' '; }
for (;iN>0;--iN) printf ("%c", c); printf ("%d", gaaiSpi[iL][iC]);
}

void NroBond (int iB, char *pcN)
{ int i1, i2;
if (!iB) { pcN[0]= ' ', pcN[1]= ' '; return; }
i1= (iB-1)%52, i2= (iB-1)/52;
if (i1<26) pcN[1]='A'+i1; else i1-=26, pcN[1]='a'+i1;
if (i2)
  { --i2; if (i2<26) pcN[0]='A'+i2; else i2-= 26, pcN[0]='a'+i2; }
else pcN[0]=' ';
}

void SurCellule(int iL, int iC)
{ int iD, iBon, i1, i2; char c, acNro[4]= {'-','-',0};
if (iL)
  {
  iD= gaaiSpi[iL][iC] - gaaiSpi[iL-1][iC];
  if (iD==1 || iD==-1) c='|'; else c=' ';
  }
else c=' ';
NroBond (gaaiBon[iL][iC], acNro);
printf (" %s %c", acNro, c);
}

void Afficher ()
{ int i, j;
for (i=1;i<(2*SPI-1);++i)
  {
  for (j=1;j<(2*SPI-1);++j) SurCellule(i, j); printf ("\n");
  for (j=1;j<(2*SPI-1);++j) Cellule(i,j); printf ("\n");
  }
}

void AffCompact (int iD)
{ int i, j, iInf, iSup;
  char acNro[4]= {'-','-',0};
iInf= SPI-1-giSpi, iSup= SPI+giSpi;
for (i=iInf;i<=iSup;++i)
  {
  for (j=iInf;j<iSup;++j) 
    if (!gaaiBon[i][j]) printf (" .");
    else if (gaaiBon[i][j]<iD) printf ("[]");
    else { NroBond (gaaiBon[i][j], acNro); printf ("%s", acNro); }
  printf ("\n");
  }
}

char EncoreDedans (int *piL, int *piC)
{ int iL, iC, iNL, iNC, iMin=10000;
/*printf ("Entree dans ED : %d,%d).\n", *piL, *piC);*/
iNL= *piL+1, iNC= *piC+2;
if (iNL>=(2*SPI) || iNC>=(2*SPI)) return 'A';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL+2, iNC= *piC+1;
if (iNL>=(2*SPI) || iNC>=(2*SPI)) return 'B';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL+2, iNC= *piC-1;
if (iNL>=(2*SPI) || iNC<0) return 'C';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL+1, iNC= *piC-2;
if (iNL>=(2*SPI) || iNC<0) return 'D';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL-1, iNC= *piC-2;
if (iNL<0 || iNC<0) return 'E';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL-2, iNC= *piC-1;
if (iNL<0 || iNC<0) return 'F';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL-2, iNC= *piC+1;
if (iNL<0 || iNC>=(2*SPI)) return 'G';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
iNL= *piL-1, iNC= *piC+2;
if (iNL<0 || iNC>=(2*SPI)) return 'H';
if (!gaaiBon[iNL][iNC] && iMin>gaaiSpi[iNL][iNC])
  iL= iNL, iC= iNC, iMin= gaaiSpi[iNL][iNC];
if (iMin==10000)
  { printf ("BLOCAGE en (%d,%d)\n", *piL, *piC); return 'I'; }
if (gaaiSpi[iL][iC]>giLim) ++giSpi, giLim= 4*giSpi*giSpi;
*piL= iL, *piC= iC; return 'o';
}

int main()
{ int n= 1, iL= SPI, iC= SPI-1, iDeb= 1; char cRep= '-';
printf ("DEBUT %s : fait le %s a %s.\n", PRO, __DATE__, __TIME__);
Construire ();
printf ("Au debut : %d en (%d,%d).\n", n, iL, iC);
do
  { gaaiBon[iL][iC]= n;
  if (!(n%52))
    { if (SPI<23) Afficher (); else AffCompact (iDeb);
    printf ("SAUT %d en case %d (%d,%d)...", n, gaaiSpi[iL][iC], iL, iC); 
    iDeb= n; getchar(); }
  ++n; }
while ((cRep= EncoreDedans (&iL, &iC)) == 'o');
if (SPI<23) Afficher (); else AffCompact (iDeb);
printf ("DERNIER BOND : %d en case %d (%d,%d), reponse %c.\n",
  n, gaaiSpi[iL][iC], iL, iC, cRep);
printf ("FIN %s, sans erreur.\n", PRO); return 0;
}
Il y a deux systèmes d'affichage en fonction de la constante SPI (nombre de spires) à modifier avant compilation. Le deuxième adapte la taille de l'affichage à la croissance du patatoïde.
Programmeur abscons.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Quelles chances donnez vous à Daniël ?

Message par C.Ret »

Ah! Ah!

Du C, une CASIO, un Commodore !!!

Heureusement que je m'y suis pris en avance, car mon canasson avance à son pas de sénateur sur 8-bits et en Microsoft BASIC v7-0 !

Et oui, bien que l'échiquier que je lui ai offert soit infini (j'ai d'ailleurs toujours pas fini de le payer), son entêtement conduit à cette fin inéluctable.
Daniël move #2016.gif
Daniël move #2016.gif (85.39 Kio) Vu 7820 fois
Heureusement, un petit SPRMOV 1,151,125 remet tout en place et un SCNCLR 1 permet de le lâcher à nouveau et de le laisser gambader avec un petit RUN.
Nous ne sommes pas les premiers à avoir observé ce résultat : une petite vidéo en anglais montre un illustre personnage qui semble en être ravi ! Je partage son enthousiasme.


Comme vous m'avez donné vos codes, je donne ci-dessous un des miens :

Code : Tout sélectionner

list

5 data -2,-1, -1,-2, +1,-2, +2,-1, +2,+1, +1,+2, -1,+2, -2,+1
100 color 0,rclr(6):color 1,rclr(5):color 4,rclr(0):graphic 1,1:graphic 5
110 t=1:x=53:y=36:s=3:n=1:i=.:j=.:w=.:v=.:r=.:d=.:l=.:a=x:b=y:c=.:x%=.:y%=.
120 dim n%(159,99),dx(7),dy(7):n%(a,b)=-1
130 restore:for w=0 to 7:read dx(w),dy(w):next w:timer$="000000"
200 do
210 :  char 1,0,0,timer$+str$(t)+str$(n%(x,y)),1:char 1,33,0,str$(x-53)+str$(y-36)
220 :  t=t+1:x%=s*x-1:y%=s*y-1:box 1,x%,y%,x%+2,y%+2,0,1
230 :  r=9e23:w=-1
240 :  for v=0 to 7
250 :  :  i=x+dx(v):j=y+dy(v):draw 0,s*i,s*j
260 :  :  do while n%(i,j)=0
270 :  :  :  draw 1,s*a,s*b:if l=c then l=0:d=d+1 and 3:if d=1 or d=3 then c=c+1
280 :  :  :  l=l+1:n=n+1:a=a+(d=3)-(d=1):b=b+(d=2)-(d=0):draw 1 to s*a,s*b:n%(a,b)=n
290 :  :  char 0,0,24,str$(n):loop
300 :  :  if n%(i,j)>0 and n%(i,j)<r then r=n%(i,j):w=v:char 1,0,23,str$(r)+"  "
310 :  next v:if w<0 then exit
320 :  draw 0,s*x,s*y:x=x+dx(w):y=y+dy(w):n%(x,y)=-n%(x,y)
330 loop

ready.

Lignes 5 - 130 Initialisation (page graphique, les variables et tableaux, les coordonnées des huit sauts que sait faire Daniël.
Lignes 200 - 330 : Boucle principale - Daniël est placé et dessiné par un petit carré plein (cf. ligne 220).
Lignes 240-310 : Test possibilité des huit sauts autour de la position de Daniël.
Lignes 260-290 : Agrandi la spirale au fur et à mesure des besoins (des tests en fait)
Variables :
x y t : coordonnées de Daniël et compteur de ses mouvements
a b n : coordonnée et indice du dernier point de la spirale carrée
l c d : longueur, prochain coude et direction du segment de la spirale
i j v w r: coordonnées du saut envisagé, indice du saut et du meilleurs saut vers l'indice record (minimal donc)
s x% y% : échelle et coordonnées graphiques
Tableaux:
n%( , ) : Indices des cafes de l'échiquier (0 si non encore déterminé)
dx(),dy() : direction relative des huit sauts que sait faire Daniël.

Ainsi que le résultat graphique (commenté)

Daniël's boardmap.gif
Daniël's boardmap.gif (52.44 Kio) Vu 7808 fois
Mon idée est maintenant de voir si le même type de dénouement se produit si je lâche Daniël sur une autre cafe que la cafe initiale n°1 ?
Modifié en dernier par C.Ret le 03 nov. 2020 19:41, modifié 4 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
rogeroge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4221
Enregistré le : 14 mai 2010 21:41
Localisation : Entre Nancy et Bercy : à Torcy

Re: Quelles chances donnez vous à Daniël ?

Message par rogeroge »

En considérant que tu n'es pont un idiot, sans autre formalité explicative,
intuitivement, mon vote et c'est le seul aurait donc validé 2016 sauts ?????
Il faut être fou pour venir sur ce site mais encore plus fou pour ne pas y revenir !
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: Quelles chances donnez vous à Daniël ?

Message par Danny »

Jolie l'île !

Le gars de Numberphile propose une variante où il part d'un "coin" et suit un chemin en diagonales : https://www.youtube.com/watch?v=RGQe8waGJ4w

Y a même une idée de cadeau de Noël pour C.Ret : https://teespring.com/numberphile-trapp ... cid=101810

Image
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3400
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Quelles chances donnez vous à Daniël ?

Message par C.Ret »

Ah! Oui, taille 4/5 ou large SVP ! :)

Sinon, un tee-shirt blanc avec " Commodore C128D Personal Computer " marqué dessus en beige clair serait très bien aussi :D :D

Mais surtout pas de C64 ! Pas assez de RAM et un BASIC incapable de dessiner Daniël sans une armada de POKE et PEEK. Beurk!
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: Quelles chances donnez vous à Daniël ?

Message par jxano »

J'ai eu l'idée de sortir le dada de son trou fâcheux en le faisant reculer d'un pas pour le laisser continuer sa course une fois la case litigieuse bouchée. Tombera-t-il dans un second trou ? Pour l'instant, il a seulement atteint la 39ème spire sans encombres.
Programmeur abscons.
Répondre

Retourner vers « Sondages »