Форум сайта python.su
Выделить все одиннадцатиричные числа с лексикографическим возрастанием цифр.
< 111123456789 123456789a 21 1
> 123456789a 1
Офлайн
notthishitagain, если вам нужно ручками делать, то начинайте с рисования графа, а если нет, то
import re ...
Отредактировано regall (Май 30, 2012 23:43:59)
Офлайн
Можно также сортировать строку->множество->строку и потом сравнивать отсортированную со старой.
Офлайн
Если конечные автоматы, то тогда наверное как-то так:
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)
Офлайн
Ed
Если конечные автоматы, то тогда наверное как-то так:
[guest@localhost py]$ ./t2.py " 111123456789 123456789a 21 1 "
['111123456789', '123456789a', '1']
[guest@localhost py]$
[guest@localhost py]$ ./t2.py " 111123456789 123456789a 21 1 ab "
['111123456789', '123456789a', '1', 'a']
[guest@localhost py]$
Отредактировано py.user.next (Июнь 3, 2012 09:30:41)
Офлайн
Это мелочи. Я в общем-то стремился показать принцип. Но на всякий случай вот фикс:
@@ -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
Офлайн
ещё
#!/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]$
Отредактировано py.user.next (Июнь 5, 2012 03:09:41)
Офлайн
Люблю потоки сознания :) Вот мой вариант:
for part in line.split():
try:
if int(part, 11) == int(''.join(sorted(set(part))), 11):
print part
except ValueError:
continue
Офлайн
EdПрикольно. Откуда взял?
Если конечные автоматы, то тогда наверное как-то так:
Офлайн
odnochlenИз головы. А еще я в нее ем, да :)
Прикольно. Откуда взял?
Офлайн