def run_program(input)
# "$*[0]" replaced with "input" (not possible to simulate command-line args in IDEONE)
x=(1..81).select{|j|input.split(?,).all?{|y|i=j-1
z='SML'
[z[i%9/3]+?H,z[i%3]+?E,z[i/27]+?B,z[i/9%3]+?F].member?(y[-2,2])^y[?!]}}
p x==[]?[0]:x
end
run_program('SH,LB,ME,SF')
run_program('!SH,LB,!ME,SF')
run_program('SB,!MF,!LF')
run_program('MH,!MH')
ZGVmIHJ1bl9wcm9ncmFtKGlucHV0KQojICIkKlswXSIgcmVwbGFjZWQgd2l0aCAiaW5wdXQiIChub3QgcG9zc2libGUgdG8gc2ltdWxhdGUgY29tbWFuZC1saW5lIGFyZ3MgaW4gSURFT05FKQoKeD0oMS4uODEpLnNlbGVjdHt8anxpbnB1dC5zcGxpdCg/LCkuYWxsP3t8eXxpPWotMQp6PSdTTUwnClt6W2klOS8zXSs/SCx6W2klM10rP0UseltpLzI3XSs/Qix6W2kvOSUzXSs/Rl0ubWVtYmVyPyh5Wy0yLDJdKV55Wz8hXX19CnAgeD09W10/WzBdOngKCmVuZAoKCnJ1bl9wcm9ncmFtKCdTSCxMQixNRSxTRicpCnJ1bl9wcm9ncmFtKCchU0gsTEIsIU1FLFNGJykKcnVuX3Byb2dyYW0oJ1NCLCFNRiwhTEYnKQpydW5fcHJvZ3JhbSgnTUgsIU1IJykK
[56]
[58, 60, 61, 63]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[0]