Найти маршрут между двумя статьями Википедии

25

Введение

Недавно я общался по скайпу с группой друзей, и нам стало скучно, и нам нечего было делать, поэтому мы «изобрели» «игру» (некоторые люди в комментариях указали, что эта игра играема онлайн и очень популярна, поэтому мы определенно не придумал, хотя раньше не видел). Причина, по которой я поставил слово «игра» в кавычках, заключается в том, что это не настоящая компьютерная игра, а в Wikipedia.

Играть действительно легко: кто-то выбирает какую-то статью из Википедии в качестве цели. Давайте предположим Code Golf для этого примера. Затем все игроки должны начать со случайной статьи (нажав « Случайная статья» на боковой панели или перейти по этому URL-адресу) и как можно быстрее добраться до «цели», используя только связанные статьи той статьи, в которой вы сейчас находитесь . Правила включают в себя:

  • Функция поиска не разрешена (очевидно)
  • Вы можете нажимать только ссылки в основном тексте статьи (особенно весь текст внутри <div id="bodyContent">)
  • Если ваша случайная страница или любая другая страница, с которой вы сталкиваетесь, не имеет действительных ссылок (неработающие ссылки, циклы и т. Д.) Или вообще не имеет ссылок, вы можете перейти снова.

Соревнование

Вот где вы пришли: к сожалению, я довольно плох в этой игре, но я также грязный мошенник. Поэтому я хочу, чтобы вы внедрили этого бота для меня. Я также программист, поэтому, естественно, мой жесткий диск полон таких вещей, как код, библиотеки и тому подобное, и у меня есть только несколько байтов памяти, чтобы сэкономить. Поэтому этот вызов - Code Golf, ответ с наименьшим количеством байтов выигрывает.

Детали реализации:

  • Конечно, вам не нужно реализовывать интеллектуального бота, который знает связи между темами и автоматически определяет оптимальный маршрут. Грубое принуждение более чем достаточно для решения этой задачи.
  • В реальной игре время имеет значение. Ваша программа не должна занимать более 1 часа, чтобы найти статью (чтобы избежать таких лазеек, как случайные поисковики, которые «в конце концов» найдут цель)
  • Если путь к цели не найден (например, неработающие ссылки или цикл), вы можете выбрать, что делать из списка ниже:
    • Выйти (оценка остается прежней)
    • Получите еще одну случайную статью и попробуйте снова и ничего не делайте на петлях (оценка - = 10)
    • Получить еще одну случайную статью о мертвой ссылке или цикле (автоматически определять циклы) (оценка - = 50)
    • (Под «счетом» я подразумеваю здесь количество ваших байтов)
  • Еще 20 бонусных байтов будут вычтены, если вы «проследите» маршрут, поэтому вы печатаете заголовок каждой отдельной посещаемой страницы.
  • Можно использовать стандартные сетевые библиотеки (чтобы избежать лазеек, таких как «Я создал собственную сетевую библиотеку, которая сканирует статьи в Википедии»)
    • Единственное, что должна делать ваша сеть, это отправить HTTP-запрос на загрузку страницы википедии.
  • Если ваша программа находит страницу, она должна выйти, но каким-то образом сигнализировать о ее завершении (достаточно печати символа «f» или заголовка страницы)
  • Стандартные лазейки следует избегать

Удачи в гольф!

(Это мой первый вопрос, поэтому, пожалуйста, укажите на очевидные лазейки и предостережения в комментариях, прежде чем их использовать - спасибо: D)

Кристоф Бемвальдер
источник
1
Достаточно интересный для вызова, но не достаточный повод для меня, чтобы затопить сайт с запросами.
Манатворк
2
@manatwork Я вполне уверен, что в Википедии есть достаточная пропускная способность, чтобы справляться с такими «атаками»
Кристоф Бемвальдер,
1
Не совсем лазейка, но я хотел бы обратить внимание на людей, жалующихся на то, что это просто вопрос поиска графиков, который не приносит много новых идей. Тем не менее, я думаю, что все в порядке, этому сайту нужно больше вопросов. (Хотя вы определенно не изобрели эту «игру»: P.)
Увлечения Кэлвина
1
Это в основном codegolf.stackexchange.com/q/18665/194 + codegolf.stackexchange.com/q/26031/194
Питер Тейлор
1
Это могло бы быть хорошим испытанием для котов, взявшим среднее количество прыжков из 50 пробежек с каждым ботом. Дало бы больше стимулов для создания более умного бота.
rdans

Ответы:

12

Python 373 -> 303

Он читает место назначения из Википедии input()(пользовательский ввод) и должен быть в формате /wiki/dest. Итак, что-то вроде /wiki/Code_golfили /wiki/United_States. Он также использует один пробел для отступов и http://enwp.orgвместо полного URL-адреса Википедии для сохранения байтов.

  • -50, потому что если он находит неработающий URL, он получает новый случайный URL.
  • -20, потому что он печатает заголовок каждого посещенного URL (может изменить заголовок -> URL, но заголовок будет чище и на самом деле увеличит мой источник).

Он зависает время от времени, и я не могу понять, почему. Возможно из-за ограничений скорости Википедии?

Я нашел страницу Boston Red Sox Wikipedia за 9 минут 20 секунд, а страницу Соединенных Штатов - менее чем за 10 секунд, так что поиск Code Golf не займет много времени ...

from mechanize import*;from lxml.html import*;from random import*;a=Browser();a.set_handle_robots(0);i='http://enwp.org/Special:Random';t=input();d={};k=a.open
def f(o):
 if o!=i:d[o]=o
 if o in d:f(i)
 try:v=fromstring(k(o).read()).xpath('//div[@id="content"]//a/@href')
 except:f(i)
 print a.title()
 if t in v:k(t);print 'f';exit()
 else:f(choice(v)) if v else f(i)
f(i)
Эрик Лагергрен
источник
Я не знаю много Python, но это выглядит красиво
Кристоф Бемвальдер
Это обнаруживает петли все же? Если этого не произойдет, это 10 бонусных баллов вместо 50
Кристоф Бемвальдер
@HackerCow да, он не будет посещать один и тот же URL-адрес дважды, кроме /wiki/Special:RandomURL-адреса. Следовательно, после посещения многих URL-адресов он съест всю вашу оперативную память.
Эрик Лагергрен
Я просто скажу это from ... import*.
ɐɔıʇǝɥʇuʎs
1
@DevanLoper О, стреляйте, неправильно прочитайте ваш комментарий. Да. Первоначально я использовал import mechanize as mи назначение m.Browser()на aтак , когда я звоню a.open()я в сущности , призывающей mechanize.Browser().open()сейчас я просто импортирующей все mechanizeи получить , чтобы пропустить ... as mчасть.
Эрик Лагергрен