Предмет: Информатика, автор: Cl0nixs

Помогите решить Python


Развлечения с измерителем

(Время: 1 сек. Память: 16 Мб)

Дима обнаружил у папы на столе специальный чертежный прибор, похожий на циркуль-измеритель. Измеритель отличается от обычного циркуля тем, что в обеих его ножках находятся иголки (у обычного циркуля в одной ножке находится иголка, а в другой – грифель).


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


Ваша задача - написать программу, которая по координатам точек определит, сколько различных расстояний встречается среди расстояний, которые измерил Дима.


Входные данные

Первая строка входного файла INPUT.TXT содержит число n – количество точек (2 ≤ n ≤ 50). Следующие n строк содержат по два целых числа – координаты точек. Координаты не превышают 104 по абсолютной величине.


Выходные данные

На первой строке выходного файла OUTPUT.TXT выведите k – количество различных расстояний, которые измерил Дима. Следующие k строк должны содержать по одному вещественному числу – сами расстояния. Расстояния должны быть выведены в возрастающем порядке. Каждое число должно быть выведено с точностью не менее чем 10-9.

Ответы

Автор ответа: KanzArtem11
1

Так, ну смотри... Я не стал запариваться и вручную записывать список с этими координатами... Это очень долго и муторно, я воспользовался модулями pickle и random, чтоб ускорить этот процесс... (____ - потом убери - это я табуляцию обозначил, чтоб было видно синтаксис нормально)

import random, pickle, math

xy = dict()

for i in range(1, random.randrange(1,50)):

____xy[i] = [random.randrange(-104,104),random.randrange(-104,104)]

print(xy)

f = open('INPUT.TXT', 'wb')

pickle.dump(xy, f)

f.close()

Я кусками объясню, потом выложу просто сами файлы...

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

Я сделал словарь, потому что изначально была идея обозвать каждую точку буквами А, В, С... и т.д., но это долго и муторно, поэтому когда вызовешь словарь, увидишь что там такой вид (ключ: 1; [x,y]). Тоже думаю вполне себе неплохо выглядит... Рандом тут просто для того, чтоб самому ничего не выдумывать, а быстро записать разные значения, не более... Ну и так же рандом тут определяет количество точек.

f = open('INPUT.TXT', 'rb')

xy = pickle.load(f)

Тут идет все тот же pickle, но мы уже присваиваем переменной xy значение из файла. Тут все просто.

for i in xy:

___arr1.append(xy[i])

Цикл, который координаты из словаря переносит в список. Мне так просто проще работать со списками. (Вообще, моя идея с НАЗВАНИЕ:КООРДИНАТЫ оказалось провальной, поэтому чтоб избежать двух лишних строчек, можешь в самом начале изменить словарь на список =D)

while len(arr1) > 0:

___for i in arr1:

______arr1.pop(arr1.index(i))

______for z in arr1:

_________arr2.append(math.sqrt(math.pow(z[0]-i[0],2)+math.pow(z[1]-i[1],2)))

arr2.sort()

Тут происходит основной процесс программы. Цикл while работает до тех пор ПОКА длина списка arr1 больше 0. (сейчас к этому еще вернемся)

Цикл for перебирает значения списка arr1 (в котором у нас в виде списков координаты точек [x,y]) Удаляет первый элемент дабы избежать повторений и запускает второй цикл который уже без первой координаты... Получается что-то типа координата подается и со всеми остальными образует отрезок, потом вторая, третья и т.п...

И я думаю ты понял, зачем нам условие в цикле while len(arr1) > 0

Список закончился = он весь обработался...

Для следующей строки нам нужен модуль math, для упрощения жизни. тут просто формула, которая считает длины отрезков. Обычная формула из математики S = sqrt((x2 - x1)^2 + (y2 - y1)^2)

Ну думаю объяснять что за методы pow и sqrt - нет смысла...

За циклом к списку вызывается метод sort, который по порядку расставляет длины, которые мы насчитали. (т.к. у тебя в условии это требуется... бесполезное действие вообще как по мне =D)

f = open('OUTPUT.TXT', 'w')

f.write(str(len(arr2))+'\n')

for i in arr2:

___text = str(i) + '\n'

___f.write(text)

f.close()

А тут обычная запись уже в файл output. Ничего сложного. Первой строкой выводится количество отрезков, которое у нас получилось. На 26 точек, которые сгенерировались, у нас получилось 325 отрезков. Ну и из списка печатаются сами длины с отступом.

Весь код целиком:

import random, pickle, math

arr1 = []

arr2 = []

text = ''

'''xy = dict()

for i in range(1, random.randrange(1,50)):

___xy[i] = [random.randrange(-104,104),random.randrange(-104,104)]

print(xy)

f = open('INPUT.TXT', 'wb')

pickle.dump(xy, f)

f.close()

Данный код использовался для составления списка с случайным количеством координат и случайными его координатами.

'''

f = open('INPUT.TXT', 'rb')

xy = pickle.load(f)  

for i in xy:

___arr1.append(xy[i])

while len(arr1) > 0:

___for i in arr1:

______arr1.pop(arr1.index(i))

______for z in arr1:

_________arr2.append(math.sqrt(math.pow(z[0]-i[0],2)+math.pow(z[1]-i[1],2)))

arr2.sort()

f = open('OUTPUT.TXT', 'w')

f.write(str(len(arr2))+'\n')

for i in arr2:

___text = str(i) + '\n'

___f.write(text)

f.close()

P.S. А, да... Чуть не забыл. У меня тут начало закомментировано как видишь... Тебе чтоб сгенерировать список, нужно сначала тройные кавычки убрать и желательно закомментировать оставшуюся часть кода... Когда у тебя будет уже файл input с значениями, можешь обратно поставить кавычки, чтоб у тебя вечно разные значения не генерировались :)

И я не смог загрузить файл с расширением .py, так что смотри на скрине, там синтаксис выделен, я думаю разберешься.

Приложения:

KanzArtem11: А что он их переименовал то... Первый файл где каракули - "INPUT.TXT", второй где все нормально соответственно "OUTPUT.TXT"
Интересные вопросы
Предмет: Английский язык, автор: operator6767
Нужен пересказ своими словами сказки по английски
Why Rabbits Have Got Short Tails

Once there lived a Rabbit. His name was Bunny. He was grey and big, bigger than his Brother Bonny. But he had no tail. And he wanted to have a long tail, longer than that of Mrs Fox.
One day Bunny went for a walk. He saw Mrs Fox.
"Hello, Mrs Fox," he said. "Where are you going?"
"I'm going shopping."
"What are you going to buy?"
"I'm going to buy a tail."
"But you've got a tail! I think it's the longest and the most beautiful tail!"
"Well, but I want a new one, a longer and more beautiful one than my old tail."
"Oh, please, Mrs Fox, buy a tail for me too. Look at me, I haven't got a tail."
"OK," said the Fox and ran to the shop.
In the shop Mrs Fox bought only one tail. It was a beautiful long red tail, it was longer and more beautiful than her old tail.
She ran back home. On the way home she saw Brother Rabbit. Bunny looked at the Fox's tail and said, "Oh, what a beautiful tail you've got. And where is my tail?"
"I'm sorry," said the Fox, "but there wasn't any tail for you."
Poor little Bunny! He was so sorry. Mrs Fox hadn't bought a new tail for him!
A Dog who was running by came up to Bunny and said: "What's the matter with you?"
"Oh," said Bunny, "all the animals have got long, beautiful tails but I haven't got a tail!"
"Poor little Bunny!" said the Dog.
At that time a Cat was running by.
"Bunny! I've got an idea. I think I know how to help you!" And he ran after the Cat, bit off a little piece of the Cat's tail and gave it to Bunny. Bunny was happy!
"Thank you very much," he said. "Now I've got a tail, too... It's a very short tail, but it's a tail."
That's why rabbits have got short tails.