डुप्लीकेट प्रश्नों का पता लगाएं


20

डुप्लीकेट प्रश्नों का पता लगाएं

एक बार की बात है, एक गोल्फ स्थल था। यह एक समस्या थी: लोग बार-बार समान या समान प्रश्न पोस्ट करेंगे। आप थेचयनित चयनित जबरन ब्लैकमेल किया गया अनुरोध करने की प्रक्रिया को स्वचालित करने का अनुरोध किया गया है कि क्या कोई प्रश्न मौजूदा का एक डुप्लिकेट है, जो भी आवश्यक हो (नियम देखें)।

इनपुट

आपके प्रोग्राम को इनपुट के रूप में एकल URL को स्वीकार करना होगा। यह मान सकते हैं कि यह codegolf.stackexchange.com पर एक प्रश्न की ओर जाता है ।

उत्पादन

इसी तरह के सवालों के लिए साइट खोजें। यदि आपको लगता है कि इनपुट प्रश्न किसी मौजूदा प्रश्न (या इसके विपरीत) की नकल है, तो दूसरे प्रश्न के URL को आउटपुट करें। आप नई लाइनों द्वारा अलग किए गए कई URL का उत्पादन कर सकते हैं। अपने आउटपुट के अंत में, आउटपुट end(एक अलग लाइन पर)।

स्कोरिंग

  • यदि कोई प्रश्न जो आप आउटपुट करते हैं, वास्तव में इनपुट प्रश्न (या इसके विपरीत) के डुप्लिकेट के रूप में चिह्नित किया गया था, तो आप 4 अंक स्कोर करते हैं। यह एक "सही अनुमान" है।
  • प्रत्येक झूठे सकारात्मक (उर्फ "गलत अनुमान") के लिए, आप 2 अंक खो देते हैं।
  • प्रत्येक प्रश्न के लिए जो वास्तव में एक डुप्लिकेट था लेकिन आपके आउटपुट (उर्फ "लापता अनुमान") में प्रकट नहीं होता है, 1 अंक खो देता है।

32 इनपुट प्रश्नों को जीतने के बाद सर्वोच्च स्कोर। ये 32 प्रश्न एक "दौर" है। प्रत्येक दौर की शुरुआत में, स्कोर 0. पर रीसेट हो जाएगा। हर कुछ दिनों में एक राउंड चलाया जाएगा, और प्रत्येक राउंड के बाद लीडरबोर्ड को अपडेट किया जाएगा।

नियम

  • यदि प्रश्न A और C दोनों B के डुप्लिकेट के रूप में बंद हैं, तो A, C के डुप्लिकेट के रूप में गिना जाएगा और इसके विपरीत।
  • प्रत्येक दौर की शुरुआत में, आपके कार्यक्रम में किसी भी प्रश्न के बारे में कोई डेटा (यानी कोई हार्डकॉन्ग ) नहीं हो सकता है , सिवाय वेबसाइट को पार्स करने के।
  • हालाँकि, आप किसी राउंड के दौरान डेटा को बाहरी फ़ाइलों में रख सकते हैं।
  • राउंड के बीच कोई डेटा नहीं रखा जा सकता है।
  • आपके आउटपुट में एक अनुगामी नई रेखा होनी चाहिए।
  • हो सकता है कि आप खोज परिणामों और किसी प्रश्न के URL, शीर्षक, टैग और पाठ को छोड़कर या प्रारूपण के बिना वेबसाइट के किसी भी डेटा का उपयोग न करें । उदाहरण के लिए, आप पाठ का उपयोग नहीं कर सकते हैं "foo द्वारा डुप्लिकेट के रूप में चिह्नित, बार ..." जो डुप्लिकेट प्रश्नों पर दिखाई देता है।
  • आप इस डेटा को सीधे साइट से, data.SE या API के माध्यम से प्राप्त कर सकते हैं।
  • प्रत्येक सबमिशन में एक नाम होना चाहिए।
  • प्रत्येक सबमिशन में स्पष्ट संस्करण क्रमांकन होना चाहिए।
  • यदि समय-सीमा के बाद सबमिशन आउटपुट नहीं देता है (निर्णय लिया जाना है, तो कृपया बताएं कि आपका सबमिशन कितना समय लेता है) इसे मार दिया जाएगा और 8 अंक खो देंगे।

2
1 मिनट व्यक्तिपरक नहीं है? नेटवर्क कनेक्शन और क्रॉलिंग से भारी संख्या में वेब अनुरोध आएंगे। यह आसानी से हर किसी के लिए 1 मिनट से अधिक समय ले सकता है :)
अनुकूलक

4
मुझे लगता है कि हम सीधे उस नंबर पर नहीं आ सकते हैं, आपको सही थ्रेशर समय निर्धारित करने के लिए खुद एक उदाहरण कार्यक्रम लिखना होगा (या पहले उत्तर का उपयोग करें)।
ऑप्टिमाइज़र

7
साइट को स्क्रैप करने के बजाय, आपको एपीआई के माध्यम से जाना चाहिए, और निर्दिष्ट करें कि कौन से फ़ील्ड का उपयोग किया जा सकता है।
गिल्स एसओ- बुराई को रोकें '

5
अगर यह प्रश्न डुप्लिकेट था तो यह बहुत मजेदार होगा .. ओह विडंबना xD
Teun Pronk

3
@professorfish आप वास्तव में कुछ परीक्षण मामलों का उपयोग कर सकते हैं, यहां आप जाते हैं। यह डेटा सभी Data.SE से आया है, इसलिए यह विश्वसनीय होना चाहिए। बेझिझक मुझे मूर्ख बनाकर मुझे गलत साबित करो। इस प्रश्न में codegolf.stackexchange.com/q/37737 कोई डुप्लिकेट नहीं है। यह प्रश्न कोड ggg.stackexchange.com/q/12348 के पास है। इस कोड में gg.stackexchange.com/q/10465 यह प्रश्न codegolf.stackexchange.com/q/12498 के पास ये codegolf.stackexchange.com/q/20006 codegolf.stackexchange.com/ है। क्यू / 242
पेनुट्रोप

जवाबों:


3

अजगर ३

मैं इस प्रविष्टि को नाम दे रहा हूं The Differ

कोड:

import urllib.request, gzip, re, json, difflib, sys
API_URL = "https://api.stackexchange.com/"
qurl = input()
qid = int(re.search("\d+",qurl).group(0))
def request(url,wrapper=False,**params):
    params.setdefault("filter","withbody")
    params.setdefault("site","codegolf")
    url = API_URL + url + "?"+"&".join([str(k)+"="+str(v) for k,v in params.items()])
    compressed_response = urllib.request.urlopen(url)
    response = gzip.decompress(compressed_response.read()).decode("utf8")
    response_object = json.loads(response)
    if wrapper:
        return response_object
    else:
        return response_object["items"]
question = request("questions/%s"%qurl)[0]
tags = ";".join(question["tags"])
title = question["title"]
escaped = title.replace(" ","%20")
related = request("similar",title=escaped,pagesize=100)
hasmore = False
length = sys.maxsize
for tag in question["tags"]:
    result = request("search",tagged=tag,
                     wrapper=True,
                     filter="!-*f(6rc.cI8O",
                     pagesize=100)
    if result["total"] < length:
        length = result["total"]
        related.extend(result["items"])
        hasmore = result["has_more"]
        besttag = tag
related.extend(best)
if length < 1500:
    for page in itertools.count(2):
        if not hasmore:
            break
        response = request("search",
                           tagged=besttag,
                           page=page,
                           pagesize=100,
                           filter="!-*f(6rc.cI8O",
                           wrapper=True)
        hasmore = response["has_more"]
        related.extend(result["items"])
matcher = difflib.SequenceMatcher(None, question["body"], None)
titlematcher = difflib.SequenceMatcher(None, question["title"], None)
seen = set()
seen.add(question["question_id"])
for possible in related:
    matcher.set_seq2(possible["body"])
    titlematcher.set_seq2(possible["title"])
    score = matcher.ratio()+titlematcher.ratio()
    qid = possible["question_id"]
    if score > .85 and qid not in seen:
        print(qid)
        seen.add(qid)
print("end")

फ़िल्टर "!-*f(6rc.cI8O"में totalवैश्विक आवरण ऑब्जेक्ट bodyपर पैरामीटर और प्रश्नों पर पैरामीटर शामिल था।

यह प्रविष्टि दो एपीआई अनुरोधों को प्लस प्रति टैग पर एक प्लस प्रति सौ प्रश्नों में से एक का उपयोग करती है। यदि यह एक एपीआई थ्रॉटल (जो इसे चेक नहीं करता है) को हिट करता है, तो यह ए बढ़ाएगाurllib.error.HTTPError: HTTP Error 400: Bad Request

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.