Skip to content

Instantly share code, notes, and snippets.

@gusteivos
Created November 9, 2023 14:41
Show Gist options
  • Save gusteivos/f305770cb587fa5896a727d2ea1740f4 to your computer and use it in GitHub Desktop.
Save gusteivos/f305770cb587fa5896a727d2ea1740f4 to your computer and use it in GitHub Desktop.
my Turing machine set to repeat 0 1
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BLANK ' '
#define ONE '1'
#define ZERO '0'
#define TO_RIGHT 1
#define TO_LEFT -1
#define STATE_COUNT 5
typedef struct
{
char next_state_name;
int direction;
bool write;
char write_value;
} state_when;
typedef struct
{
char name;
state_when *when_b;
state_when *when_o;
state_when *when_z;
} state;
state_when b = { 'c', TO_RIGHT, true , ZERO };
state_when c = { 'e', TO_RIGHT, false, BLANK };
state_when e = { 'f', TO_RIGHT, true , ONE };
state_when f = { 'b', TO_RIGHT, false, BLANK };
state b_state = { 'b', &b, NULL, NULL };
state c_state = { 'c', &c, NULL, NULL };
state e_state = { 'e', &e, NULL, NULL };
state f_state = { 'f', &f, NULL, NULL };
state end_state = { '\0', NULL, NULL, NULL };
int tape_length = 0;
char *tape = NULL;
int tape_offset = 0;
int control_head_position = 0;
state states[STATE_COUNT];
state current_state;
int main(int argc, char *argv[])
{
states[0] = b_state;
states[1] = c_state;
states[2] = e_state;
states[3] = f_state;
states[4] = end_state;
current_state = b_state;
tape_length = 64;
tape = (char *)malloc(tape_length * sizeof(char));
tape_offset = tape_length / 2;
memset(tape, ' ', tape_length * sizeof(char));
while (tape_offset + control_head_position < tape_length)
{
char value_read = tape[tape_offset + control_head_position];
state_when state_now;
switch (value_read)
{
case BLANK:
state_now = *current_state.when_b;
break;
case ONE :
state_now = *current_state.when_o;
break;
case ZERO :
state_now = *current_state.when_z;
break;
}
if (state_now.write)
{
tape[tape_offset + control_head_position] = state_now.write_value;
}
control_head_position += state_now.direction;
for (int i = 0; i < STATE_COUNT; i++)
{
if (states[i].name == state_now.next_state_name)
{
current_state = states[i];
break;
}
}
printf("|");
for (int i = 0; i < tape_length; i++)
printf("%c|", tape[i]);
puts("");
}
free(tape);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment