Tìm một tuyến đường giữa hai bài viết Wikipedia


25

Giới thiệu

Gần đây, tôi đang cùng với một nhóm bạn và chúng tôi thấy chán và không có gì để làm, vì vậy chúng tôi đã "phát minh" ra một "trò chơi" (một số người trong các ý kiến ​​chỉ ra rằng trò chơi này có thể chơi trực tuyến và rất phổ biến, vì vậy chúng tôi chắc chắn đã không phát minh ra nó, mặc dù tôi đã không nhìn thấy nó trước đó). Lý do tôi đặt từ "trò chơi" trong dấu ngoặc kép là vì đây không phải là một trò chơi máy tính thực sự, nhưng nó được chơi trên Wikipedia.

Nó thực sự dễ chơi: Ai đó chọn một số bài viết trên Wikipedia làm mục tiêu. Hãy giả sử Code Golf cho ví dụ này. Tất cả người chơi sau đó phải bắt đầu từ một bài viết ngẫu nhiên (bằng cách nhấn Bài viết ngẫu nhiên trong thanh bên hoặc truy cập URL này ) và phải đến "mục tiêu" càng nhanh càng tốt bằng cách chỉ sử dụng các bài viết được liên kết của bài viết bạn hiện đang xem . Quy tắc bao gồm:

  • Chức năng tìm kiếm không được phép (rõ ràng)
  • Bạn chỉ có thể nhấp vào liên kết trong văn bản chính của bài viết (cụ thể là tất cả văn bản bên trong <div id="bodyContent">)
  • Nếu trang ngẫu nhiên của bạn hoặc bất kỳ trang nào khác bạn gặp không có liên kết hợp lệ (liên kết chết, vòng lặp, v.v.) hoặc không có liên kết nào bạn có thể cuộn lại.

Các thách thức

Đây là nơi bạn đến: thật không may, tôi khá tệ trong trò chơi này, nhưng tôi cũng là một kẻ lừa đảo bẩn thỉu. Vì vậy, tôi muốn bạn thực hiện bot này cho tôi. Tôi cũng là một lập trình viên, vì vậy, tự nhiên đĩa cứng của tôi chứa đầy những thứ như mã, thư viện và như vậy và tôi chỉ có một vài byte bộ nhớ dự phòng. Do đó, thách thức này là Code Golf, câu trả lời có ít byte nhất sẽ thắng.

Chi tiết thực hiện:

  • Tất nhiên, bạn không phải thực hiện một bot thông minh biết kết nối giữa các chủ đề và tự động phát hiện tuyến đường tối ưu. Buộc vũ phu là quá đủ cho mục đích của thử thách này
  • Trong trò chơi thực tế, thời gian được tính. Chương trình của bạn không nên mất hơn 1 giờ để tìm bài viết (điều này là để tránh những sơ hở như những người tìm kiếm ngẫu nhiên sẽ "cuối cùng" tìm thấy mục tiêu)
  • Nếu không tìm thấy đường dẫn đến mục tiêu (ví dụ: liên kết chết hoặc vòng lặp), bạn có thể chọn những việc cần làm từ danh sách bên dưới:
    • Thoát (điểm vẫn giữ nguyên)
    • Nhận một bài viết ngẫu nhiên khác và thử lại và không làm gì trên các vòng lặp (điểm - = 10)
    • Nhận một bài viết ngẫu nhiên khác về một liên kết chết hoặc một vòng lặp (tự động phát hiện các vòng lặp) (điểm - = 50)
    • (Theo "điểm" Tôi có nghĩa là số byte của bạn ở đây)
  • 20 byte thưởng khác sẽ bị trừ nếu bạn "theo dõi" tuyến đường, do đó bạn in tiêu đề của mỗi trang cá nhân bạn truy cập.
  • Thư viện mạng tiêu chuẩn có thể được sử dụng (để tránh các sơ hở như "Tôi đã tạo thư viện mạng của riêng mình để thu thập các bài viết trên wikipedia")
    • Điều duy nhất liên quan đến mạng mà chương trình của bạn nên làm là gửi yêu cầu HTTP để tải xuống trang wikipedia
  • Nếu chương trình của bạn tìm thấy trang, nó sẽ thoát, nhưng bằng cách nào đó báo hiệu rằng nó đã hoàn thành (in ký tự "f" hoặc tiêu đề của trang là đủ)
  • Cần tránh những sơ hở tiêu chuẩn

Chúc bạn chơi golf vui vẻ!

(Đây là câu hỏi đầu tiên của tôi ở đây, vì vậy vui lòng chỉ ra những sơ hở và cảnh báo rõ ràng trong các bình luận trước khi khai thác chúng - cảm ơn: D)


1
Đủ thú vị cho một thử thách, nhưng không đủ lý do để tôi tràn ngập một trang web với các yêu cầu.
manatwork

2
@manatwork Tôi khá chắc chắn Wikipedia có đủ băng thông để xử lý các "cuộc tấn công" như thế này
Christoph Böhmwalder

1
Không chính xác là một lỗ hổng nhưng tôi sẽ xem xét mọi người phàn nàn rằng đây chỉ là một câu hỏi tìm kiếm đồ thị không mang lại nhiều ý tưởng mới cho bảng. Tuy nhiên tôi nghĩ rằng nó ổn, trang web này cần nhiều câu hỏi hơn. (Mặc dù bạn chắc chắn không phát minh ra "trò chơi" này: P.)
Sở thích của Calvin


1
Điều này có thể tốt khi một thử thách koth lấy số bước nhảy trung bình trong số 50 lần chạy với mỗi bot. Sẽ khuyến khích nhiều hơn để xây dựng một bot thông minh hơn.
Thứ

Câu trả lời:


12

Python 373 -> 303

Nó đọc đích Wikipedia từ input()(đầu vào của người dùng) và phải ở định dạng /wiki/dest. Vì vậy, một cái gì đó như /wiki/Code_golfhoặc /wiki/United_States. Nó cũng sử dụng một khoảng trống cho các điểm thụt lề và http://enwp.orgthay vì URL đầy đủ của Wikipedia để lưu byte.

  • -50 bởi vì nếu tìm thấy một URL bị hỏng, nó sẽ nhận được một URL ngẫu nhiên mới.
  • -20 vì nó in tiêu đề của mỗi URL được truy cập (có thể thay đổi tiêu đề -> URL, nhưng tiêu đề sạch hơn và thực sự làm cho nguồn của tôi lớn hơn).

Nó cứ thỉnh thoảng lại treo và tôi không thể hiểu tại sao. Có lẽ vì giới hạn tỷ lệ Wikipedia?

Tôi đã tìm thấy trang Wikipedia Boston Red Sox trong 9 phút 20 giây và trang Hoa Kỳ trong chưa đầy 10 giây, vì vậy không mất quá nhiều thời gian để tìm 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)

Tôi không biết nhiều trăn, nhưng nó trông rất tuyệt
Christoph Böhmwalder 18/07/14

Nó có phát hiện các vòng lặp không? Nếu không, đó là 10 điểm thưởng thay vì 50
Christoph Böhmwalder 18/07/14

@HackerCow vâng, nó sẽ không truy cập cùng một url hai lần trừ /wiki/Special:Randomurl. Do đó, sau khi truy cập nhiều url, nó sẽ ngốn toàn bộ RAM của bạn.
Eric Lagergren

Tôi sẽ chỉ nói điều này : from ... import*.
18:00

1
@DevanLoper oh bắn, đọc sai nhận xét của bạn. Đúng là tôi. Ban đầu tôi đã sử dụng import mechanize as mvà gán m.Browser()cho anên khi tôi gọi a.open()tôi là có hiệu lực kêu gọi mechanize.Browser().open()bây giờ tôi chỉ nhập khẩu tất cả mechanizevà nhận bỏ qua ... as mmột phần.
Eric Lagergren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.