Ruby Program / Проблема - PullRequest
       26

Ruby Program / Проблема

0 голосов
/ 07 января 2010

Для заданной строки символов, без использования регулярного выражения или сопоставления с образцом, как получить вывод, если символы соответствуют aaa, должен вывести 1, а если символы соответствуют, aBa должен вывести 2. (Примечание: не следует повторно обрабатывать символы так, чтобы при обработке одного и того же ввода выводились «1» и «2»)

Так, например:

учитывая 'aaBaBaaaBaaa', он должен вывести 211

учитывая 'aaaBaBaaaaBBaBaBa', он должен вывести 1212

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 08 января 2010

Похоже, вы хотите конечный автомат:

require 'statemachine'

state_machine = Statemachine.build do
  trans :_, :a, :a
  trans :_, :B, :_
  trans :a, :a, :aa
  trans :a, :B, :aB
  trans :aa, :a, :_, 'print 1'
  trans :aa, :B, :aB
  trans :aB, :a, :_, 'print 2'
  trans :aB, :B, :_
end

"aaBaBaaaBaaa".each_char do |i|
  state_machine.process_event(i)
end

state_machine.reset
puts

"aaaBaBaaaaBBaBaBa".each_char do |i|
  state_machine.process_event(i)
end
4 голосов
/ 07 января 2010

без использования регулярного выражения или сопоставления с образцом

#input = 'aaBaBaaaBaaa'
input = 'aaaBaBaaaaBBaBaBa'
codes = {'aaa' => 1, 'aBa' => 2}
patterns = codes.keys
output = []

current = 0
length = input.length

while current <= length - 1
    is_find = false
    patterns.each do|pattern|
        len = pattern.length
        if input[current, len] == pattern
            output << codes[pattern]
            current += len
            is_find = true
            break
        end
    end

    current += 1 if !is_find
end

p output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...