M
MenTaLguY
I've made no particular effort to make this solution efficient, but I had fun writing it.
MORSE = Hash[*%w(
A .- N -.
B -... O ---
C -.-. P .--.
D -.. Q --.-
E . R .-.
F ..-. S ...
G --. T -
H .... U ..-
I .. V ...-
J .--- W .--
K -.- X -..-
L .-.. Y -.--
M -- Z --..
)].invert.freeze
class Decoder
Arc = Struct.new :input, :to,
utput
State = Struct.new :arcs
Solution = Struct.new :state,
utput
def initialize(code)
@start = State[[]]
code.each do |input, output|
raise ArgumentError, "input cannot be empty" if input.empty?
branch = input.reverse.unpack("C*").inject(@start) do |state, c|
string, output = output, ""
State[[Arc[c, state, string]]]
end
@start.arcs += branch.arcs
end
end
def process(input)
input.unpack("C*").inject([Solution[@start, ""]]) do |solutions, c|
break [] if solutions.empty?
solutions.map do |solution|
solution.state.arcs.select do |arc|
arc.input == c
end.map do |arc|
Solution[arc.to, solution.output + arc.output]
end
end.flatten
end.select do |solution|
solution.state == @start
end.map do |solution|
solution.output
end
end
end
Decoder.new( MORSE ).process( gets.chomp ).sort.each do |result|
puts result
end
MORSE = Hash[*%w(
A .- N -.
B -... O ---
C -.-. P .--.
D -.. Q --.-
E . R .-.
F ..-. S ...
G --. T -
H .... U ..-
I .. V ...-
J .--- W .--
K -.- X -..-
L .-.. Y -.--
M -- Z --..
)].invert.freeze
class Decoder
Arc = Struct.new :input, :to,
State = Struct.new :arcs
Solution = Struct.new :state,
def initialize(code)
@start = State[[]]
code.each do |input, output|
raise ArgumentError, "input cannot be empty" if input.empty?
branch = input.reverse.unpack("C*").inject(@start) do |state, c|
string, output = output, ""
State[[Arc[c, state, string]]]
end
@start.arcs += branch.arcs
end
end
def process(input)
input.unpack("C*").inject([Solution[@start, ""]]) do |solutions, c|
break [] if solutions.empty?
solutions.map do |solution|
solution.state.arcs.select do |arc|
arc.input == c
end.map do |arc|
Solution[arc.to, solution.output + arc.output]
end
end.flatten
end.select do |solution|
solution.state == @start
end.map do |solution|
solution.output
end
end
end
Decoder.new( MORSE ).process( gets.chomp ).sort.each do |result|
puts result
end