Acesta realizează atât comunicarea dintre joc și jucător (prin intermediul unor pipe-uri), cât și paralelizarea instanțelor de joc (perechilor "game"-"player" active). Fiecare proces de tip "game" pornit de conector va genera (ca rezultat al pasării unor argumente prin "execv()" ) un fișier "desfășurareX.txt" (unde "X" reprezintă numărul instanței de joc), în care se vor păstra încercările și numărul acestora. În final, conectorul va calcula media încercărilor și va concatena desfășurările jocurilor în fișierul "desfășurareFin.txt", ștergând ulterior fișierele temporare.
Jocul implementează un comportament de tip "buggy" (în care literele ce se potrivesc sunt marcate cu verde, iar cele prezente în cuvânt -marcate deja sau nu- sunt colorate cu galben). Jocul afișează la începutul unei sesiuni de joc cuvântul "Go", iar la final cuvântul "Stop" (în scopul comunicării cu programul "player"; la fiecare "Go" al jocului, player-ul incepe o sesiune nouă de joc). Cuvintele se citesc din fișierul "cuvinte_wordle.txt".
Playerul calculează la fiecare pas cel mai bun mod de a face o alegere pentru a obține entropia maximă pentru răspunsul dat. Acesta utilizează o strategie de tip greedy, alegând cuvântul ce generează maximul de informație din perspectiva unei singure tranziții de joc, neluând în calcul potențialele decizii ulterioare (din motive de performanță). Algoritmul din spatele "player"-ului (în pseudocod) este următorul:
-
Pentru
$r \in R$ ($R$ este mulțimea raspunsurilor) execută -
$\space\space\space\space$ calculează entropia lui$r$ -
$\space\space\space\space$ Daca$r$ dă o entropie mai buna Atunci -
$\space\space\space\space\space\space\space\space$ salvează$r$ drept cel mai bun răspuns de pană acum -
$\space\space\space\space$ sfârșit - sfârșit
- Folosește răspunsul calculat la pașii 1-6
-
Obține
$c$ configurația de la joc și setează$S:=S\setminus \{ s \in S | feedback(best, s)\ne c\}$ ($S$ este mulțimea soluțiilor posibile) -
Dacă
$|S|\ne1$ Atunci -
$\space\space\space\space$ Repetă de la pasul 1 - sfârșit
Media încercărilor este 4,14. Numărul maxim de încercări per cuvânt este 7 (pentru cuvintele "HUNII" și "NUNII"). Întreaga simulare durează aproximativ 4 min. (pe un Ryzen 7 4800H, cu setarea de 16 thread-uri dată programului "connect").
Entropia unui răspuns
- Cuvântul oferit inițial de "player" este întotdeauna "TAREI" (din lipsă de alte informații), astfel încat îl afișăm mereu înainte de orice calcul al entropiei (e hard-coded).
- De asemenea, algoritmul inițializează spațiul soluțiilor doar după ce a primit configurația corespunzatoare răspunsului inițial. Această optimizare are rolul de a reduce numărul de calcule efectuate la începutul unei sesiuni.
- În calculul entropiei, având în vedere că, pentru un cuvand candidat fixat, configurații egale returnate de joc oferă informație egală, algoritmul salvează frecvențele configurațiilor întoarse și le folosește drept ponderi în calculul entropiei (echivalent cu a da factor comun termenii egali în formula entropiei).
Pentru a rula simularea folosiți comenzile:
- g++ game.cpp -o game
- g++ player.cpp -o player
- g++ connect.cpp -o connect
- ./connect game player
O configurație este reprezentată de un șir de 5 caractere din mulțimea
- Ilie Dumitru
- Popescu Ștefan - Alexandru