Найти - Пользователи
Полная версия: Графический исполнитель "Робот"
Начало » Python для новичков » Графический исполнитель "Робот"
1 2 3 4 None 23 24 25 26 27 28 29 30 31
py.user.next
Мои функции

С двумя флагами
  
def find_sec_let_num_bef(text):
    out = 'none'
    f_was_letter = f_was_digit = False
    for ch in text:
        if ch.isalpha():
            if f_was_letter and f_was_digit:
                out = ch
                break
            else:
                f_was_letter = True
        elif ch.isdigit():
            f_was_digit = True
    return out

С одной переменной (полная версия)
  
def find_sec_let_num_bef(text):
    out = 'none'
    state = 0 # (0 no, 1 no let1, 2 no dig, 3 let1 dig let2, 4 dig let1 let2)
    for ch in text:
        if state == 0:
            if ch.isalpha():
                state = 1
            elif ch.isdigit():
                state = 2
        elif state == 1:
            if ch.isdigit():
                state = 3
        elif state == 2:
            if ch.isalpha():
                state = 4
        elif state == 3:
            if ch.isalpha():
                out = ch
                break
        elif state == 4:
            if ch.isalpha():
                out = ch
                break
    return out

С одной переменной (сокращённая версия)
  
def find_sec_let_num_bef_(text):
    out = 'none'
    state = 0 # (0 no, 1 no let1, 2 no dig, 3 (let1 dig | dig let1) dig2)
    for ch in text:
        if state == 0:
            if ch.isalpha():
                state = 1
            elif ch.isdigit():
                state = 2
        elif state == 1:
            if ch.isdigit():
                state = 3
        elif state == 2:
            if ch.isalpha():
                state = 3
        elif state == 3:
            if ch.isalpha():
                out = ch
                break
    return out

Юнит-тесты, через которые прогонял функции
Файл flagex_test.py
  
#!/usr/bin/env python3
 
import pytest
from flagex import find_sec_let_num_bef as f
 
@pytest.mark.parametrize(
    'io', (
        ('a1!', 'none'),
        ('a!1', 'none'),
        ('!a1', 'none'),
        ('!1a', 'none'),
        ('1!a', 'none'),
 
        ('abc1!', 'none'),
        ('abc!1', 'none'),
 
        ('ab1c!', 'c'),
        ('ab1!c', 'c'),
        ('ab1!c2d', 'c'),
 
        ('1ab', 'b'),
        ('1abc', 'b'),
        ('12ab', 'b'),
        ('12abc', 'b'),
        ('12a3b', 'b'),
 
        ('1;;;;ab', 'b'),
        ('1;;;;abc', 'b'),
        ('1;;a;;b', 'b'),
        ('1;;a;;bc', 'b'),
 
        ('a,123456789b', 'b'),
        ('a,1234@56789b', 'b'),
 
        ('aaa bbb ccclkj!@# $lll kkk 1!#@ $jkkk 123 bbb aaa', 'j'),
        (',;1abc bbb ccclkj!@# $lll kkk', 'b'),
        ('bbb ccclkj!@# $lll kkk123::@', 'none'),
    )
)
def test_values(io):
    i, o = io
    assert f(i) == o

Чтобы запустить тесты для функции, нужно создать файл flagex.py и в него записать функцию find_sec_let_num_bef().

Команда для запуска тестов в директории
python3 -m pytest

Пример запуска тестов
[guest@localhost flagex]$ python3 -m pytest
================================== test session starts ===================================
platform linux -- Python 3.6.1, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /home/guest/prog/tests/py/flagex
plugins: mock-1.6.0, cov-2.4.0, spec-1.1.0, pep8-1.0.6, flakes-1.0.1
collected 24 items

flagex_test.py ........................ [100%]

=================================== 24 passed in 0.05s ===================================
[guest@localhost flagex]$
ksu_uuu
Anime_Jedi
Подскажите по task_7_7 она же 29не пойму как продумать логику для высчитывания местоположения точки
 while not cell_is_filled() and not wall_is_on_the_right():
        move_right()
        if cell_is_filled():
            n = 0
            while cell_is_filled():
                n += 1
                if n < 3:
                    move_right()
                else:
                    break
py.user.next
ksu_uuu
Anime_Jedi
Подскажите по task_7_7 она же 29
Здесь решал.
0ppa
py.user.next
Не судите строго, но я на самом начале запнулся. Хотел по простому сделать, но не получилось …
Хотел цифру найти так,
# pervaya bukva
for d in newer:
while “0” <= d <= “9”:
Затем так же букву:
два списка
a = ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’
A = ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’
И циклом
for f in spisok:
if f in a:
Но так я только первую букву и цифру нахожу.
Чтение про списки и про индексы в интернете мне не помогло.
py.user.next
0ppa
Хотел цифру найти так
Да можно по-разному находить. Суть метода str.isdigit() или str.isalpha() сводится к тому, что берётся каждый символ строки, у которой вызывается метод, и этот символ ищется в фиксированном множестве символов. Оно сложнее, конечно, устроено, так как ищет по всему юникоду. Но самодельные функции isdigit() и isalpha() можно написать, ничто не мешает.

Например:
  
>>> def isalpha(ch):
...     return ch in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
... 
>>> def isdigit(ch):
...     return ch in '0123456789'
... 
>>> text = 'One, Two, Three. 1 2 3. 我'
>>> 
>>> for i in text:
...     if isalpha(i):
...         print(i, 'is a letter')
...     elif isdigit(i):
...         print(i, 'is a digit')
...     else:
...         print('<{}> is neither a letter nor a digit'.format(i))
... 
O is a letter
n is a letter
e is a letter
<,> is neither a letter nor a digit
< > is neither a letter nor a digit
T is a letter
w is a letter
o is a letter
<,> is neither a letter nor a digit
< > is neither a letter nor a digit
T is a letter
h is a letter
r is a letter
e is a letter
e is a letter
<.> is neither a letter nor a digit
< > is neither a letter nor a digit
1 is a digit
< > is neither a letter nor a digit
2 is a digit
< > is neither a letter nor a digit
3 is a digit
<.> is neither a letter nor a digit
< > is neither a letter nor a digit
<> is neither a letter nor a digit
>>> 
>>> '我'.isalpha()
True
>>>

Так как это всё уже реализовано в питоне, мы используем встроенные методы, а не пишем свои. Но можем и свои написать. Далеко не всегда уже реализованные методы полностью решают возникшую задачу поиска, поэтому смысл в способности реализовать их заново с каким-то добавками есть. Лучше знать, как реализован какой-то метод, и использовать его в готовом виде, чем знать только то, какие готовые методы есть и использовать только всё готовое. Рано или поздно возникнет ситуация, где готовый метод не подходит, а свои писать ты не умеешь, и тогда ты не решишь задачу и тебе придётся передавать её кому-то другому.

Так что можешь проверять и по-своему, буква это или цифра, тут задача на флаги главным образом.
AndreyD
f-a-v19
помоните, пожалуйста, с решением задачи 23 (task_6_6()пытаюсь так, но врезаюсь в стену в ряде случаевdef task_6_6(): while not wall_is_on_the_right(): if wall_is_above() or not wall_is_beneath(): move_right() while not wall_is_above(): move_up() fill_cell() while not wall_is_beneath(): move_down() move_right() while not wall_is_above(): move_up() fill_cell() while not wall_is_beneath(): move_down() while wall_is_beneath(): move_left() if __name__ == ‘__main__’: run_tasks()
я новенький и это задание мне далось болью и потом))) вроде как всё работает, но, возможно есть косяки…

вот, что у меня получилось:
     move_right()
    
    if not wall_is_above(): # решение проблемы если первый столб выпадает на самое начало коридора (это ломает код (цикл) написанный дальше)
        move_up()
        if wall_is_above(): # заполняет столб высотой в одну клетку
            fill_cell()
            move_down()
        while not wall_is_above() and wall_is_on_the_right(): # заполнение столба и выход из него в основной коридор
            fill_cell()
            move_up()
            if wall_is_above():
                fill_cell()
                while not wall_is_beneath() and wall_is_on_the_right():
                    move_down()
                    
    while wall_is_beneath() and not wall_is_on_the_right(): # заставляет робота двигаться до следующего столба
        move_right()
        if wall_is_beneath() and wall_is_on_the_right() and wall_is_above(): # отправляет робота в начальную точку когда заканчивается коридор
            while wall_is_beneath():
                move_left()
                
        if not wall_is_above() and wall_is_beneath(): # заполнение столба и выход из него в основной коридор
            move_up()
            fill_cell()
            if wall_is_above(): # возвращает робота в основной коридор, если столб был высотой в одну клетку
                move_down()
                if wall_is_beneath() and wall_is_on_the_right(): # решение проблемы если в конце коридора есть столб высотой в одну клетку ???
                    while wall_is_beneath():
                        move_left()
            while not wall_is_above() and wall_is_on_the_right() and wall_is_on_the_left(): # цикл заполнения столба
                move_up()
                fill_cell()
                if wall_is_above():
                    while not wall_is_beneath() and wall_is_on_the_right() and wall_is_on_the_left(): # выход робота в основной коридор после заполнения столба
                        move_down()
                    if wall_is_beneath() and wall_is_on_the_right(): # отправка робота в начальную точку если столб оказался в конце коридора
                        while wall_is_beneath():
                            move_left()

П.С.: не знаю как нормально тут отобразить отступы
py.user.next
AndreyD
не знаю как нормально тут отобразить отступы
Используй тег форума code
Пример
[code python] 
while True:
print('ok')
[/code]
AndreyD
Lucker
опять прошу помощи, Задача №27: task_7_5. Закрасить клетки с увеличивающимся интервалом. Расстояние до стены не известно. пока имею такой вид кода:n=0move_right()while not wall_is_on_the_right(): fill_cell() if cell_is_filled(): n+=1 move_right(n)Но боюсь тут вообще нужно воспользоваться циклом “for”, совсем голову сломал…и сразу еще вопрос, как сделать, чтобы отступы были видны в сообщении?
    move_right()
    fill_cell()
    move_right()
    fill_cell()
    a = 1
    def move_not_crush():                     # чтобы Робот не врезался в стену в процессе движения
        for move_not_crush in range(a):
            if not wall_is_on_the_right():
                move_right()
    while not wall_is_on_the_right():
        if not wall_is_on_the_right():
            fill_cell()
            if not wall_is_on_the_right():
                move_right()
                if not wall_is_on_the_right():
                    move_not_crush()
                    a += 1
py.user.next
AndreyD
помоните, пожалуйста, с решением задачи 23 (task_6_6()
AndreyD
я новенький и это задание мне далось болью и потом))) вроде как всё работает
Здесь делал эту задачу.

AndreyD
опять прошу помощи, Задача №27: task_7_5.
Здесь и здесь делал эту задачу.
iampankajnagla
Online Training is rapidly becoming one of the most cost-effective ways to educate the world’s rapidly expanding workforce.
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