Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2012 18:22:36

OxyD
Зарегистрирован: 2012-04-18
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

конечные атоматы в питоне

Здравствуйте. Нужна помощь, в институте уволили преподшу, преподающую нам программирование, вместо нее поставили другого который не знает питона, он сказал сдаете все лабы будет вам зачет. никакие лекции и семинары у нас не проводятся. 2 лабы я уже вроде как сделал, но как делать вот эту не представляю как:

Цель — научиться использовать принцип конечных автоматов для простейшего лексического анализа.

Задание. Составить программу на языке Python, выполняющую анализ и обработку вводимого текста в соответствии с вариантом задания. В программе не должно быть ограничений на количество и длину строк исходного текста. Предполагается, что текст дан в кодировке ASCII и содержит буквы только латинского алфавита.

Замечания. Программа должна читать данные со стандартного ввода и выводить на стандартный вывод. Знак табуляции обозначается как «\t», а перевод строки «\n» при работе над программой.

Выделить все нечетные числа в тексте, если сумма их цифр четна.
< if i was you, i'd do 77 labs in 3 weeks
> 77
Пример Реализовать конечный автомат для подсчета слов в тексте, состоящего только из букв латинского алфавита и разделителей:**
from sys import stdin
k = 0
state = “out”
for char in stdin.read():
if state == “out”:
if “a” <= char <= “z” or “A” <= c <= “Z”:
state = “in”
k = k + 1
elif state == “in”:
if char == “ ” or char == “\t” or char == “\n” or char == “,”:
state = “out”
print k

с машиной тьюринга знаком, но не могу понять как заставить питон перебирать символы строк, что за метод(?) stdin.read, sys, char, from import stdin. Объясните хотя пример который приведен выше, за что каждое слово в ном отвечает, сам я нигде про это не могу найти информации(
спасибо

Офлайн

#2 Апрель 18, 2012 18:23:50

OxyD
Зарегистрирован: 2012-04-18
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

конечные атоматы в питоне

ой извините за дубблирование у меня браузер завис, удалите 2 темы

Офлайн

#3 Апрель 18, 2012 19:06:05

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

конечные атоматы в питоне

while True:
    stroka = raw_input('<')
    if stroka == 'q':
        break
    for slovo in stroka.split():
        if slovo.isdigit():
            if not int(slovo)%2:
                if  sum(map(int,slovo)) %2:
                    print '>',slovo



Офлайн

#4 Апрель 19, 2012 23:24:04

OxyD
Зарегистрирован: 2012-04-18
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

конечные атоматы в питоне

спасибо! только поясните как дать программе понять что я закончил вводить текст, и начался его анализ?

Офлайн

#5 Апрель 20, 2012 00:47:02

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

конечные атоматы в питоне

OxyD
Выделить все нечетные числа в тексте, если сумма их цифр четна.
< if i was you, i'd do 77 labs in 3 weeks
> 77
#!/usr/bin/env python3
 
def func(s):
    """Search even sums of digit words."""
    delims = ' '
    digits = '0123456789'
     
    lst = []
     
    state = 0
    word, wsum = '', 0
     
    i, slen = 0, len(s)
    while i < slen:
        c = s[i]
        if state == 0:
            if c not in delims:
                i -= 1
                state = 1
        elif state == 1:
            if c in digits:
                word += c
                wsum += int(c)
            elif c not in delims:
                word, wsum = '', 0
                state = 0
            if c in delims or i + 1 == slen:
                i -= 1
                state = 2
        elif state == 2:
            if wsum % 2 == 0:
                lst.append(word)
            word, wsum = '', 0
            state = 0
        i += 1
    return lst
 
if __name__ == '__main__':    
    strings = ("4 abc 12 def 345 ghi 5 jkl 57",
               " 4 abc 12 def 345 ghi 5 jkl 57 ",
               "1 2 3 4 5 6 7 8 9 10 11")
    for s in strings:           
        print('str: <{0}>\n'
              'lst: {1}'.format(s, func(s)))
[guest@localhost py]$ ./evensums.py
str: <4 abc 12 def 345 ghi 5 jkl 57>
lst: ['4', '345', '57']
str: < 4 abc 12 def 345 ghi 5 jkl 57 >
lst: ['4', '345', '57']
str: <1 2 3 4 5 6 7 8 9 10 11>
lst: ['2', '4', '6', '8', '11']
[guest@localhost py]$

новая версия
#!/usr/bin/env python3
 
def func(s):
    """Search even sums of digit words."""
    delims = ' \t'
    digits = '0123456789'
     
    lst = []
     
    state = 'space'
    word, wsum = '', 0
     
    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 digits:
                i -= 1
                state = 'digits'
            else:
                state = 'skip'
        elif state == 'digits':
            if c in digits:
                word += c
                wsum += int(c)
            if c in delims or \
               (c in digits and i + 1 == slen):
                i -= 1
                state = 'count'
            elif c not in digits:
                word, wsum = '', 0
                state = 'skip'
        elif state == 'skip':
            if c in delims:
                state = 'space'
        elif state == 'count':
            if wsum % 2 == 0:
                lst.append(word)
            word, wsum = '', 0
            state = 'space'
        i += 1
    return lst
 
if __name__ == '__main__':    
    strings = (" 4 abc 12 def 345 ghi 5 jkl 57 ",
               "4 abc 12 def 345a345 ghi 5 jkl 57",
               "4 abc 12 def 345 ghi 5 jkl 57a",
               "1 2 3 4 5 6 7 8 9 10")
    for s in strings:           
        print('str: <{0}>\n'
              'lst: {1}'.format(s, func(s)))
[guest@localhost py]$ ./evsums.py
str: < 4 abc 12 def 345 ghi 5 jkl 57 >
lst: ['4', '345', '57']
str: <4 abc 12 def 345a345 ghi 5 jkl 57>
lst: ['4', '57']
str: <4 abc 12 def 345 ghi 5 jkl 57a>
lst: ['4', '345']
str: <1 2 3 4 5 6 7 8 9 10>
lst: ['2', '4', '6', '8']
[guest@localhost py]$



Отредактировано py.user.next (Апрель 21, 2012 02:20:27)

Офлайн

#6 Апрель 20, 2012 11:14:16

OxyD
Зарегистрирован: 2012-04-18
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

конечные атоматы в питоне

Вроде стал чуток разбираться, можете подробней написать про stdin, я так понимаю это ввод данных с клавиатуры, как обозначить конец ввода?

Отредактировано OxyD (Апрель 20, 2012 11:15:17)

Офлайн

#7 Апрель 21, 2012 02:21:11

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

конечные атоматы в питоне

исправил две логические ошибки у себя
старую версию оставил для сравнения



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version