Сложный Python для чайников.

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Закрыто
Аватара пользователя

Автор темы
SemenSinchenko
Сообщения: 340
Зарегистрирован: 17 фев 2017, 12:01
Решено: 2
Откуда: Москва
Благодарил (а): 43 раза
Поблагодарили: 46 раз
Контактная информация:

Сложный Python для чайников.

#1

30 авг 2017, 11:10

Прохожу курс по теории алгоритмов. Там задача:
По данным n отрезкам необходимо найти множество точек минимального размера, для которого каждый из отрезков содержит хотя бы одну из точек.

В первой строке дано число 1≤n≤100
отрезков. Каждая из последующих n строк содержит по два числа 0≤l≤r≤109, задающих начало и конец отрезка. Выведите оптимальное число m точек и сами m точек. Если таких множеств точек несколько, выведите любое из них.
Тестируется через stdin → stdout

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

Код: Выделить всё

import sys

lineIn = sys.stdin.readline()
n = int(lineIn)

r_l = []

for i in range(n):
    lineIn = sys.stdin.readline().split(" ")
    l_tmp = (int(lineIn[0]))
    r_tmp = (int(lineIn[1]))
    r_l.append([r_tmp, l_tmp])
    
r_l.sort()

m_coord = []
m_coord.append(r_l[0][0])
m = 1

for i in range(n):
    if r_l[i][1] > m_coord[(len(m_coord) - 1)]:
        m = m + 1
        m_coord.append(r_l[i][0])


sys.stdout.write(str([m, m_coord]))
Но система проверки ругается, говорит следующее:
Failed test #1. wrong output format: invalid literal for int() with base 10: '[1,'
Input:
3
1 3
2 5
3 6

Your output:
[1, [3]]
Correct output:
1
3
То есть решение по ходу то правильное, но неверный формат вывода! Подскажите, как нужно переформатировать вывод?

Решение SemenSinchenko » 30 авг 2017, 11:34
Итоговый вариант, который был принят:

Код: Выделить всё

sys.stdout.write(str(m) + '\n')
for i in range(len(m_coord)):
  sys.stdout.write(str(m_coord[i]) + ' ')
Всем спасибо! Очень помогли!

Перейти к ответу ➙

Аватара пользователя

rogoznik
Сообщения: 10015
Зарегистрирован: 27 июн 2017, 13:36
Решено: 128
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1950 раз
Контактная информация:

Сложный Python для чайников.

#2

30 авг 2017, 11:14

Ты пытаешь ей скормить массив m_coord,
SemenSinchenko писал(а): sys.stdout.write(str([m, m_coord]))
ИзображениеИзображение

Аватара пользователя

Автор темы
SemenSinchenko
Сообщения: 340
Зарегистрирован: 17 фев 2017, 12:01
Решено: 2
Откуда: Москва
Благодарил (а): 43 раза
Поблагодарили: 46 раз
Контактная информация:

Сложный Python для чайников.

#3

30 авг 2017, 11:15

darkfenix, Ну так задание говорит, что я должен вывести координаты точек:
Выведите оптимальное число m точек и сами m точек.
А координаты у меня в массиве хранятся

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Сложный Python для чайников.

#4

30 авг 2017, 11:22

sys.stdout.write(str(m) + '\n' + str(m_coord[0]))
Изображение
   
Изображение

Аватара пользователя

Автор темы
SemenSinchenko
Сообщения: 340
Зарегистрирован: 17 фев 2017, 12:01
Решено: 2
Откуда: Москва
Благодарил (а): 43 раза
Поблагодарили: 46 раз
Контактная информация:

Сложный Python для чайников.

#5

30 авг 2017, 11:25

Chocobo, Теперь выводится только первая точка...
Failed test #2. wrong output format: list index out of range
Input:
4
4 7
1 3
2 5
5 6

Your output:
2
3
Correct output:
2
3 6

Аватара пользователя

rogoznik
Сообщения: 10015
Зарегистрирован: 27 июн 2017, 13:36
Решено: 128
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1950 раз
Контактная информация:

Сложный Python для чайников.

#6

30 авг 2017, 11:29

Код: Выделить всё

sys.stdout.write(str(m) + '\n')
цикл от 0 до длина(m_coord)
  sys.stdout.write(str(m_coord[i]))
ИзображениеИзображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Сложный Python для чайников.

#7

30 авг 2017, 11:30

SemenSinchenko, Я не вникал в текст задачи, только аут подбил под корректный на заданных в первом посте числах числах :joke:
Сейчас гляну тогда и по коду
Изображение
   
Изображение

Аватара пользователя

Автор темы
SemenSinchenko
Сообщения: 340
Зарегистрирован: 17 фев 2017, 12:01
Решено: 2
Откуда: Москва
Благодарил (а): 43 раза
Поблагодарили: 46 раз
Контактная информация:

Сложный Python для чайников.

#8

30 авг 2017, 11:32

darkfenix, как же сложно с этим stdout... Курс входит в программу "Анлиз данных", а не программирование...
Теперь пробела не хватает:
Failed test #2. wrong output format: list index out of range
Input:
4
4 7
1 3
2 5
5 6

Your output:
2
36
Correct output:
2
3 6

Аватара пользователя

Автор темы
SemenSinchenko
Сообщения: 340
Зарегистрирован: 17 фев 2017, 12:01
Решено: 2
Откуда: Москва
Благодарил (а): 43 раза
Поблагодарили: 46 раз
Контактная информация:

Сложный Python для чайников.

#9

30 авг 2017, 11:34

Итоговый вариант, который был принят:

Код: Выделить всё

sys.stdout.write(str(m) + '\n')
for i in range(len(m_coord)):
  sys.stdout.write(str(m_coord[i]) + ' ')
Всем спасибо! Очень помогли!

Аватара пользователя

rogoznik
Сообщения: 10015
Зарегистрирован: 27 июн 2017, 13:36
Решено: 128
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1950 раз
Контактная информация:

Сложный Python для чайников.

#10

30 авг 2017, 11:37

SemenSinchenko, так и не давал готового решения. Только указал как нужно выводить данные из массива. А форматирование вывода это уж сами как-нибудь)))
ИзображениеИзображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Сложный Python для чайников.

#11

30 авг 2017, 11:38

Ну раз ошибка ушла - давай и решение чуть разжуем чтоль :)

Тут stdin → stdout был прям в уловиях прописан?)
простой print туда же зашлет, по идее
Изображение
   
Изображение

Аватара пользователя

Автор темы
SemenSinchenko
Сообщения: 340
Зарегистрирован: 17 фев 2017, 12:01
Решено: 2
Откуда: Москва
Благодарил (а): 43 раза
Поблагодарили: 46 раз
Контактная информация:

Сложный Python для чайников.

#12

30 авг 2017, 11:40

Chocobo, прямо написано так "Программирование — Напишите программу. Тестируется через stdin → stdout" (на скриншоте даже видно)...

П.С. Так как я решил задачу, то приветствуются комментарии по моему "говнокодингу", что можно было сделать лучше, в чем я сделал как индус =) Спасибо!)))

П.П.С. Я правильно понял, что сложность моего решения есть O(n*log(n)) из-за наличия сортировки?

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Сложный Python для чайников.

#13

30 авг 2017, 11:44

SemenSinchenko, Это я увидел, просто и думаю что с тем же успехом пойдут стандартные функции input() на ввод и print() на вывод
Изображение
   
Изображение

Аватара пользователя

Chocobo
Сообщения: 10015
Зарегистрирован: 27 авг 2016, 22:57
Решено: 215
Откуда: НН
Благодарил (а): 815 раз
Поблагодарили: 3008 раз
Контактная информация:

Сложный Python для чайников.

#14

30 авг 2017, 12:26

Вот этот кусок ввода отрезков

Код: Выделить всё

for i in range(n):
    lineIn = sys.stdin.readline().split(" ")
    l_tmp = (int(lineIn[0]))
    r_tmp = (int(lineIn[1]))
    r_l.append([r_tmp, l_tmp])
я бы представил так

Код: Выделить всё

for i in range(n):
    r_l.append(map(int,raw_input().split()))
    r_l[i].sort(reverse=True)
В первой строке пользовательский ввод сразу обращаем в числовой список и вкладываем в исходный
Второй строкой - обратная сортировка добавленного элемента, чтоб не гонять через переменные.
Ну и импортировать весь sys ни к чему будет
Изображение
   
Изображение

Аватара пользователя

Dja
Сообщения: 6875
Зарегистрирован: 27 авг 2016, 20:03
Решено: 30
Откуда: Voskresensk
Благодарил (а): 1310 раз
Поблагодарили: 724 раза
Контактная информация:

Сложный Python для чайников.

#15

16 ноя 2017, 21:54

Не по теме
SemenSinchenko писал(а):
30 авг 2017, 11:34
Вот и выкладывай после этого в радикалы... Неужели нельзя было нормальным хостингом воспользоваться? Или вообще сюда закинуть.

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

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

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