2014 dxdy logo

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

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




 
 Нарисовать траекторию
Сообщение07.02.2021, 20:04 
Добрый вечер. Условие:

(Оффтоп)

Н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 
Позиционирование курсора на экране недоступно, возможности организовать себе "видеобуфер" из подручного массива нет?

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

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

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

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

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

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

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

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

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

 
 
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 21:28 
Cuprum2020 в сообщении #1504465 писал(а):
Множество множеств двух чисел: координат Х и У посещённой позиции?
Просто множество кортежей (x, y). Множество множеств с этой задачей и не поможет, и ударит по производительности.

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

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

 
 
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 21:54 
Аватара пользователя
arseniiv в сообщении #1504480 писал(а):
Впрочем в таких задачах обычно или явно гарантируют, что левее и выше мы не уйдём, или наоборот явно предупреждают, что можем уйти.
Выше точно не уйдём, по условию мы вообще не умеем двигаться вверх.

 
 
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 22:03 
Аааа, я вчера увидел три символа и додумал четвёртый.

 
 
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 22:12 
Левее тоже не уйдём, я не полностью изложил условия ввиду грозных предупреждений авторов курса о их исключительных правах на все материалы

 
 
 
 Re: Нарисовать траекторию
Сообщение08.02.2021, 23:31 
Тогда можно хранить и обновлять только нижнюю и правую границы прямоугольника, кстати, но надеюсь что это самоочевидно.

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group