Created
November 9, 2023 14:41
-
-
Save gusteivos/f305770cb587fa5896a727d2ea1740f4 to your computer and use it in GitHub Desktop.
my Turing machine set to repeat 0 1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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