Найти - Пользователи
Полная версия: Конечные автоматы
Начало » Центр помощи » Конечные автоматы
1
notthishitagain
Выделить все одиннадцатиричные числа с лексикографическим возрастанием цифр.
< 111123456789 123456789a 21 1
> 123456789a 1
regall
notthishitagain, если вам нужно ручками делать, то начинайте с рисования графа, а если нет, то
import re
...
fata1ex
Можно также сортировать строку->множество->строку и потом сравнивать отсортированную со старой.
Ed
Если конечные автоматы, то тогда наверное как-то так:
import sys
import os

class FSM_Parser(object):
def __init__(self):
self.result = ''
self.char = ''
self.results = []
self.table = {
('START', 'EOL'): ('EXIT', None),
('START', 'GOODDIGIT'): ('GOOD', self.add_to_result),
('START', 'DELIM'): ('START', None),
('GOOD', 'GOODDIGIT'): ('GOOD', self.add_to_result),
('GOOD', 'BADDIGIT'): ('BAD', self.clean_result),
('GOOD', 'EOL'): ('EXIT', self.process_result),
('GOOD', 'DELIM'): ('START', self.process_result),
('BAD', 'GOODDIGIT'): ('BAD', None),
('BAD', 'BADDIGIT'): ('BAD', None),
('BAD', 'EOL'): ('EXIT', None),
('BAD', 'DELIM'): ('GOOD', None),
}
def get_event(self, inp):
try:
self.char = inp.pop()
except IndexError:
return 'EOL'

if '0' <= self.char <= 'a':
if self.result and self.result[-1] > self.char:
return 'BADDIGIT'
return 'GOODDIGIT'
else:
return 'DELIM'

def add_to_result(self):
self.result += self.char

def process_result(self):
self.results.append(self.result)
self.clean_result()

def clean_result(self):
self.result = ''

def parse(self, inp, state='START'):
while state != 'EXIT':
event = self.get_event(inp)
state, action = self.table[(state, event)]
if action:
action()
return self.results

def doit(istr):
print FSM_Parser().parse(list(istr)[::-1], 'START')

if __name__ == '__main__':
if len(sys.argv) != 2:
print 'Usage: %s <string>' % os.path.basename(sys.argv[0])
sys.exit(1)
sys.exit(doit(sys.argv[1]))
py.user.next
Ed
Если конечные автоматы, то тогда наверное как-то так:

первое число тоже включает
[guest@localhost py]$ ./t2.py " 111123456789 123456789a 21 1 "
['111123456789', '123456789a', '1']
[guest@localhost py]$

b считается разделителем
[guest@localhost py]$ ./t2.py " 111123456789 123456789a 21 1 ab "
['111123456789', '123456789a', '1', 'a']
[guest@localhost py]$

ab - это двенадцатиричное число, которое нужно пропустить
Ed
Это мелочи. Я в общем-то стремился показать принцип. Но на всякий случай вот фикс:
@@ -26,11 +27,13 @@
return 'EOL'

if '0' <= self.char <= 'a':
- if self.result and self.result[-1] > self.char:
+ if self.result and self.result[-1] >= self.char:
return 'BADDIGIT'
return 'GOODDIGIT'
- else:
+ elif self.char == ' ':
return 'DELIM'
+ else:
+ return 'BADDIGIT'

def add_to_result(self):
self.result += self.char
py.user.next
ещё
#!/usr/bin/env python3
 
import sys
 
def func(s):
    """Find all valid numbers of radix 11
       with strict ascending order of digits."""
    alpha = '0123456789a'
    delims = ' \t\n'
 
    state = 'space'
    word = prev = ''
    lst = []
 
    i, slen = 0, len(s)
    while i < slen:
        c = s[i]
        if state == 'space':
            if c not in delims:
                i -= 1
                state = 'word'
        elif state == 'word':
            if c in alpha:
                word = prev = c
                if i + 1 == slen:
                    lst.append(word)
                state = 'number'
            else:
                state = 'skip'
        elif state == 'number':
            if c in delims:
                lst.append(word)
                state = 'space'
            elif c not in alpha:
                state = 'skip'
            elif alpha.find(prev) < alpha.find(c):
                word += c
                prev = c
                if i + 1 == slen:
                    lst.append(word)
            else:
                state = 'skip'
        elif state == 'skip':
            if c in delims:
                state = 'space'
        i += 1
    return lst
     
if __name__ == '__main__':    
    strings = (" 111123456789 123456789a 21 1 ",
               "01",
               "10")
    for s in strings:           
        print('str: <{0}>\n'
              'lst: {1}'.format(s, func(s)))
    #print(func(sys.stdin.read()))
[guest@localhost py]$ ./radix11.py
str: < 111123456789 123456789a 21 1 >
lst: ['123456789a', '1']
str: <01>
lst: ['01']
str: <10>
lst: []
[guest@localhost py]$

add
убрал одну лишнюю строку в состоянии number
Ed
Люблю потоки сознания :) Вот мой вариант:
for part in line.split():
try:
if int(part, 11) == int(''.join(sorted(set(part))), 11):
print part
except ValueError:
continue
odnochlen
Ed
Если конечные автоматы, то тогда наверное как-то так:
Прикольно. Откуда взял?
Ed
odnochlen
Прикольно. Откуда взял?
Из головы. А еще я в нее ем, да :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB