2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Нарисовать траекторию
Сообщение07.02.2021, 20:04 


30/03/20
367
Добрый вечер. Условие:

(Оффтоп)

Нa вхoд пoдаётся пoследoвательность симвoлoв, пeрвый симвoл - тoт кoтoрым надo рисoвать траектoрию, пoследующие: < > V укaзывают нaпрaвление движeния


Задачу я решил, но решал семь часов и код не является эталоном понятности и элегантности, думаю заново решить задачу возможно проще чем в моём решении разобраться

(Оффтоп)

Код:
point = way[0]
print(point, end='')
right_pos = 0
left_pos = 0

for i in range(1, len(way)):
   
    sym = way[i]
   
    if sym == '>':
        print(point, end='')
        right_pos += 1
       
    if sym == 'V':
        print()
        if i == len(way) - 1:
            for i in range(right_pos):
                print(end=' ')
            print(point, end='')           
        elif way[i + 1] != '<':
            for i in range(right_pos):
                print(end=' ')
            print(point, end='')           
           
    if sym == '<':
        left_pos += 1       
        if i == len(way) - 1:
            for i in range(right_pos - left_pos):
                print(' ', end='')
            for i in range(right_pos - left_pos,
                           right_pos + 1):
                print(point, end='')
            right_pos -= left_pos
            left_pos = 0
        elif way[i + 1] != '<':
            for i in range(right_pos - left_pos):
                print(' ', end='')
            for i in range(right_pos - left_pos,
                           right_pos + 1):
                print(point, end='')
            right_pos -= left_pos
            left_pos = 0


Кратко о моём решении:

(Оффтоп)

Вывод на экран сразу осуществляется только в случае символа >

В случае символа V вывод (кроме перевода строки) осуществляется только если это последний символ или следующий символ после него не является символом <

И случай с символом < самый сложный, идёт подсчёт количества таких символов подряд, а вывод осуществляется только если это последний символ или следующий символ не является символом <


Меня огорчает сложность моего решения, код намного сложнее кода предыдущей задачи того же урока оцениваемой тем же количеством баллов (шифр Цезаря):

(Оффтоп)

Код:
step = int(input())   
string = input()

for symbol in string:
    num = ord(symbol)
    if num >= ord('а') and num <= ord('я'):
        num += step
        num -= ord('а')
        num %= 32
        num += ord('а')
    elif num >= ord('А') and num <= ord('Я'):
        num += step
        num -= ord('А')
        num %= 32
        num += ord('А')
    print(chr(num), end='')


Это уже третья подобная задача за три недели курса, намного отличающаяся от остальных по уровню сложности. Одна из них ещё и в тесте с ограничением времени мне попалась, поэтому тест удовлетворительно я не написал, несмотря на то что довольно легко решил все задачи следующие до теста. Я не уверен, это такие своеобразные "гробы" чтобы "курсанты" слишком умными себя не чувствовали, или это у меня мышление забаговано и не всегда способно найти очевидный лёгкий путь даже после многочасовых размышлений?

UPD: Что-то код отобразился иначе чем я ожидал :?
UPD 2: Пока использую другой тег, код без подсветки

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение07.02.2021, 20:35 
Заслуженный участник


09/05/12
25179
Позиционирование курсора на экране недоступно, возможности организовать себе "видеобуфер" из подручного массива нет?

И то, и другое стоило бы оговорить в условии, иначе задача становится тривиальной.

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение07.02.2021, 22:41 
Заслуженный участник


27/04/09
28128
Cuprum2020 в сообщении #1504404 писал(а):
Пока использую другой тег, код без подсветки
Вот этот тег и портит иногда начальные пробелы в строках. Используйте [syntax lang="python"]...[/syntax], он хоть со спойлерами и плохо работает, но зато сам сворачивается до вменяемой высоты, если кода много, так что прятать в спойлер понадобится очень редко.

Я бы предложил накапливать посещённые позиции в множестве, плюс ограничивающие всю траекторию значения координат, а потом уже всё напечатать в один заход, перебирая все координаты из ограниченного прямоугольника.

-- Пн фев 08, 2021 00:46:02 --

Вообще рисование в терминале без возможности поставить позицию вывода в произвольное место экрана — это на мой взгляд глупости. Те библиотеки, которые такое рисование делают, по-моему всегда используют функции для управления позицией вывода, чтобы не танцевать с бубном. :-)

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 20:28 


30/03/20
367
arseniiv в сообщении #1504416 писал(а):
Я бы предложил накапливать посещённые позиции в множестве, плюс ограничивающие всю траекторию значения координат, а потом уже всё напечатать в один заход, перебирая все координаты из ограниченного прямоугольника

Множество множеств двух чисел: координат Х и У посещённой позиции?
Pphantom в сообщении #1504410 писал(а):
Позиционирование курсора на экране недоступно

Это возврат каретки и backspace?

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 20:40 
Заслуженный участник


09/05/12
25179
Cuprum2020 в сообщении #1504465 писал(а):
Это возврат каретеки назад и backspace?
Это зависит от доступных возможностей языка/библиотеки. Например, в борландовских реализациях сразу нескольких языков когда-то была стандартная функция gotoxy(x,y), просто перемещающая курсор в заданную позицию экрана. На Python'е это делается либо с помощью Ncurses, либо однострочной самописной функцией (возможно и еще как-нибудь, но я его недолюбиваю, так что полный набор возможных решений точно не дам).

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 21:28 
Заслуженный участник


27/04/09
28128
Cuprum2020 в сообщении #1504465 писал(а):
Множество множеств двух чисел: координат Х и У посещённой позиции?
Просто множество кортежей (x, y). Множество множеств с этой задачей и не поможет, и ударит по производительности.

-- Пн фев 08, 2021 23:30:12 --

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

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 21:54 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
arseniiv в сообщении #1504480 писал(а):
Впрочем в таких задачах обычно или явно гарантируют, что левее и выше мы не уйдём, или наоборот явно предупреждают, что можем уйти.
Выше точно не уйдём, по условию мы вообще не умеем двигаться вверх.

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 22:03 
Заслуженный участник


27/04/09
28128
Аааа, я вчера увидел три символа и додумал четвёртый.

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 22:12 


30/03/20
367
Левее тоже не уйдём, я не полностью изложил условия ввиду грозных предупреждений авторов курса о их исключительных правах на все материалы

 Профиль  
                  
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 23:31 
Заслуженный участник


27/04/09
28128
Тогда можно хранить и обновлять только нижнюю и правую границы прямоугольника, кстати, но надеюсь что это самоочевидно.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group