User:FireFly/sedfuck.sed
Jump to navigation
Jump to search
Sedfuck is a half-working sed implementation of brainfuck, written by User:FireFly.
#!/bin/sed -rf # Sedfuck - brainfuck interpreter in sed. # Written by Jonas Höglund (FireFly, firefly.nu). h s/^(.|[^.])*$/0/ # Setup some memory. s/0/0000000000/g #s/0/0000000000/g #s/0/0000000000/g s/0/\x0/g x s/[{}]//g # Strip braces. # Transform [] to {} (use {} for looping). y/\[\]/{}/ s/[^-+<>{},\.]//g # Strip non-instructions. s/$/q/ # Add q to end of program ('quit' instruction). :parse #l;x;l;x /^\+/ { x /^\xff/ { # To not collide with the later s/^0/1/! s/^\xff/\x0/ x b next } s/^\xfe/\xff/ s/^\xfd/\xfe/ s/^\xfc/\xfd/ s/^\xfb/\xfc/ s/^\xfa/\xfb/ s/^\xf9/\xfa/ s/^\xf8/\xf9/ s/^\xf7/\xf8/ s/^\xf6/\xf7/ s/^\xf5/\xf6/ s/^\xf4/\xf5/ s/^\xf3/\xf4/ s/^\xf2/\xf3/ s/^\xf1/\xf2/ s/^\xf0/\xf1/ s/^\xef/\xf0/ s/^\xee/\xef/ s/^\xed/\xee/ s/^\xec/\xed/ s/^\xeb/\xec/ s/^\xea/\xeb/ s/^\xe9/\xea/ s/^\xe8/\xe9/ s/^\xe7/\xe8/ s/^\xe6/\xe7/ s/^\xe5/\xe6/ s/^\xe4/\xe5/ s/^\xe3/\xe4/ s/^\xe2/\xe3/ s/^\xe1/\xe2/ s/^\xe0/\xe1/ s/^\xdf/\xe0/ s/^\xde/\xdf/ s/^\xdd/\xde/ s/^\xdc/\xdd/ s/^\xdb/\xdc/ s/^\xda/\xdb/ s/^\xd9/\xda/ s/^\xd8/\xd9/ s/^\xd7/\xd8/ s/^\xd6/\xd7/ s/^\xd5/\xd6/ s/^\xd4/\xd5/ s/^\xd3/\xd4/ s/^\xd2/\xd3/ s/^\xd1/\xd2/ s/^\xd0/\xd1/ s/^\xcf/\xd0/ s/^\xce/\xcf/ s/^\xcd/\xce/ s/^\xcc/\xcd/ s/^\xcb/\xcc/ s/^\xca/\xcb/ s/^\xc9/\xca/ s/^\xc8/\xc9/ s/^\xc7/\xc8/ s/^\xc6/\xc7/ s/^\xc5/\xc6/ s/^\xc4/\xc5/ s/^\xc3/\xc4/ s/^\xc2/\xc3/ s/^\xc1/\xc2/ s/^\xc0/\xc1/ s/^\xbf/\xc0/ s/^\xbe/\xbf/ s/^\xbd/\xbe/ s/^\xbc/\xbd/ s/^\xbb/\xbc/ s/^\xba/\xbb/ s/^\xb9/\xba/ s/^\xb8/\xb9/ s/^\xb7/\xb8/ s/^\xb6/\xb7/ s/^\xb5/\xb6/ s/^\xb4/\xb5/ s/^\xb3/\xb4/ s/^\xb2/\xb3/ s/^\xb1/\xb2/ s/^\xb0/\xb1/ s/^\xaf/\xb0/ s/^\xae/\xaf/ s/^\xad/\xae/ s/^\xac/\xad/ s/^\xab/\xac/ s/^\xaa/\xab/ s/^\xa9/\xaa/ s/^\xa8/\xa9/ s/^\xa7/\xa8/ s/^\xa6/\xa7/ s/^\xa5/\xa6/ s/^\xa4/\xa5/ s/^\xa3/\xa4/ s/^\xa2/\xa3/ s/^\xa1/\xa2/ s/^\xa0/\xa1/ s/^\x9f/\xa0/ s/^\x9e/\x9f/ s/^\x9d/\x9e/ s/^\x9c/\x9d/ s/^\x9b/\x9c/ s/^\x9a/\x9b/ s/^\x99/\x9a/ s/^\x98/\x99/ s/^\x97/\x98/ s/^\x96/\x97/ s/^\x95/\x96/ s/^\x94/\x95/ s/^\x93/\x94/ s/^\x92/\x93/ s/^\x91/\x92/ s/^\x90/\x91/ s/^\x8f/\x90/ s/^\x8e/\x8f/ s/^\x8d/\x8e/ s/^\x8c/\x8d/ s/^\x8b/\x8c/ s/^\x8a/\x8b/ s/^\x89/\x8a/ s/^\x88/\x89/ s/^\x87/\x88/ s/^\x86/\x87/ s/^\x85/\x86/ s/^\x84/\x85/ s/^\x83/\x84/ s/^\x82/\x83/ s/^\x81/\x82/ s/^\x80/\x81/ s/^\x7f/\x80/ s/^\~/\x7f/ s/^\}/~/ s/^\|/}/ s/^\{/|/ s/^z/{/ s/^y/z/ s/^x/y/ s/^w/x/ s/^v/w/ s/^u/v/ s/^t/u/ s/^s/t/ s/^r/s/ s/^q/r/ s/^p/q/ s/^o/p/ s/^n/o/ s/^m/n/ s/^l/m/ s/^k/l/ s/^j/k/ s/^i/j/ s/^h/i/ s/^g/h/ s/^f/g/ s/^e/f/ s/^d/e/ s/^c/d/ s/^b/c/ s/^a/b/ s/^`/a/ s/^_/`/ s/^\^/_/ s/^\]/\^/ s/^\\/\]/ s/^\[/\\/ s/^Z/\[/ s/^Y/Z/ s/^X/Y/ s/^W/X/ s/^V/W/ s/^U/V/ s/^T/U/ s/^S/T/ s/^R/S/ s/^Q/R/ s/^P/Q/ s/^O/P/ s/^N/O/ s/^M/N/ s/^L/M/ s/^K/L/ s/^J/K/ s/^I/J/ s/^H/I/ s/^G/H/ s/^F/G/ s/^E/F/ s/^D/E/ s/^C/D/ s/^B/C/ s/^A/B/ s/^@/A/ s/^\?/@/ s/^>/\?/ s/^=/>/ s/^</=/ s/^;/</ s/^:/;/ s/^9/:/ s/^8/9/ s/^7/8/ s/^6/7/ s/^5/6/ s/^4/5/ s/^3/4/ s/^2/3/ s/^1/2/ s/^0/1/ s/^\//0/ s/^\./\// s/^\-/\./ s/^,/\-/ s/^\+/,/ s/^\*/\+/ s/^\)/\*/ s/^\(/\)/ s/^'/\(/ s/^\&/'/ s/^%/\&/ s/^\$/%/ s/^#/\$/ s/^"/#/ s/^!/"/ s/^ /!/ s/^\x1f/ / s/^\x1e/\x1f/ s/^\x1d/\x1e/ s/^\x1c/\x1d/ s/^\x1b/\x1c/ s/^\x1a/\x1b/ s/^\x19/\x1a/ s/^\x18/\x19/ s/^\x17/\x18/ s/^\x16/\x17/ s/^\x15/\x16/ s/^\x14/\x15/ s/^\x13/\x14/ s/^\x12/\x13/ s/^\x11/\x12/ s/^\x10/\x11/ s/^\xf/\x10/ s/^\xe/\xf/ s/^\xd/\xe/ s/^\xc/\xd/ s/^\xb/\xc/ s/^\xa/\xb/ s/^\x9/\xa/ s/^\x8/\x9/ s/^\x7/\x8/ s/^\x6/\x7/ s/^\x5/\x6/ s/^\x4/\x5/ s/^\x3/\x4/ s/^\x2/\x3/ s/^\x1/\x2/ s/^\x0/\x1/ x } /^-/ { x /^\x0/ { # See '+' above. s/^\x0/\xff/ x b next } s/^\x1/\x0/ s/^\x2/\x1/ s/^\x3/\x2/ s/^\x4/\x3/ s/^\x5/\x4/ s/^\x6/\x5/ s/^\x7/\x6/ s/^\x8/\x7/ s/^\x9/\x8/ s/^\xa/\x9/ s/^\xb/\xa/ s/^\xc/\xb/ s/^\xd/\xc/ s/^\xe/\xd/ s/^\xf/\xe/ s/^\x10/\xf/ s/^\x11/\x10/ s/^\x12/\x11/ s/^\x13/\x12/ s/^\x14/\x13/ s/^\x15/\x14/ s/^\x16/\x15/ s/^\x17/\x16/ s/^\x18/\x17/ s/^\x19/\x18/ s/^\x1a/\x19/ s/^\x1b/\x1a/ s/^\x1c/\x1b/ s/^\x1d/\x1c/ s/^\x1e/\x1d/ s/^\x1f/\x1e/ s/^ /\x1f/ s/^!/ / s/^"/!/ s/^#/"/ s/^\$/#/ s/^%/\$/ s/^\&/%/ s/^'/\&/ s/^\(/'/ s/^\)/\(/ s/^\*/\)/ s/^\+/\*/ s/^,/\+/ s/^\-/,/ s/^\./\-/ s/^\//\./ s/^0/\// s/^1/0/ s/^2/1/ s/^3/2/ s/^4/3/ s/^5/4/ s/^6/5/ s/^7/6/ s/^8/7/ s/^9/8/ s/^:/9/ s/^;/:/ s/^</;/ s/^=/</ s/^>/=/ s/^\?/>/ s/^@/\?/ s/^A/@/ s/^B/A/ s/^C/B/ s/^D/C/ s/^E/D/ s/^F/E/ s/^G/F/ s/^H/G/ s/^I/H/ s/^J/I/ s/^K/J/ s/^L/K/ s/^M/L/ s/^N/M/ s/^O/N/ s/^P/O/ s/^Q/P/ s/^R/Q/ s/^S/R/ s/^T/S/ s/^U/T/ s/^V/U/ s/^W/V/ s/^X/W/ s/^Y/X/ s/^Z/Y/ s/^\[/Z/ s/^\\/\[/ s/^\]/\\/ s/^\^/\]/ s/^_/\^/ s/^`/_/ s/^a/`/ s/^b/a/ s/^c/b/ s/^d/c/ s/^e/d/ s/^f/e/ s/^g/f/ s/^h/g/ s/^i/h/ s/^j/i/ s/^k/j/ s/^l/k/ s/^m/l/ s/^n/m/ s/^o/n/ s/^p/o/ s/^q/p/ s/^r/q/ s/^s/r/ s/^t/s/ s/^u/t/ s/^v/u/ s/^w/v/ s/^x/w/ s/^y/x/ s/^z/y/ s/^\{/z/ s/^\|/{/ s/^\}/|/ s/^\~/}/ s/^\x7f/~/ s/^\x80/\x7f/ s/^\x81/\x80/ s/^\x82/\x81/ s/^\x83/\x82/ s/^\x84/\x83/ s/^\x85/\x84/ s/^\x86/\x85/ s/^\x87/\x86/ s/^\x88/\x87/ s/^\x89/\x88/ s/^\x8a/\x89/ s/^\x8b/\x8a/ s/^\x8c/\x8b/ s/^\x8d/\x8c/ s/^\x8e/\x8d/ s/^\x8f/\x8e/ s/^\x90/\x8f/ s/^\x91/\x90/ s/^\x92/\x91/ s/^\x93/\x92/ s/^\x94/\x93/ s/^\x95/\x94/ s/^\x96/\x95/ s/^\x97/\x96/ s/^\x98/\x97/ s/^\x99/\x98/ s/^\x9a/\x99/ s/^\x9b/\x9a/ s/^\x9c/\x9b/ s/^\x9d/\x9c/ s/^\x9e/\x9d/ s/^\x9f/\x9e/ s/^\xa0/\x9f/ s/^\xa1/\xa0/ s/^\xa2/\xa1/ s/^\xa3/\xa2/ s/^\xa4/\xa3/ s/^\xa5/\xa4/ s/^\xa6/\xa5/ s/^\xa7/\xa6/ s/^\xa8/\xa7/ s/^\xa9/\xa8/ s/^\xaa/\xa9/ s/^\xab/\xaa/ s/^\xac/\xab/ s/^\xad/\xac/ s/^\xae/\xad/ s/^\xaf/\xae/ s/^\xb0/\xaf/ s/^\xb1/\xb0/ s/^\xb2/\xb1/ s/^\xb3/\xb2/ s/^\xb4/\xb3/ s/^\xb5/\xb4/ s/^\xb6/\xb5/ s/^\xb7/\xb6/ s/^\xb8/\xb7/ s/^\xb9/\xb8/ s/^\xba/\xb9/ s/^\xbb/\xba/ s/^\xbc/\xbb/ s/^\xbd/\xbc/ s/^\xbe/\xbd/ s/^\xbf/\xbe/ s/^\xc0/\xbf/ s/^\xc1/\xc0/ s/^\xc2/\xc1/ s/^\xc3/\xc2/ s/^\xc4/\xc3/ s/^\xc5/\xc4/ s/^\xc6/\xc5/ s/^\xc7/\xc6/ s/^\xc8/\xc7/ s/^\xc9/\xc8/ s/^\xca/\xc9/ s/^\xcb/\xca/ s/^\xcc/\xcb/ s/^\xcd/\xcc/ s/^\xce/\xcd/ s/^\xcf/\xce/ s/^\xd0/\xcf/ s/^\xd1/\xd0/ s/^\xd2/\xd1/ s/^\xd3/\xd2/ s/^\xd4/\xd3/ s/^\xd5/\xd4/ s/^\xd6/\xd5/ s/^\xd7/\xd6/ s/^\xd8/\xd7/ s/^\xd9/\xd8/ s/^\xda/\xd9/ s/^\xdb/\xda/ s/^\xdc/\xdb/ s/^\xdd/\xdc/ s/^\xde/\xdd/ s/^\xdf/\xde/ s/^\xe0/\xdf/ s/^\xe1/\xe0/ s/^\xe2/\xe1/ s/^\xe3/\xe2/ s/^\xe4/\xe3/ s/^\xe5/\xe4/ s/^\xe6/\xe5/ s/^\xe7/\xe6/ s/^\xe8/\xe7/ s/^\xe9/\xe8/ s/^\xea/\xe9/ s/^\xeb/\xea/ s/^\xec/\xeb/ s/^\xed/\xec/ s/^\xee/\xed/ s/^\xef/\xee/ s/^\xf0/\xef/ s/^\xf1/\xf0/ s/^\xf2/\xf1/ s/^\xf3/\xf2/ s/^\xf4/\xf3/ s/^\xf5/\xf4/ s/^\xf6/\xf5/ s/^\xf7/\xf6/ s/^\xf8/\xf7/ s/^\xf9/\xf8/ s/^\xfa/\xf9/ s/^\xfb/\xfa/ s/^\xfc/\xfb/ s/^\xfd/\xfc/ s/^\xfe/\xfd/ s/^\xff/\xfe/ x } /^</ { x s/((.|[^.])*)(.|[^.])$/\3\1/ # Rotate mem to the right. (MP--) x } /^>/ { x s/^(.|[^.])((.|[^.])*)$/\2\1/ # Rotate mem to the left. (MP++) x } /^\{/ { # '['; start of loop. x /^\x0/ { # If curr mem cell is zero: s/^/-:/ # Insert a counter to keep track of nested looping depth. :loopCountStart x s/^(.)(.*)$/\2\1/ # IP++ /^\{/ { x s/^/-/ # Increase loop depth. x } /^}/ { x s/^-// # Decrease loop depth. x } x /^-/ b loopCountStart s/^:// # Strip leading colon (temp to separate loopcount from mem). } x } /^}/ { # ']'; end of loop. x /^\x0/ !{ # If curr mem cell is nonzero: s/^/-:/ # Insert a counter to keep track of nested looping depth. :loopCountEnd x s/^(.*)(.)$/\2\1/ # IP-- /^\{/ { x s/^-// # Decrease loop depth. x } /^}/ { x s/^/-/ # Increase loop depth. x } x /^-/ b loopCountEnd s/^:// # Strip leading colon (temp to separate loopcount from mem). } x } /^\./ { x;p;x } /^,/ { } # I/O - unimplemented. /^q/ { x s/(.|[^.])/&, /g # Neater memory output. s/, $// # Strip the trailing ', '. s/^(.|[^.])*$/{ & }/ # Contain output in bracers. # d # Delete the standard output! q } :next s/^(.)(.*)$/\2\1/ # Rotate commands to the left. b parse