CoddityTeam / movaicode

Concours mensuel du Pire Développeur de France
123 stars 10 forks source link

La machine de Turing sur son coulis de C #54

Closed cigix closed 2 years ago

cigix commented 3 years ago

Quand on m'a dit "Comment tu écrirais du code de la manière la moins optimisée ?" j'ai tout de suite pensé : machine de Turing. Ça peut tout faire, une machine de Turing! Et c'est chiant à coder, et débugger, et complètement illisible, parfait pour faire du movai code.

... Bon en vrai c'est EXTRÊMEMENT chiant à coder du coup j'ai aussi créé un métalangage et son parseur pour pas avoir à gérer ça à la main.

Du coup, voilà un reverse string, en C, mais exécuté en interprétant les états d'une machine de Turing:

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

#define TAPE_LENGTH 1024

#define NUL (0)
#define EOT (0x03)

#define LEFT (-1)
#define RIGHT (1)
#define FINAL (0)

struct rule
{
  int state;
  char read;
  char write;
  int dir;
  int destination;
};

static struct rule rules[] = {
  { 0, ' ', ' ', RIGHT, 0 },
  { 0, 'A', 'A', RIGHT, 0 },
  { 0, 'C', 'C', RIGHT, 0 },
  { 0, 'D', 'D', RIGHT, 0 },
  { 0, 'E', 'E', RIGHT, 0 },
  { 0, 'I', 'I', RIGHT, 0 },
  { 0, 'M', 'M', RIGHT, 0 },
  { 0, 'O', 'O', RIGHT, 0 },
  { 0, 'V', 'V', RIGHT, 0 },
  { 0, EOT, EOT, RIGHT, 0 },
  { 0, NUL, NUL, LEFT, 1 },
  { 1, ' ', ' ', LEFT, 20 },
  { 1, 'A', 'A', LEFT, 20 },
  { 1, 'C', 'C', LEFT, 20 },
  { 1, 'D', 'D', LEFT, 20 },
  { 1, 'E', 'E', LEFT, 20 },
  { 1, 'I', 'I', LEFT, 20 },
  { 1, 'M', 'M', LEFT, 20 },
  { 1, 'O', 'O', LEFT, 20 },
  { 1, 'V', 'V', LEFT, 20 },
  { 1, EOT, EOT, LEFT, 20 },
  { 1, NUL, NUL, LEFT, 20 },
  { 2, ' ', ' ', RIGHT, 3 },
  { 2, 'A', 'A', RIGHT, 3 },
  { 2, 'C', 'C', RIGHT, 3 },
  { 2, 'D', 'D', RIGHT, 3 },
  { 2, 'E', 'E', RIGHT, 3 },
  { 2, 'I', 'I', RIGHT, 3 },
  { 2, 'M', 'M', RIGHT, 3 },
  { 2, 'O', 'O', RIGHT, 3 },
  { 2, 'V', 'V', RIGHT, 3 },
  { 2, EOT, EOT, RIGHT, 3 },
  { 2, NUL, NUL, RIGHT, 2 },
  { 3, ' ', ' ', RIGHT, 3 },
  { 3, 'A', 'A', RIGHT, 3 },
  { 3, 'C', 'C', RIGHT, 3 },
  { 3, 'D', 'D', RIGHT, 3 },
  { 3, 'E', 'E', RIGHT, 3 },
  { 3, 'I', 'I', RIGHT, 3 },
  { 3, 'M', 'M', RIGHT, 3 },
  { 3, 'O', 'O', RIGHT, 3 },
  { 3, 'V', 'V', RIGHT, 3 },
  { 3, EOT, EOT, RIGHT, 3 },
  { 3, NUL, 'E', LEFT, 21 },
  { 4, ' ', ' ', RIGHT, 5 },
  { 4, 'A', 'A', RIGHT, 5 },
  { 4, 'C', 'C', RIGHT, 5 },
  { 4, 'D', 'D', RIGHT, 5 },
  { 4, 'E', 'E', RIGHT, 5 },
  { 4, 'I', 'I', RIGHT, 5 },
  { 4, 'M', 'M', RIGHT, 5 },
  { 4, 'O', 'O', RIGHT, 5 },
  { 4, 'V', 'V', RIGHT, 5 },
  { 4, EOT, EOT, RIGHT, 5 },
  { 4, NUL, NUL, RIGHT, 4 },
  { 5, ' ', ' ', RIGHT, 5 },
  { 5, 'A', 'A', RIGHT, 5 },
  { 5, 'C', 'C', RIGHT, 5 },
  { 5, 'D', 'D', RIGHT, 5 },
  { 5, 'E', 'E', RIGHT, 5 },
  { 5, 'I', 'I', RIGHT, 5 },
  { 5, 'M', 'M', RIGHT, 5 },
  { 5, 'O', 'O', RIGHT, 5 },
  { 5, 'V', 'V', RIGHT, 5 },
  { 5, EOT, EOT, RIGHT, 5 },
  { 5, NUL, 'I', LEFT, 21 },
  { 6, ' ', ' ', RIGHT, 7 },
  { 6, 'A', 'A', RIGHT, 7 },
  { 6, 'C', 'C', RIGHT, 7 },
  { 6, 'D', 'D', RIGHT, 7 },
  { 6, 'E', 'E', RIGHT, 7 },
  { 6, 'I', 'I', RIGHT, 7 },
  { 6, 'M', 'M', RIGHT, 7 },
  { 6, 'O', 'O', RIGHT, 7 },
  { 6, 'V', 'V', RIGHT, 7 },
  { 6, EOT, EOT, RIGHT, 7 },
  { 6, NUL, NUL, RIGHT, 6 },
  { 7, ' ', ' ', RIGHT, 7 },
  { 7, 'A', 'A', RIGHT, 7 },
  { 7, 'C', 'C', RIGHT, 7 },
  { 7, 'D', 'D', RIGHT, 7 },
  { 7, 'E', 'E', RIGHT, 7 },
  { 7, 'I', 'I', RIGHT, 7 },
  { 7, 'M', 'M', RIGHT, 7 },
  { 7, 'O', 'O', RIGHT, 7 },
  { 7, 'V', 'V', RIGHT, 7 },
  { 7, EOT, EOT, RIGHT, 7 },
  { 7, NUL, ' ', LEFT, 21 },
  { 8, ' ', ' ', RIGHT, 9 },
  { 8, 'A', 'A', RIGHT, 9 },
  { 8, 'C', 'C', RIGHT, 9 },
  { 8, 'D', 'D', RIGHT, 9 },
  { 8, 'E', 'E', RIGHT, 9 },
  { 8, 'I', 'I', RIGHT, 9 },
  { 8, 'M', 'M', RIGHT, 9 },
  { 8, 'O', 'O', RIGHT, 9 },
  { 8, 'V', 'V', RIGHT, 9 },
  { 8, EOT, EOT, RIGHT, 9 },
  { 8, NUL, NUL, RIGHT, 8 },
  { 9, ' ', ' ', RIGHT, 9 },
  { 9, 'A', 'A', RIGHT, 9 },
  { 9, 'C', 'C', RIGHT, 9 },
  { 9, 'D', 'D', RIGHT, 9 },
  { 9, 'E', 'E', RIGHT, 9 },
  { 9, 'I', 'I', RIGHT, 9 },
  { 9, 'M', 'M', RIGHT, 9 },
  { 9, 'O', 'O', RIGHT, 9 },
  { 9, 'V', 'V', RIGHT, 9 },
  { 9, EOT, EOT, RIGHT, 9 },
  { 9, NUL, 'A', LEFT, 21 },
  { 10, ' ', ' ', RIGHT, 11 },
  { 10, 'A', 'A', RIGHT, 11 },
  { 10, 'C', 'C', RIGHT, 11 },
  { 10, 'D', 'D', RIGHT, 11 },
  { 10, 'E', 'E', RIGHT, 11 },
  { 10, 'I', 'I', RIGHT, 11 },
  { 10, 'M', 'M', RIGHT, 11 },
  { 10, 'O', 'O', RIGHT, 11 },
  { 10, 'V', 'V', RIGHT, 11 },
  { 10, EOT, EOT, RIGHT, 11 },
  { 10, NUL, NUL, RIGHT, 10 },
  { 11, ' ', ' ', RIGHT, 11 },
  { 11, 'A', 'A', RIGHT, 11 },
  { 11, 'C', 'C', RIGHT, 11 },
  { 11, 'D', 'D', RIGHT, 11 },
  { 11, 'E', 'E', RIGHT, 11 },
  { 11, 'I', 'I', RIGHT, 11 },
  { 11, 'M', 'M', RIGHT, 11 },
  { 11, 'O', 'O', RIGHT, 11 },
  { 11, 'V', 'V', RIGHT, 11 },
  { 11, EOT, EOT, RIGHT, 11 },
  { 11, NUL, 'M', LEFT, 21 },
  { 12, ' ', ' ', RIGHT, 13 },
  { 12, 'A', 'A', RIGHT, 13 },
  { 12, 'C', 'C', RIGHT, 13 },
  { 12, 'D', 'D', RIGHT, 13 },
  { 12, 'E', 'E', RIGHT, 13 },
  { 12, 'I', 'I', RIGHT, 13 },
  { 12, 'M', 'M', RIGHT, 13 },
  { 12, 'O', 'O', RIGHT, 13 },
  { 12, 'V', 'V', RIGHT, 13 },
  { 12, EOT, EOT, RIGHT, 13 },
  { 12, NUL, NUL, RIGHT, 12 },
  { 13, ' ', ' ', RIGHT, 13 },
  { 13, 'A', 'A', RIGHT, 13 },
  { 13, 'C', 'C', RIGHT, 13 },
  { 13, 'D', 'D', RIGHT, 13 },
  { 13, 'E', 'E', RIGHT, 13 },
  { 13, 'I', 'I', RIGHT, 13 },
  { 13, 'M', 'M', RIGHT, 13 },
  { 13, 'O', 'O', RIGHT, 13 },
  { 13, 'V', 'V', RIGHT, 13 },
  { 13, EOT, EOT, RIGHT, 13 },
  { 13, NUL, 'D', LEFT, 21 },
  { 14, ' ', ' ', RIGHT, 15 },
  { 14, 'A', 'A', RIGHT, 15 },
  { 14, 'C', 'C', RIGHT, 15 },
  { 14, 'D', 'D', RIGHT, 15 },
  { 14, 'E', 'E', RIGHT, 15 },
  { 14, 'I', 'I', RIGHT, 15 },
  { 14, 'M', 'M', RIGHT, 15 },
  { 14, 'O', 'O', RIGHT, 15 },
  { 14, 'V', 'V', RIGHT, 15 },
  { 14, EOT, EOT, RIGHT, 15 },
  { 14, NUL, NUL, RIGHT, 14 },
  { 15, ' ', ' ', RIGHT, 15 },
  { 15, 'A', 'A', RIGHT, 15 },
  { 15, 'C', 'C', RIGHT, 15 },
  { 15, 'D', 'D', RIGHT, 15 },
  { 15, 'E', 'E', RIGHT, 15 },
  { 15, 'I', 'I', RIGHT, 15 },
  { 15, 'M', 'M', RIGHT, 15 },
  { 15, 'O', 'O', RIGHT, 15 },
  { 15, 'V', 'V', RIGHT, 15 },
  { 15, EOT, EOT, RIGHT, 15 },
  { 15, NUL, 'C', LEFT, 21 },
  { 16, ' ', ' ', RIGHT, 17 },
  { 16, 'A', 'A', RIGHT, 17 },
  { 16, 'C', 'C', RIGHT, 17 },
  { 16, 'D', 'D', RIGHT, 17 },
  { 16, 'E', 'E', RIGHT, 17 },
  { 16, 'I', 'I', RIGHT, 17 },
  { 16, 'M', 'M', RIGHT, 17 },
  { 16, 'O', 'O', RIGHT, 17 },
  { 16, 'V', 'V', RIGHT, 17 },
  { 16, EOT, EOT, RIGHT, 17 },
  { 16, NUL, NUL, RIGHT, 16 },
  { 17, ' ', ' ', RIGHT, 17 },
  { 17, 'A', 'A', RIGHT, 17 },
  { 17, 'C', 'C', RIGHT, 17 },
  { 17, 'D', 'D', RIGHT, 17 },
  { 17, 'E', 'E', RIGHT, 17 },
  { 17, 'I', 'I', RIGHT, 17 },
  { 17, 'M', 'M', RIGHT, 17 },
  { 17, 'O', 'O', RIGHT, 17 },
  { 17, 'V', 'V', RIGHT, 17 },
  { 17, EOT, EOT, RIGHT, 17 },
  { 17, NUL, 'V', LEFT, 21 },
  { 18, ' ', ' ', RIGHT, 19 },
  { 18, 'A', 'A', RIGHT, 19 },
  { 18, 'C', 'C', RIGHT, 19 },
  { 18, 'D', 'D', RIGHT, 19 },
  { 18, 'E', 'E', RIGHT, 19 },
  { 18, 'I', 'I', RIGHT, 19 },
  { 18, 'M', 'M', RIGHT, 19 },
  { 18, 'O', 'O', RIGHT, 19 },
  { 18, 'V', 'V', RIGHT, 19 },
  { 18, EOT, EOT, RIGHT, 19 },
  { 18, NUL, NUL, RIGHT, 18 },
  { 19, ' ', ' ', RIGHT, 19 },
  { 19, 'A', 'A', RIGHT, 19 },
  { 19, 'C', 'C', RIGHT, 19 },
  { 19, 'D', 'D', RIGHT, 19 },
  { 19, 'E', 'E', RIGHT, 19 },
  { 19, 'I', 'I', RIGHT, 19 },
  { 19, 'M', 'M', RIGHT, 19 },
  { 19, 'O', 'O', RIGHT, 19 },
  { 19, 'V', 'V', RIGHT, 19 },
  { 19, EOT, EOT, RIGHT, 19 },
  { 19, NUL, 'O', LEFT, 21 },
  { 20, ' ', NUL, RIGHT, 6 },
  { 20, 'A', NUL, RIGHT, 8 },
  { 20, 'C', NUL, RIGHT, 14 },
  { 20, 'D', NUL, RIGHT, 12 },
  { 20, 'E', NUL, RIGHT, 2 },
  { 20, 'I', NUL, RIGHT, 4 },
  { 20, 'M', NUL, RIGHT, 10 },
  { 20, 'O', NUL, RIGHT, 18 },
  { 20, 'V', NUL, RIGHT, 16 },
  { 20, EOT, EOT, RIGHT, 22 },
  { 20, NUL, NUL, LEFT, 20 },
  { 21, ' ', ' ', LEFT, 21 },
  { 21, 'A', 'A', LEFT, 21 },
  { 21, 'C', 'C', LEFT, 21 },
  { 21, 'D', 'D', LEFT, 21 },
  { 21, 'E', 'E', LEFT, 21 },
  { 21, 'I', 'I', LEFT, 21 },
  { 21, 'M', 'M', LEFT, 21 },
  { 21, 'O', 'O', LEFT, 21 },
  { 21, 'V', 'V', LEFT, 21 },
  { 21, EOT, EOT, LEFT, 21 },
  { 21, NUL, NUL, LEFT, 20 },
  { 22, ' ', ' ', RIGHT, 23 },
  { 22, 'A', 'A', RIGHT, 23 },
  { 22, 'C', 'C', RIGHT, 23 },
  { 22, 'D', 'D', RIGHT, 23 },
  { 22, 'E', 'E', RIGHT, 23 },
  { 22, 'I', 'I', RIGHT, 23 },
  { 22, 'M', 'M', RIGHT, 23 },
  { 22, 'O', 'O', RIGHT, 23 },
  { 22, 'V', 'V', RIGHT, 23 },
  { 22, EOT, EOT, RIGHT, 23 },
  { 22, NUL, NUL, RIGHT, 22 },
  { 23, ' ', ' ', RIGHT, 23 },
  { 23, 'A', 'A', RIGHT, 23 },
  { 23, 'C', 'C', RIGHT, 23 },
  { 23, 'D', 'D', RIGHT, 23 },
  { 23, 'E', 'E', RIGHT, 23 },
  { 23, 'I', 'I', RIGHT, 23 },
  { 23, 'M', 'M', RIGHT, 23 },
  { 23, 'O', 'O', RIGHT, 23 },
  { 23, 'V', 'V', RIGHT, 23 },
  { 23, EOT, EOT, RIGHT, 23 },
  { 23, NUL, EOT, LEFT, 24 },
  { 24, ' ', ' ', LEFT, 24 },
  { 24, 'A', 'A', LEFT, 24 },
  { 24, 'C', 'C', LEFT, 24 },
  { 24, 'D', 'D', LEFT, 24 },
  { 24, 'E', 'E', LEFT, 24 },
  { 24, 'I', 'I', LEFT, 24 },
  { 24, 'M', 'M', LEFT, 24 },
  { 24, 'O', 'O', LEFT, 24 },
  { 24, 'V', 'V', LEFT, 24 },
  { 24, EOT, EOT, LEFT, 24 },
  { 24, NUL, NUL, RIGHT, 43 },
  { 25, ' ', ' ', RIGHT, 26 },
  { 25, 'A', 'A', RIGHT, 26 },
  { 25, 'C', 'C', RIGHT, 26 },
  { 25, 'D', 'D', RIGHT, 26 },
  { 25, 'E', 'E', RIGHT, 26 },
  { 25, 'I', 'I', RIGHT, 26 },
  { 25, 'M', 'M', RIGHT, 26 },
  { 25, 'O', 'O', RIGHT, 26 },
  { 25, 'V', 'V', RIGHT, 26 },
  { 25, EOT, EOT, RIGHT, 26 },
  { 25, NUL, NUL, LEFT, 25 },
  { 26, ' ', 'E', RIGHT, 43 },
  { 26, 'A', 'E', RIGHT, 43 },
  { 26, 'C', 'E', RIGHT, 43 },
  { 26, 'D', 'E', RIGHT, 43 },
  { 26, 'E', 'E', RIGHT, 43 },
  { 26, 'I', 'E', RIGHT, 43 },
  { 26, 'M', 'E', RIGHT, 43 },
  { 26, 'O', 'E', RIGHT, 43 },
  { 26, 'V', 'E', RIGHT, 43 },
  { 26, EOT, 'E', RIGHT, 43 },
  { 26, NUL, 'E', RIGHT, 43 },
  { 27, ' ', ' ', RIGHT, 28 },
  { 27, 'A', 'A', RIGHT, 28 },
  { 27, 'C', 'C', RIGHT, 28 },
  { 27, 'D', 'D', RIGHT, 28 },
  { 27, 'E', 'E', RIGHT, 28 },
  { 27, 'I', 'I', RIGHT, 28 },
  { 27, 'M', 'M', RIGHT, 28 },
  { 27, 'O', 'O', RIGHT, 28 },
  { 27, 'V', 'V', RIGHT, 28 },
  { 27, EOT, EOT, RIGHT, 28 },
  { 27, NUL, NUL, LEFT, 27 },
  { 28, ' ', 'I', RIGHT, 43 },
  { 28, 'A', 'I', RIGHT, 43 },
  { 28, 'C', 'I', RIGHT, 43 },
  { 28, 'D', 'I', RIGHT, 43 },
  { 28, 'E', 'I', RIGHT, 43 },
  { 28, 'I', 'I', RIGHT, 43 },
  { 28, 'M', 'I', RIGHT, 43 },
  { 28, 'O', 'I', RIGHT, 43 },
  { 28, 'V', 'I', RIGHT, 43 },
  { 28, EOT, 'I', RIGHT, 43 },
  { 28, NUL, 'I', RIGHT, 43 },
  { 29, ' ', ' ', RIGHT, 30 },
  { 29, 'A', 'A', RIGHT, 30 },
  { 29, 'C', 'C', RIGHT, 30 },
  { 29, 'D', 'D', RIGHT, 30 },
  { 29, 'E', 'E', RIGHT, 30 },
  { 29, 'I', 'I', RIGHT, 30 },
  { 29, 'M', 'M', RIGHT, 30 },
  { 29, 'O', 'O', RIGHT, 30 },
  { 29, 'V', 'V', RIGHT, 30 },
  { 29, EOT, EOT, RIGHT, 30 },
  { 29, NUL, NUL, LEFT, 29 },
  { 30, ' ', ' ', RIGHT, 43 },
  { 30, 'A', ' ', RIGHT, 43 },
  { 30, 'C', ' ', RIGHT, 43 },
  { 30, 'D', ' ', RIGHT, 43 },
  { 30, 'E', ' ', RIGHT, 43 },
  { 30, 'I', ' ', RIGHT, 43 },
  { 30, 'M', ' ', RIGHT, 43 },
  { 30, 'O', ' ', RIGHT, 43 },
  { 30, 'V', ' ', RIGHT, 43 },
  { 30, EOT, ' ', RIGHT, 43 },
  { 30, NUL, ' ', RIGHT, 43 },
  { 31, ' ', ' ', RIGHT, 32 },
  { 31, 'A', 'A', RIGHT, 32 },
  { 31, 'C', 'C', RIGHT, 32 },
  { 31, 'D', 'D', RIGHT, 32 },
  { 31, 'E', 'E', RIGHT, 32 },
  { 31, 'I', 'I', RIGHT, 32 },
  { 31, 'M', 'M', RIGHT, 32 },
  { 31, 'O', 'O', RIGHT, 32 },
  { 31, 'V', 'V', RIGHT, 32 },
  { 31, EOT, EOT, RIGHT, 32 },
  { 31, NUL, NUL, LEFT, 31 },
  { 32, ' ', 'A', RIGHT, 43 },
  { 32, 'A', 'A', RIGHT, 43 },
  { 32, 'C', 'A', RIGHT, 43 },
  { 32, 'D', 'A', RIGHT, 43 },
  { 32, 'E', 'A', RIGHT, 43 },
  { 32, 'I', 'A', RIGHT, 43 },
  { 32, 'M', 'A', RIGHT, 43 },
  { 32, 'O', 'A', RIGHT, 43 },
  { 32, 'V', 'A', RIGHT, 43 },
  { 32, EOT, 'A', RIGHT, 43 },
  { 32, NUL, 'A', RIGHT, 43 },
  { 33, ' ', ' ', RIGHT, 34 },
  { 33, 'A', 'A', RIGHT, 34 },
  { 33, 'C', 'C', RIGHT, 34 },
  { 33, 'D', 'D', RIGHT, 34 },
  { 33, 'E', 'E', RIGHT, 34 },
  { 33, 'I', 'I', RIGHT, 34 },
  { 33, 'M', 'M', RIGHT, 34 },
  { 33, 'O', 'O', RIGHT, 34 },
  { 33, 'V', 'V', RIGHT, 34 },
  { 33, EOT, EOT, RIGHT, 34 },
  { 33, NUL, NUL, LEFT, 33 },
  { 34, ' ', 'M', RIGHT, 43 },
  { 34, 'A', 'M', RIGHT, 43 },
  { 34, 'C', 'M', RIGHT, 43 },
  { 34, 'D', 'M', RIGHT, 43 },
  { 34, 'E', 'M', RIGHT, 43 },
  { 34, 'I', 'M', RIGHT, 43 },
  { 34, 'M', 'M', RIGHT, 43 },
  { 34, 'O', 'M', RIGHT, 43 },
  { 34, 'V', 'M', RIGHT, 43 },
  { 34, EOT, 'M', RIGHT, 43 },
  { 34, NUL, 'M', RIGHT, 43 },
  { 35, ' ', ' ', RIGHT, 36 },
  { 35, 'A', 'A', RIGHT, 36 },
  { 35, 'C', 'C', RIGHT, 36 },
  { 35, 'D', 'D', RIGHT, 36 },
  { 35, 'E', 'E', RIGHT, 36 },
  { 35, 'I', 'I', RIGHT, 36 },
  { 35, 'M', 'M', RIGHT, 36 },
  { 35, 'O', 'O', RIGHT, 36 },
  { 35, 'V', 'V', RIGHT, 36 },
  { 35, EOT, EOT, RIGHT, 36 },
  { 35, NUL, NUL, LEFT, 35 },
  { 36, ' ', 'D', RIGHT, 43 },
  { 36, 'A', 'D', RIGHT, 43 },
  { 36, 'C', 'D', RIGHT, 43 },
  { 36, 'D', 'D', RIGHT, 43 },
  { 36, 'E', 'D', RIGHT, 43 },
  { 36, 'I', 'D', RIGHT, 43 },
  { 36, 'M', 'D', RIGHT, 43 },
  { 36, 'O', 'D', RIGHT, 43 },
  { 36, 'V', 'D', RIGHT, 43 },
  { 36, EOT, 'D', RIGHT, 43 },
  { 36, NUL, 'D', RIGHT, 43 },
  { 37, ' ', ' ', RIGHT, 38 },
  { 37, 'A', 'A', RIGHT, 38 },
  { 37, 'C', 'C', RIGHT, 38 },
  { 37, 'D', 'D', RIGHT, 38 },
  { 37, 'E', 'E', RIGHT, 38 },
  { 37, 'I', 'I', RIGHT, 38 },
  { 37, 'M', 'M', RIGHT, 38 },
  { 37, 'O', 'O', RIGHT, 38 },
  { 37, 'V', 'V', RIGHT, 38 },
  { 37, EOT, EOT, RIGHT, 38 },
  { 37, NUL, NUL, LEFT, 37 },
  { 38, ' ', 'C', RIGHT, 43 },
  { 38, 'A', 'C', RIGHT, 43 },
  { 38, 'C', 'C', RIGHT, 43 },
  { 38, 'D', 'C', RIGHT, 43 },
  { 38, 'E', 'C', RIGHT, 43 },
  { 38, 'I', 'C', RIGHT, 43 },
  { 38, 'M', 'C', RIGHT, 43 },
  { 38, 'O', 'C', RIGHT, 43 },
  { 38, 'V', 'C', RIGHT, 43 },
  { 38, EOT, 'C', RIGHT, 43 },
  { 38, NUL, 'C', RIGHT, 43 },
  { 39, ' ', ' ', RIGHT, 40 },
  { 39, 'A', 'A', RIGHT, 40 },
  { 39, 'C', 'C', RIGHT, 40 },
  { 39, 'D', 'D', RIGHT, 40 },
  { 39, 'E', 'E', RIGHT, 40 },
  { 39, 'I', 'I', RIGHT, 40 },
  { 39, 'M', 'M', RIGHT, 40 },
  { 39, 'O', 'O', RIGHT, 40 },
  { 39, 'V', 'V', RIGHT, 40 },
  { 39, EOT, EOT, RIGHT, 40 },
  { 39, NUL, NUL, LEFT, 39 },
  { 40, ' ', 'V', RIGHT, 43 },
  { 40, 'A', 'V', RIGHT, 43 },
  { 40, 'C', 'V', RIGHT, 43 },
  { 40, 'D', 'V', RIGHT, 43 },
  { 40, 'E', 'V', RIGHT, 43 },
  { 40, 'I', 'V', RIGHT, 43 },
  { 40, 'M', 'V', RIGHT, 43 },
  { 40, 'O', 'V', RIGHT, 43 },
  { 40, 'V', 'V', RIGHT, 43 },
  { 40, EOT, 'V', RIGHT, 43 },
  { 40, NUL, 'V', RIGHT, 43 },
  { 41, ' ', ' ', RIGHT, 42 },
  { 41, 'A', 'A', RIGHT, 42 },
  { 41, 'C', 'C', RIGHT, 42 },
  { 41, 'D', 'D', RIGHT, 42 },
  { 41, 'E', 'E', RIGHT, 42 },
  { 41, 'I', 'I', RIGHT, 42 },
  { 41, 'M', 'M', RIGHT, 42 },
  { 41, 'O', 'O', RIGHT, 42 },
  { 41, 'V', 'V', RIGHT, 42 },
  { 41, EOT, EOT, RIGHT, 42 },
  { 41, NUL, NUL, LEFT, 41 },
  { 42, ' ', 'O', RIGHT, 43 },
  { 42, 'A', 'O', RIGHT, 43 },
  { 42, 'C', 'O', RIGHT, 43 },
  { 42, 'D', 'O', RIGHT, 43 },
  { 42, 'E', 'O', RIGHT, 43 },
  { 42, 'I', 'O', RIGHT, 43 },
  { 42, 'M', 'O', RIGHT, 43 },
  { 42, 'O', 'O', RIGHT, 43 },
  { 42, 'V', 'O', RIGHT, 43 },
  { 42, EOT, 'O', RIGHT, 43 },
  { 42, NUL, 'O', RIGHT, 43 },
  { 43, ' ', NUL, LEFT, 29 },
  { 43, 'A', NUL, LEFT, 31 },
  { 43, 'C', NUL, LEFT, 37 },
  { 43, 'D', NUL, LEFT, 35 },
  { 43, 'E', NUL, LEFT, 25 },
  { 43, 'I', NUL, LEFT, 27 },
  { 43, 'M', NUL, LEFT, 33 },
  { 43, 'O', NUL, LEFT, 41 },
  { 43, 'V', NUL, LEFT, 39 },
  { 43, EOT, NUL, FINAL, 44 },
  { 43, NUL, NUL, RIGHT, 43 },
  { 44, ' ', ' ', FINAL, 44 },
  { 44, 'A', 'A', FINAL, 44 },
  { 44, 'C', 'C', FINAL, 44 },
  { 44, 'D', 'D', FINAL, 44 },
  { 44, 'E', 'E', FINAL, 44 },
  { 44, 'I', 'I', FINAL, 44 },
  { 44, 'M', 'M', FINAL, 44 },
  { 44, 'O', 'O', FINAL, 44 },
  { 44, 'V', 'V', FINAL, 44 },
  { 44, EOT, EOT, FINAL, 44 },
  { 44, NUL, NUL, FINAL, 44 },
};

#define RULES_SIZE (495)

int main(int argc, char * argv[]) 
{
  if (argc != 2)
    return 1;

  char * tape = calloc(TAPE_LENGTH, sizeof (char));
  tape[0] = EOT;
  tape[TAPE_LENGTH - 1] = EOT;

  ssize_t head = 1;
  strcpy(tape + head, argv[1]);

  int direction = 0;
  int state = 0;

  do
  {
    size_t i = 0;
    for (; i < RULES_SIZE; ++i)
    {
      if (rules[i].state == state && rules[i].read == tape[head])
        break;
    }
    if (i == RULES_SIZE)
    {
      fprintf(stderr, "No matching rule for state %d and symbol %c (%#hhx)\n",
              state, tape[head], tape[head]);
      free(tape);
      return 1;
    }

    struct rule rule = rules[i];

    tape[head] = rule.write;
    direction = rule.dir;
    state = rule.destination;

    head += direction;
    if (head < 0 && direction != FINAL)
    {
      fprintf(stderr,
              "Head got past the left end of the tape\n"
              "State: %d\n",
              rule.state);
      free(tape);
      return 1;
    }
    if (TAPE_LENGTH <= head && direction != FINAL)
    {
      fprintf(stderr,
          "Head got past the right end of the tape (increase TAPE_LENGTH?)\n"
          "State: %d\n",
          rule.state);
      free(tape);
      return 1;
    }
  }
  while (direction != FINAL);

  printf("%s\n", tape + 1);
  free(tape);
  return 0;
}
$ gcc -o movaicode movaicode.c
$ ./movaicode "EDOC IAVOM"
MOVAI CODE

Par contre cette machine de Turing ne gère que les caractères nécessaires à l'écriture de "MOVAI CODE". La machine qui gère l'espace + 26 lettres latines fait ~100KiO (~3500 lignes de règles), et la machine qui gère les 95 caractères ASCII affichables fait 1.2MiO (~38000 lignes).

louismarslen commented 3 years ago

Cher Clément, j'ai le plaisir et l'honneur de vous annoncer que vous n'avez PAS gagné le concours MOVAI CODE. Ce qui fait de vous un EKSSELAN Codeur.

SPOILER : j'espère qu'on aura le plaisir de recevoir votre participation à l'episode 2 du MOVAI CODE (stay tuned).

Bravo toutefois pour votre belle contribution 😊

louismarslen commented 2 years ago

Je fais un peu de ménage dans les issues -> d'ailleurs go participer à l'édition 5