Skip to content

Instantly share code, notes, and snippets.

@nulldatamap
Created February 12, 2019 19:57
Show Gist options
  • Save nulldatamap/759cf6e12b629c3440a5fca313ca7de1 to your computer and use it in GitHub Desktop.
Save nulldatamap/759cf6e12b629c3440a5fca313ca7de1 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
INSTRUCTIONS="[<>.+]|-"
SETUP="s/^.+/@\\0|@0,|/"
ADD_OR_SUB="s/([^@]*)@([+-])([^|]*)\|(([0-9]+,)*)@([0-9]+),(([0-9]+,)*)\|(.*)/\1\2@\3|\4@\6\2,\7|\9/"
ADD_CELL_0="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)0\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\41\5,\6|\8/"
ADD_CELL_1="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)1\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\42\5,\6|\8/"
ADD_CELL_2="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)2\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\43\5,\6|\8/"
ADD_CELL_3="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)3\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\44\5,\6|\8/"
ADD_CELL_4="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)4\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\45\5,\6|\8/"
ADD_CELL_5="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)5\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\46\5,\6|\8/"
ADD_CELL_6="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)6\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\47\5,\6|\8/"
ADD_CELL_7="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)7\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\48\5,\6|\8/"
ADD_CELL_8="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)8\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\49\5,\6|\8/"
ADD_CELL_9="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)9\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\4+0\5,\6|\8/"
ADD_CELL_CARRY="s/([^|]+)\|(([0-9]+,)*)@\+([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@1\4,\5|\7/"
ADD_CELL_MAX="s/([^|]+)\|(([0-9]+,)*)@255\+,(([0-9]+,)*)\|(.*)/\1|\2@0,\4|\6/"
SUB_CELL_0="s/([^|]+)\|(([0-9]+,)*)@([0-9]+)0-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\4-9\5,\6|\8/"
SUB_CELL_1="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)1-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\40\5,\6|\8/"
SUB_CELL_2="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)2-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\41\5,\6|\8/"
SUB_CELL_3="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)3-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\42\5,\6|\8/"
SUB_CELL_4="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)4-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\43\5,\6|\8/"
SUB_CELL_5="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)5-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\44\5,\6|\8/"
SUB_CELL_6="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)6-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\45\5,\6|\8/"
SUB_CELL_7="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)7-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\46\5,\6|\8/"
SUB_CELL_8="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)8-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\47\5,\6|\8/"
SUB_CELL_9="s/([^|]+)\|(([0-9]+,)*)@([0-9]*)9-([0-9]*),(([0-9]+,)*)\|(.*)/\1|\2@\48\5,\6|\8/"
SUB_CELL_MIN="s/([^|]+)\|(([0-9]+,)*)@0-,(([0-9]+,)*)\|(.*)/\1|\2@255,\4|\6/"
SUB_CELL_REMOVE_LEADING_ZEROS="s/([^|]+)\|(([0-9]+,)*)@0+([0-9]+),(([0-9]+,)*)\|(.*)/\1|\2@\4,\5|\7/"
ADD_CELL="$ADD_CELL_MAX; $ADD_CELL_0; $ADD_CELL_1; $ADD_CELL_2; $ADD_CELL_3; $ADD_CELL_4;\
$ADD_CELL_5; $ADD_CELL_6; $ADD_CELL_7; $ADD_CELL_8; $ADD_CELL_9; $ADD_CELL_CARRY;"
SUB_CELL="$SUB_CELL_MIN; $SUB_CELL_0; $SUB_CELL_1; $SUB_CELL_2; $SUB_CELL_3; $SUB_CELL_4; \
$SUB_CELL_5; $SUB_CELL_6; $SUB_CELL_7; $SUB_CELL_8; $SUB_CELL_9; $SUB_CELL_REMOVE_LEADING_ZEROS"
MOV_LEFT_A="s/([^@]*)@<([^|]*)\|@([0-9]+),(([0-9]+,)*)\|(.*)/\1<@\2|@0,\3,\4|\6/"
MOV_LEFT_B="s/([^@]*)@<([^|]*)\|(([0-9]+,)*)([0-9]+),@([0-9]+),(([0-9]+,)*)\|(.*)/\1<@\2|\3@\5,\6,\7|\9/"
MOV_RIGHT_A="s/([^@]*)@>([^|]*)\|(([0-9]+,)*)@([0-9]+),\|(.*)/\1>@\2|\3\5,@0,|\6/"
MOV_RIGHT_B="s/([^@]*)@>([^|]*)\|(([0-9]+,)*)@([0-9]+),([0-9]+,)(([0-9]+,)*)\|(.*)/\1>@\2|\3\5,@\6\7|\9/"
LOOP_START_SKIP="s/([^@]*)@\[([^|]*)\|(([0-9]+,)*)@0,(([0-9]+,)*)\|(.*)/\1[!@~\2|\3@0,\5|\7/"
LOOP_START_ENTER="s/([^@]*)@\[([^|]*)\|(([0-9]+,)*)@([0-9]+),(([0-9]+,)*)\|(.*)/\1[@\2|\3@\5,\6|\8/"
LOOP_END_SKIP="s/([^@]*)@\]([^|]*)\|(([0-9]+,)*)@0,(([0-9]+,)*)\|(.*)/\1]@\2|\3@0,\5|\7/"
LOOP_END_RELOOP="s/([^@]*)@\]([^|]*)\|(([0-9]+,)*)@([0-9]+),(([0-9]+,)*)\|(.*)/\1~@!]\2|\3@\5,\6|\8/"
SHUTTLE_RIGHT_A="s/($INSTRUCTIONS)(~(@+)!)/\2\1/g"
SHUTTLE_RIGHT_B="s/\[~@!/@[/g"
SHUTTLE_RIGHT_C="s/\]~(@+)!/~@\1!]/g"
SHUTTLE_RIGHT_D="s/\[~@(@+)!/~\1![/g"
SHUTTLE_LEFT_A="s/!@~\]/]@/g"
SHUTTLE_LEFT_B="s/!@(@+)~\]/]!\1~/g"
SHUTTLE_LEFT_C="s/!(@+)~\[/[!\1@~/g"
SHUTTLE_LEFT_D="s/!(@+)~($INSTRUCTIONS)/\2!\1~/g"
PRINT="s/([^@]*)@\.([^|]*)\|(([0-9]+,)*)@([0-9]+),(([0-9]+,)*)\|(.*)/\1.@\2|\3@\5,\6|\8\5 /"
FINISH_CHECK="s/[^@]*@\|[^|]+\|(.*)/<\1>/"
PROGRAM="$SETUP; :start; \
$ADD_OR_SUB; $PRINT; \
$ADD_CELL; $SUB_CELL; \
$MOV_LEFT_A; $MOV_LEFT_B; \
$MOV_RIGHT_A; $MOV_RIGHT_B; \
$LOOP_START_SKIP; $LOOP_START_ENTER; \
$LOOP_END_SKIP; $LOOP_END_RELOOP; \
$SHUTTLE_RIGHT_A; $SHUTTLE_RIGHT_B; $SHUTTLE_RIGHT_C; $SHUTTLE_RIGHT_D; \
$SHUTTLE_LEFT_A; $SHUTTLE_LEFT_B; $SHUTTLE_LEFT_C; $SHUTTLE_LEFT_D; \
$FINISH_CHECK; Tdone; \
bstart; \
:done;"\
echo "$PROGRAM"
cat | sed -r "$PROGRAM"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment