Введение
Недавно я общался по скайпу с группой друзей, и нам стало скучно, и нам нечего было делать, поэтому мы «изобрели» «игру» (некоторые люди в комментариях указали, что эта игра играема онлайн и очень популярна, поэтому мы определенно не придумал, хотя раньше не видел). Причина, по которой я поставил слово «игра» в кавычках, заключается в том, что это не настоящая компьютерная игра, а в Wikipedia.
Играть действительно легко: кто-то выбирает какую-то статью из Википедии в качестве цели. Давайте предположим Code Golf для этого примера. Затем все игроки должны начать со случайной статьи (нажав « Случайная статья» на боковой панели или перейти по этому URL-адресу) и как можно быстрее добраться до «цели», используя только связанные статьи той статьи, в которой вы сейчас находитесь . Правила включают в себя:
- Функция поиска не разрешена (очевидно)
- Вы можете нажимать только ссылки в основном тексте статьи (особенно весь текст внутри
<div id="bodyContent">
) - Если ваша случайная страница или любая другая страница, с которой вы сталкиваетесь, не имеет действительных ссылок (неработающие ссылки, циклы и т. Д.) Или вообще не имеет ссылок, вы можете перейти снова.
Соревнование
Вот где вы пришли: к сожалению, я довольно плох в этой игре, но я также грязный мошенник. Поэтому я хочу, чтобы вы внедрили этого бота для меня. Я также программист, поэтому, естественно, мой жесткий диск полон таких вещей, как код, библиотеки и тому подобное, и у меня есть только несколько байтов памяти, чтобы сэкономить. Поэтому этот вызов - Code Golf, ответ с наименьшим количеством байтов выигрывает.
Детали реализации:
- Конечно, вам не нужно реализовывать интеллектуального бота, который знает связи между темами и автоматически определяет оптимальный маршрут. Грубое принуждение более чем достаточно для решения этой задачи.
- В реальной игре время имеет значение. Ваша программа не должна занимать более 1 часа, чтобы найти статью (чтобы избежать таких лазеек, как случайные поисковики, которые «в конце концов» найдут цель)
- Если путь к цели не найден (например, неработающие ссылки или цикл), вы можете выбрать, что делать из списка ниже:
- Выйти (оценка остается прежней)
- Получите еще одну случайную статью и попробуйте снова и ничего не делайте на петлях (оценка - = 10)
- Получить еще одну случайную статью о мертвой ссылке или цикле (автоматически определять циклы) (оценка - = 50)
- (Под «счетом» я подразумеваю здесь количество ваших байтов)
- Еще 20 бонусных байтов будут вычтены, если вы «проследите» маршрут, поэтому вы печатаете заголовок каждой отдельной посещаемой страницы.
- Можно использовать стандартные сетевые библиотеки (чтобы избежать лазеек, таких как «Я создал собственную сетевую библиотеку, которая сканирует статьи в Википедии»)
- Единственное, что должна делать ваша сеть, это отправить HTTP-запрос на загрузку страницы википедии.
- Если ваша программа находит страницу, она должна выйти, но каким-то образом сигнализировать о ее завершении (достаточно печати символа «f» или заголовка страницы)
- Стандартные лазейки следует избегать
Удачи в гольф!
(Это мой первый вопрос, поэтому, пожалуйста, укажите на очевидные лазейки и предостережения в комментариях, прежде чем их использовать - спасибо: D)
Ответы:
Python 373 -> 303
Он читает место назначения из Википедии
input()
(пользовательский ввод) и должен быть в формате/wiki/dest
. Итак, что-то вроде/wiki/Code_golf
или/wiki/United_States
. Он также использует один пробел для отступов иhttp://enwp.org
вместо полного URL-адреса Википедии для сохранения байтов.Он зависает время от времени, и я не могу понять, почему. Возможно из-за ограничений скорости Википедии?
Я нашел страницу Boston Red Sox Wikipedia за 9 минут 20 секунд, а страницу Соединенных Штатов - менее чем за 10 секунд, так что поиск Code Golf не займет много времени ...
источник
/wiki/Special:Random
URL-адреса. Следовательно, после посещения многих URL-адресов он съест всю вашу оперативную память.from ... import*
.import mechanize as m
и назначениеm.Browser()
наa
так , когда я звонюa.open()
я в сущности , призывающейmechanize.Browser().open()
сейчас я просто импортирующей всеmechanize
и получить , чтобы пропустить... as m
часть.