दो विकिपीडिया लेखों के बीच एक मार्ग खोजें


25

परिचय

हाल ही में, मैं दोस्तों के एक समूह के साथ संदेह कर रहा था और हम ऊब गए थे और कुछ भी नहीं करना था, इसलिए हमने "गेम" का आविष्कार किया "(टिप्पणियों में कुछ लोगों ने बताया कि यह गेम ऑनलाइन खेलने योग्य है और बहुत लोकप्रिय है, इसलिए हम निश्चित रूप से इसका आविष्कार नहीं किया, हालाँकि मैंने इसे पहले नहीं देखा था)। "खेल" शब्द को मैंने उद्धरण चिह्नों में रखा है, क्योंकि यह एक वास्तविक कंप्यूटर गेम नहीं है, लेकिन यह विकिपीडिया पर खेला जाता है।

यह वास्तव में खेलना आसान है: कोई व्यक्ति लक्ष्य के रूप में कुछ विकिपीडिया लेख चुनता है। चलो मान लोइस उदाहरण के लिए कोड गोल्फ लेते हैं । सभी खिलाड़ियों को तब एक यादृच्छिक लेख से शुरू करना होता है (साइडबार में रैंडम आर्टिकल कोदबाकरया इस URL परजाकर) और आपको वर्तमान में जिस लेख में हैं, उसके केवल लिंक किए गए लेखों का उपयोग करके यथासंभव "लक्ष्य" प्राप्त करना होगा। नियमों में शामिल हैं:

  • खोज फ़ंक्शन की अनुमति नहीं है (स्पष्ट रूप से)
  • आप लेख के मुख्य पाठ में लिंक पर क्लिक कर सकते हैं (विशेष रूप से सभी पाठ के अंदर <div id="bodyContent">)
  • यदि आपके रैंडम पेज या आपके किसी अन्य पेज पर कोई वैध लिंक (डेड लिंक, लूप, आदि) या कोई लिंक नहीं है तो आप फिर से रोल कर सकते हैं।

चुनौती

यहाँ तुम कहाँ आ गए: दुर्भाग्य से मैं इस खेल में बहुत बुरा हूँ, लेकिन मैं एक गंदा धोखेबाज़ भी हूँ। इसलिए मैं चाहता हूं कि आप मेरे लिए इस बॉट को लागू करें। मैं एक प्रोग्रामर भी हूं, इसलिए स्वाभाविक रूप से मेरी हार्ड डिस्क कोड, लाइब्रेरी और इस तरह के सामान से भरी हुई है और मेरे पास केवल कुछ बाइट्स करने के लिए मेमोरी है। इसलिए यह चुनौती है कोड गोल्फ, कम से कम बाइट्स जीत के साथ जवाब ।

कार्यान्वयन विवरण:

  • बेशक आपको एक बुद्धिमान बॉट को लागू करने की आवश्यकता नहीं है जो विषयों के बीच कनेक्शन को जानता है और स्वचालित रूप से इष्टतम मार्ग का पता लगाता है। इस चुनौती के उद्देश्य के लिए ब्रूट फोर्सिंग पर्याप्त से अधिक है
  • वास्तविक खेल में, समय मायने रखता है। आपके प्रोग्राम को लेख को खोजने में 1 घंटे से अधिक समय नहीं लगना चाहिए (यह यादृच्छिक खोजकर्ताओं की तरह खामियों से बचने के लिए है जो "अंततः" अनुमान लगाएगा)
  • यदि लक्ष्य का कोई मार्ग नहीं पाया जा सकता है (जैसे मृत लिंक या एक लूप) तो आप नीचे दी गई सूची में से क्या चुन सकते हैं:
    • छोड़ो (स्कोर वही रहता है)
    • एक और यादृच्छिक लेख प्राप्त करें और फिर से कोशिश करें और छोरों पर कुछ भी न करें (स्कोर - = 10)
    • मृत लिंक या लूप पर एक और यादृच्छिक लेख प्राप्त करें (स्वचालित रूप से लूप का पता लगाएं) (स्कोर - = 50)
    • ("स्कोर" से मेरा मतलब है आपकी बाइट की गिनती यहाँ)
  • यदि आप मार्ग को "ट्रेस" करते हैं, तो एक और 20 बोनस बाइट घटाया जाएगा, इसलिए आप अपने द्वारा देखे गए प्रत्येक व्यक्तिगत पृष्ठ का शीर्षक प्रिंट करते हैं।
  • मानक नेटवर्क पुस्तकालयों का उपयोग किया जा सकता है (जैसे मैं "अपना नेटवर्क पुस्तकालय तैयार करता हूं जो विकिपीडिया लेखों को क्रॉल करता है")
    • केवल एक चीज जो आपके नेटवर्क से संबंधित है, वह है विकिपीडिया पेज डाउनलोड करने के लिए एक HTTP अनुरोध भेजना
  • यदि आपका प्रोग्राम पृष्ठ पाता है, तो उसे छोड़ देना चाहिए, लेकिन किसी तरह संकेत दें कि यह समाप्त हो गया है (वर्ण "f" या पृष्ठ का शीर्षक पर्याप्त है)
  • मानक खामियों से बचा जाना चाहिए

मज़ा गोल्फ है!

(यह मेरा पहला प्रश्न यहाँ है, इसलिए कृपया उनका शोषण करने से पहले टिप्पणियों में स्पष्ट खामियों और गुत्थियों को इंगित करें - धन्यवाद: D)


1
एक चुनौती के लिए पर्याप्त दिलचस्प है, लेकिन मेरे लिए अनुरोधों के साथ एक साइट को बाढ़ करने के लिए पर्याप्त कारण नहीं है।
मैनेटवर्क

2
@ मैनटवर्क मैं निश्चित रूप से कुछ विकिपीडिया के पास "हमलों" को संभालने के लिए पर्याप्त
बैंडवाइट है

1
वास्तव में एक खामी नहीं है, लेकिन मैं लोगों को शिकायत करने के लिए देखूंगा कि यह सिर्फ एक ग्राफ़ खोज प्रश्न है जो तालिका में कई नए विचार नहीं लाता है। हालांकि मुझे लगता है कि यह ठीक है, इस साइट को और अधिक प्रश्नों की आवश्यकता है। (हालांकि आपने निश्चित रूप से इस "गेम" का आविष्कार नहीं किया है: पी।)
केल्विन के


1
यह एक कोठ चुनौती के रूप में अच्छा हो सकता था, प्रत्येक बॉट के साथ 50 रनों में से औसतन हॉप्स की संख्या ले रहा था। अधिक बुद्धिमान बॉट बनाने के लिए अधिक प्रोत्साहन देगा।
रदंस

जवाबों:


12

पायथन 373 -> 303

यह input()(उपयोगकर्ता इनपुट) से विकिपीडिया गंतव्य को पढ़ता है और प्रारूप में होना चाहिए /wiki/dest। तो, कुछ इस तरह /wiki/Code_golfया /wiki/United_States। यह http://enwp.orgबाइट्स को बचाने के लिए विकिपीडिया के पूर्ण URL के बजाय एक जगह का उपयोग करता है ।

  • -50 क्योंकि अगर उसे एक टूटा हुआ URL मिल जाता है तो उसे एक नया रैंडम URL मिल जाता है।
  • -20 क्योंकि यह प्रत्येक URL के शीर्षक का दौरा करता है (शीर्षक -> URL बदल सकता है, लेकिन शीर्षक क्लीनर है और वास्तव में मेरे स्रोत को बड़ा बनाता है)।

यह हर एक बार और थोड़ी देर के लिए लटका रहता है, और मैं इसका पता नहीं लगा सकता। शायद विकिपीडिया दर सीमाओं के कारण?

मैंने बोस्टन रेड सोक्स विकिपीडिया पृष्ठ को 9 मिनट 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)

मैं अजगर का बहुत कुछ नहीं जानता, लेकिन यह अच्छा लग रहा है
क्रिस्टोफ़ बोम्हवालडर

हालांकि यह छोरों का पता लगाता है? यदि ऐसा नहीं होता है, तो वह 50 के बजाय 10 बोनस अंक है
क्रिस्टोफ बोह्मवल्डर जूड

@HackerCow हाँ यह url को छोड़कर दो बार एक ही url पर नहीं जाएगा /wiki/Special:Random। नतीजतन, कई यूआरएल आने के बाद यह आपकी पूरी रैम खा जाएगा।
एरिक लेगरग्रेन 5

मैं सिर्फ यह कहना होगा: from ... import*
atı

1
@DevanLoper ओह शूट, आपकी टिप्पणी गलत। हां मैं हूं। मूल रूप से मैं उपयोग कर रहा था import mechanize as mऔर जब मैं कॉल कर रहा हूं तो मुझे कॉल m.Browser()करने का अधिकार है और अब मैं केवल सभी को आयात कर रहा हूं और भाग को छोड़ सकता हूं । aa.open()mechanize.Browser().open()mechanize... as m
एरिक लैगरग्रेन ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.