Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2012 21:36:41

notthishitagain
Зарегистрирован: 2012-05-30
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Конечные автоматы

Выделить все одиннадцатиричные числа с лексикографическим возрастанием цифр.
< 111123456789 123456789a 21 1
> 123456789a 1

Офлайн

#2 Май 30, 2012 23:43:50

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Конечные автоматы

notthishitagain, если вам нужно ручками делать, то начинайте с рисования графа, а если нет, то

import re
...



Отредактировано regall (Май 30, 2012 23:43:59)

Офлайн

#3 Июнь 1, 2012 01:13:44

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Конечные автоматы

Можно также сортировать строку->множество->строку и потом сравнивать отсортированную со старой.



Офлайн

#4 Июнь 2, 2012 15:08:32

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Конечные автоматы

Если конечные автоматы, то тогда наверное как-то так:

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]))



Отредактировано Ed (Июнь 2, 2012 15:39:25)

Офлайн

#5 Июнь 3, 2012 09:18:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Конечные автоматы

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 - это двенадцатиричное число, которое нужно пропустить



Отредактировано py.user.next (Июнь 3, 2012 09:30:41)

Офлайн

#6 Июнь 3, 2012 10:49:05

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Конечные автоматы

Это мелочи. Я в общем-то стремился показать принцип. Но на всякий случай вот фикс:

@@ -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



Офлайн

#7 Июнь 4, 2012 05:01:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Конечные автоматы

ещё

#!/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



Отредактировано py.user.next (Июнь 5, 2012 03:09:41)

Офлайн

#8 Июнь 4, 2012 10:42:56

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Конечные автоматы

Люблю потоки сознания :) Вот мой вариант:

for part in line.split():
try:
if int(part, 11) == int(''.join(sorted(set(part))), 11):
print part
except ValueError:
continue



Офлайн

#9 Июль 11, 2012 03:47:33

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Конечные автоматы

Ed
Если конечные автоматы, то тогда наверное как-то так:
Прикольно. Откуда взял?

Офлайн

#10 Июль 12, 2012 23:43:24

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Конечные автоматы

odnochlen
Прикольно. Откуда взял?
Из головы. А еще я в нее ем, да :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version