# !/usr/bin/ruby
#MMM  9/5/2008
# Simulation/Implementation of a DFA in Ruby
# the DFA M=(Q, Sigma, delta, q0, F)
numstates = 4			 # Q = [0, 1, 2, 3]
alphabet = ['a', 'b']		 # Sigma = {a, b}
				 # delta implmented as function  below
q0 = 0				 # Start state is state 0
acceptingState = Array.new(4, 0)
acceptingState[1] = 1		 # F = { 1 }

def delta(state, inputChar)
  case 
  when state == 0 
	case
	when inputChar == 'a' then return 1;
	when inputChar == 'b' then return 3
        else return 999
	end
  when state == 1 
	case
	when inputChar == 'a' then return 2
	when inputChar == 'b' then return 0
        else return 999
	end
  when state == 2 
	case
	when inputChar == 'a' then return 3
	when inputChar == 'b' then return 3
        else return 999
	end
  when state == 3 
	case
	when inputChar == 'a' then return 3
	when inputChar == 'b' then return 3
        else return 999
	end
  else return 999
  end 
end

# Start Simulation
state = 0
print "alphabet = #{alphabet}\n"
print "acceptingState = #{acceptingState}\n"
#
print "Enter the input string: "
line = gets
puts "line=#{line}"
a = line.chomp.split(//)
a.each { |x| 
    nextstate = delta(state, x)
    print "delta(=#{state}, char=#{x}) = #{nextstate}\n"
    state = nextstate
}
if acceptingState[state] == 1 then puts "Accept"
else puts "Reject"
end

state = q0

# Other data structures
# lists of strings of length n-1 and n
strnm1 = Array.new();
strn = Array.new();

strnm1 = ["a", "b"]
print "strnm1 = #{strnm1}\n"

[2,3,4,5, 6, 7, 8].each { |len|
    numstrings = 0
    strnm1.each { |str|
        ###print "next string of len #{len-1} = #{str}:\n"
	alphabet.each { |chr|
		x = chr + str
		###print "str=#{str}, chr=#{chr}, adding #{x} to list of strings of length #{len}\n"
                strn[numstrings] = x
		numstrings = numstrings + 1
	}
    }
    print "Strings of length #{len}:\n"
    strn.each { |str|
        print "#{str}\n"
    }
    strnm1 = strn
    strn = Array.new
    numstrings = 0
}

