String Manipulation Interpreter
R, 287 286 273 269 bytes
function(C,x='',`[`=gsub,`!`=intToUtf8,`?`=utf8ToInt){for(k in el(strsplit(C,'\\|'))){B=eval(parse(t='^.'['','(?<=.)>$'['readLines(,1)','[@#](.+)'['"\\1"',k],,T]]));x=switch((?substr(k,1,1))%%13-2,strrep(x,B),paste0(x,B),,B['',x,f=T],!rev(?x),print(x),,!sample(?x))};x}
Try it online!
- -1 thanks to @Kirill L.
- -4 thanks to @Giuseppe
Unrolled code and explanation :
function(C){ # C is the string manipulation expression
x = '' # initialize x = ''
tokens = el(strsplit(C,'\\|')) # split C by pipe '|'
for(k in tokens){ # for each token k
arg2 = k
arg2 = gsub('[@#](.+)','"\\1"',k) # replace @X or #X with "X" (in quotes)
arg2 = gsub('(?<=.)>$','"readLines(,1)"',
arg2,perl=T) # replace > with readLines(,1)
arg2 = gsub('^.','',arg2) # remove the first character
B = eval(parse(t=arg2)) # evaluate the string : this will be our
# second argument B
A = substr(k,1,1) # take the first character :
# i.e. the main command (+,-,! etc)
x = switch(A, # switch on the main command, execute the
'+'=paste0(x,B), # corresponding expression and
'!'=intToUtf8(rev(utf8ToInt(x))), # store the result into x
'*'=strrep(x,B), # Note: in the actual code we switch on
'-'=B['',x,f=T], # the utf8 value MOD 13-2 of the command
'$'=intToUtf8(sample(utf8ToInt(x))),
'<'=print(x)
)
}
x # return x (and print it implicitly)
}
Python 2, 215 219 209 208 bytes
from random import*
I=raw_input;o=''
for t in I().split('|'):p=t[1:]=='>'and I()or t[2:];exec"o=o[::-1] o*=int(p) 0 print(o) o=''.join(sample(o,len(o))) o=o.replace(p,'') o+=p".split()[ord(t[0])*5%11]
print o
Try it online!
-4 because raw_input
is required.
9 bytes thanks to Embodiment of Ignorance; 1 byte from Ascii-only.
Ruby -palF\|
, 146 142 bytes
r='';$F.map{|i|x=i[1]!=?>?i[2..-1]:gets.chomp;eval %w[r.reverse! r*=x.to_i 0 $><<r r=r.chars.shuffle*'' r.gsub!x,'' r+=x][i[0].ord*5%11]};$_=r
Try it online!
Port of Chas Brown's Python answer. Does not print newlines after output.
As usual, Ruby 2.6 version will be 2 bytes shorter with endless range indexing (i[2..]
).