두 위키피디아 기사 간 경로 찾기


25

소개

최근에, 나는 많은 친구들과 함께 스카우트했고 지루해 할 일이 없었기 때문에 우리는 "게임"을 "창조"했습니다. 전에는 보지 못했지만 발명하지는 않았습니다. "game"이라는 단어를 따옴표 안에 넣은 이유는 실제 컴퓨터 게임이 아니지만 Wikipedia에서 재생되기 때문입니다.

정말 쉽습니다. 누군가 위키 백과 기사를 목표로 선택합니다. 이 예제에서 코드 골프 를 가정 해 봅시다 . 모든 선수는 (눌러 임의의 기사에서 시작해야 임의의 기사 사이드 바에서 또는가는 URL) 및 사용하여 가능한 한 빨리으로 "목표"에 도착해야 현재에있는 기사의 링크 된 기사를 . 규칙은 다음과 같습니다.

  • 검색 기능이 허용되지 않습니다 (분명히)
  • 기사의 기본 텍스트 (특히 내부의 모든 텍스트 <div id="bodyContent">) 에있는 링크 만 클릭 할 수 있습니다.
  • 임의의 페이지 또는 발생하는 다른 페이지에 유효한 링크 (데드 링크, 루프 등)가 없거나 전혀 링크가없는 경우 다시 롤백 할 수 있습니다.

도전

불행히도 나는이 게임에 꽤 나쁘지 만 더러운 사기꾼이기도합니다. 그래서 나는 당신이 나를 위해이 봇을 구현하기를 바랍니다. 나는 또한 프로그래머이기 때문에 당연히 내 하드 디스크는 코드, 라이브러리 등과 같은 것들로 가득 차 있으며 여분의 메모리가 몇 바이트 밖에 없습니다. 따라서이 도전은 코드 골프 입니다. 최소 바이트로 승리하십시오.

구현 세부 사항 :

  • 물론 주제 간의 연결을 알고 최적의 경로를 자동으로 감지하는 지능형 봇을 구현할 필요는 없습니다. 무차별 강제는이 도전의 목적을 위해 충분하다
  • 실제 게임에서는 시간이 중요합니다. 프로그램은 기사를 찾는 데 1 시간 이상 걸리지 않아야합니다 (이는 궁극적으로 목표를 찾는 임의의 검색 자와 같은 허점을 피하는 것입니다)
  • 목표에 대한 경로를 찾을 수없는 경우 (예 : 데드 링크 또는 루프) 아래 목록에서 수행 할 작업을 선택할 수 있습니다.
    • 종료 (점수는 동일 함)
    • 다른 임의의 기사를 가져오고 다시 시도하고 루프에서 아무 것도 수행하지 마십시오 (점수-= 10).
    • 데드 링크 또는 루프에서 다른 임의의 기사 가져 오기 (루프 자동 감지) (점수-= 50)
    • ( "점수"는 바이트 수를 의미합니다)
  • 경로를 "추적"하면 추가 20 바이트가 차감되어 방문하는 모든 개별 페이지의 제목을 인쇄합니다.
  • 표준 네트워크 라이브러리를 사용할 수 있습니다 ( "wikipedia 기사를 크롤링하는 자체 네트워크 라이브러리를 만들었습니다"와 같은 허점을 피하기 위해)
    • 프로그램이 네트워크와 관련하여해야 할 일은 위키 백과 페이지를 다운로드하기 위해 HTTP 요청을 보내는 것입니다.
  • 프로그램이 페이지를 찾으면 페이지를 종료해야하지만 어떤 식 으로든 종료했음을 알립니다 (문자 "f"또는 페이지 제목 인쇄로 충분 함).
  • 표준 허점은 피해야합니다

즐거운 골프 되세요!

(이것은 내 첫 번째 질문이므로 악용하기 전에 의견에 명백한 허점과주의 사항을 지적하십시오-감사합니다 : D)


1
도전에 대한 흥미가 있지만 요청이있는 사이트를 넘겨야 할 충분한 이유는 없습니다.
manatwork

2
@manatwork 필자는 Wikipedia가 이와 같은 "공격"을 처리하기에 충분한 대역폭을 가지고 있다고 확신한다
Christoph Böhmwalder

1
정확히 허점은 아니지만 사람들이 테이블에 많은 새로운 아이디어를 가져 오지 않는 단지 그래프 검색 질문이라고 불평하는 사람들을 찾습니다. 그러나 나는 그것이 훌륭하다고 생각합니다.이 사이트에는 더 많은 질문이 필요합니다. (당신이 확실히이 "게임"을 발명하지는 않았지만 : P.)
Calvin 's Hobbies


1
이것은 각 봇마다 50 번의 런 중 평균 홉 수를 가져 오는 코스 도전으로 좋을 수 있습니다. 보다 지능적인 봇을 만들려는 동기를 부여 할 것입니다.
rdans

답변:


12

파이썬 373-> 303

input()(사용자 입력) 에서 Wikipedia 대상을 읽고 형식은 형식이어야합니다 /wiki/dest. 그래서 /wiki/Code_golf또는 같은 /wiki/United_States. 또한 들여 쓰기를 위해 하나의 공간을 사용하고 http://enwp.orgWikipedia의 전체 URL 대신 바이트를 절약합니다.

  • 깨진 URL을 찾으면 새로운 임의의 URL을 얻으므로 -50 입니다.
  • -20은 방문한 각 URL의 제목을 인쇄하기 때문에 (제목-> URL을 변경할 수 있지만 제목은 더 깔끔하고 실제로 소스를 더 크게 만듭니다).

매번 멈추고 왜 그런지 알 수 없습니다. 아마도 위키 백과 속도 제한 때문입니까?

내가 찾은 보스턴 레드 삭스 위키 백과 페이지를 구분 20초에, 그리고 그것을 가지고 가면 안된다 10 초 이상, 그래서에서 미국 페이지 너무 긴 코드 골프를 찾을 수 ...

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)

나는 많은 파이썬을 모른다. 그러나 이것은 멋져 보인다
Christoph Böhmwalder

그래도 루프를 감지합니까? 그렇지 않다면, 그것은 50 대신 10 보너스 포인트입니다
Christoph Böhmwalder

@HackerCow 예, /wiki/Special:RandomURL을 제외하고 동일한 URL을 두 번 방문하지 않습니다 . 결과적으로 많은 URL을 방문하면 전체 RAM을 소모합니다.
Eric Lagergren

나는 이것을 이렇게 말할 것이다 : from ... import*.
ɐɔıʇǝɥʇuʎs

1
@DevanLoper 오 쏴, 당신의 의견을 잘못 읽습니다. 네 원래 나는 사용 import mechanize as m하고 있었고 할당 m.Browser()하기 a때문에 전화 할 때 a.open()효과가 있습니다. mechanize.Browser().open()지금 전화 mechanize하면 모든 것을 가져오고 ... as m부품 을 건너 뜁니다 .
Eric Lagergren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.