चुनौती समानता डिटेक्टर


11

चुनौती

दो प्रश्न आईडी को देखते हुए, यह पता लगाने की कोशिश करें कि वे उत्तरों को देखकर कितने समान हैं।

विवरण

आपको दो प्रश्न आईडी दिए जाएंगे codegolf.stackexchange.com; आप मान सकते हैं कि दोनों आईडी के लिए मौजूद प्रश्न हैं जो हटाए नहीं गए हैं, लेकिन आवश्यक रूप से खुले नहीं हैं। आपको सभी उत्तरों के माध्यम से चलना चाहिए और दो प्रश्नों के उत्तर में कोड के बीच न्यूनतम लेवेन्स्हेटिन दूरी निर्धारित करनी चाहिए (हटाए गए उत्तरों को शामिल नहीं करना चाहिए)। यही है, आपको प्रश्न 1 में हर उत्तर की तुलना प्रश्न 2 में हर उत्तर से करनी चाहिए, और न्यूनतम लेवेन्शिन दूरी निर्धारित करनी चाहिए। एक उत्तर में कोड खोजने के लिए, निम्नलिखित प्रक्रिया मानें:

कोड स्निपेट कैसे खोजें

पाठ का एक निकाय उत्तर का वास्तविक कोड है यदि यह बैकटिक्स में है और अपनी पंक्ति में है, या यदि यह 4 रिक्त स्थान के साथ है, तो इसके ऊपर एक खाली रेखा है, जब तक कि ऊपर कोई पाठ न हो।

मान्य और गैर-मान्य कोड स्निपेट ( .एक स्थान के रूप में) के उदाहरण (समान संकेतों के एक टन से अलग)

This is `not a valid code snippet because it is not on its own line`
========================================
This is:
`A valid code snippet`
========================================
This is
....not a valid code snippet because there's no spacing line above
========================================
This is

....A valid code snippet because there's a spacing line above
========================================
....Valid code snippet because there's no other text
========================================

यदि उत्तर में कोई मान्य कोड स्निपेट नहीं हैं, तो उत्तर को पूरी तरह से अनदेखा कर दें। ध्यान दें कि आपको केवल पहला कोडब्लॉक लेना चाहिए।

अंतिम चश्मा

दो पूर्णांक के लिए दो प्रश्न आईडी किसी भी उचित प्रारूप में इनपुट किए जा सकते हैं। आउटपुट या तो चुनौती से किसी भी दो वैध जवाबों के बीच सबसे छोटी लेवेंसहाइट दूरी होनी चाहिए। यदि चुनौतियों, आउटपुट में से एक या दोनों के लिए "वैध" उत्तर नहीं हैं -1

परीक्षण का मामला

कॉमरेड स्पार्कलपनी द्वारा चुनौती 115715(एंबेडेड हेक्सागोन्स) और 116616(एंबेडेड ट्राइएंगल्स) दोनों के लिए, दो चारकोल जवाब (क्रितीलिथोस द्वारा दोनों) में 23 की एक लेवेंसहाइट दूरी थी, जो सबसे छोटी थी। इस प्रकार, आपका आउटपुट 115715, 116616होगा 23

संपादित करें

आप मान सकते हैं कि एपीआई के प्रतिबंध के कारण प्रश्न में अधिकतम 100 उत्तर हैं। आपको कोड ब्लॉक में बैकटिक्स को नजरअंदाज नहीं करना चाहिए, केवल तभी कोड ब्लॉक को बैकटिक्स का उपयोग करके बनाया जाता है न कि अपनी लाइन पर।

संपादित करें

मैंने बाउंटी अवधि को जल्दी समाप्त कर दिया क्योंकि मैंने एक सप्ताह के निलंबन के लिए एक मॉड के लिए अनुरोध किया था और मैं नहीं चाहता था कि बाउंटी को उच्चतम स्कोरिंग उत्तर (जो सबसे लंबे समय तक होता है) के लिए स्वचालित रूप से सम्मानित किया जाए। यदि कोई नया सबमिशन आता है या सबमिशन पर्याप्त होता है तो बाउंटी पीरियड के वास्तविक अंत (1 जून को UTC 00:00) से पहले 532 बाइट्स से छोटा हो जाता है, मैं अपने वादे पर खरा उतरने के लिए एक इनाम दूंगा, उसके बाद निलंबन समाप्त हो रहा है। अगर मुझे सही से याद है, तो मुझे अगली बार बाउंटी अवधि को दोगुना करने की आवश्यकता है, ताकि यदि आपको कोई उत्तर मिले, तो आपको +200 मिल सकता है :)


1
मैं मान्य कोड स्निपेट के रूप में गिना जाता हूं। Html में <code> टैग्स में से कुछ भी क्यों नहीं?
केल्विन के शौक

@ हेलकाबोम्बा न्यूलाइन प्रतिबंधों के बारे में क्या? मैं उन लोगों को शामिल करने का एक और तरीका खोजने की कोशिश कर सकता था।
हाइपरनेत्रिनो

@HelkaHomba अनिवार्य रूप से, यदि उत्तर में एक पंक्ति के भीतर बैकटिक-सीमांकित कोड है, तो इसे अनदेखा किया जाना चाहिए।
हाइपरनेत्रिनो

यह उन उत्तरों में से एक है, जहां प्रश्न का मुख्य भाग करना आसान है। पृष्ठ को डाउनलोड करना और कोड ब्लॉक निकालना, लेवेंसहाइट दूरी करने से कठिन है।
बैलिंट

1
ठंडा। बस जाँच रहा हूँ।
मैट

जवाबों:


1

पॉवरशेल, 532 बाइट्स

$1,$2=$args
$a={irm "api.stackexchange.com/2.2/questions/$args/answers?pagesize=100&site=codegolf&filter=!9YdnSMKKT"|% i*}
$r={$args.body-replace"(?sm).*?^(<pre.*?>)?<code>(.*?)</code>.*",'$2'}
$1=&$a $1;$2=&$a $2
(0..($1.count-1)|%{
    $c=&$r $1[$_]
    0..($2.count-1)|%{
        &{$c,$d=$args;$e,$f=$c,$d|% le*;$m=[object[,]]::new($f+1,$e+1);0..$e|%{$m[0,$_]=$_};0..$f|%{$m[$_,0]=$_};1..$e|%{$i=$_;1..$f|%{$m[$_,$i]=(($m[($_-1),$i]+1),($m[$_,($i-1)]+1),($m[($_-1),($i-1)]+((1,0)[($c[($i-1)]-eq$d[($_-1)])]))|sort)[0]}};$m[$f,$e]} $c $d
    }
}|sort)[0]

मैंने कुछ पठनीयता के लिए वहाँ नई कहानियाँ छोड़ दीं। अभी भी मेरी बाइट गिनती में परिलक्षित होती हैं।

यकीन है कि मैं इस पर एक संभाल है। मेरे लिए कठिन हिस्सा वास्तव में लेवेंसहाइट दूरी प्राप्त कर रहा था क्योंकि पावरशेल के लिए एक बिल्टिन नहीं है जहां तक ​​मुझे पता है। उसके कारण मैं लेवेंसहाइट दूरी पर संबंधित चुनौती का जवाब देने में सक्षम था । जब मेरा कोड LD के लिए एक अनाम फ़ंक्शन को संदर्भित करता है, तो आप उस उत्तर को अधिक विस्तृत विवरण के लिए संदर्भित कर सकते हैं कि यह कैसे काम करता है।

टिप्पणियों और प्रगति संकेतक के साथ कोड

कोड वास्तविक धीमा हो सकता है (एलडी के कारण) इसलिए मैंने अपने लिए कुछ प्रगति संकेतकों में बनाया ताकि मैं कार्रवाई का पालन कर सकूं क्योंकि यह सामने आया था और यह नहीं मान रहा था कि यह कहीं लूप में फंस गया है। प्रगति की निगरानी के लिए कोड शीर्ष ब्लॉक में नहीं है और न ही मेरी बाइट गिनती में गिना जाता है।

# Assign the two integers into two variables. 
$1,$2=$args

# Quick function to download up to 100 of the answer object to a given question using the SE API
$a={irm "api.stackexchange.com/2.2/questions/$args/answers?pagesize=100&site=codegolf&filter=!9YdnSMKKT"|% i*}

# Quick function that takes the body (as HTML) of an answer and parses out the likely codeblock from it. 
$r={$args.body-replace"(?sm).*?^(<pre.*?>)?<code>(.*?)</code>.*",'$2'}

# Get the array of answers from the two questions linked.
$1=&$a $1;$2=&$a $2

# Hash table of parameters used for Write-Progress
# LD calcuations can be really slow on larger strings so I used this for testing so I knew 
# how much longer I needed to wait.
$parentProgressParameters = @{
    ID = 1 
    Activity = "Get LD of all questions" 
    Status = "Counting poppy seeds on the bagel"
}

$childProgressParameters = @{
    ID = 2
    ParentID = 1
    Status = "Progress"
}


# Cycle each code block from each answer against each answer in the other question.
(0..($1.count-1)|%{
    # Get the code block from this answer
    $c=&$r $1[$_]

    # Next line just for displaying progress. Not part of code. 
    Write-Progress @parentProgressParameters -PercentComplete (($_+1) / $1.count * 100) -CurrentOperation "Answer $($_+1) from question 1"

    0..($2.count-1)|%{
        # Get the code block from this answer   
        $d=&$r $2[$_]

        # Next two lines are for progress display. Not part of code. 
        $childProgressParameters.Activity = "Comparing answer $($_+1) of $($2.count)"
        Write-Progress @childProgressParameters -PercentComplete (($_+1) / $2.count * 100) -CurrentOperation "Answer $($_+1) from question 2"

        # Anonymous function to calculate Levenstien Distance
        # Get a better look at that function here: https://codegolf.stackexchange.com/a/123389/52023
        &{$c,$d=$args;$e,$f=$c,$d|% le*;$m=[object[,]]::new($f+1,$e+1);0..$e|%{$m[0,$_]=$_};0..$f|%{$m[$_,0]=$_};1..$e|%{$i=$_;1..$f|%{$m[$_,$i]=(($m[($_-1),$i]+1),($m[$_,($i-1)]+1),($m[($_-1),($i-1)]+((1,0)[($c[($i-1)]-eq$d[($_-1)])]))|sort)[0]}};$m[$f,$e]} $c $d
    }
# Collect results and sort leaving the smallest number on top.
}|sort)[0]

कोड ब्लॉक खोजने के लिए मेरा तर्क HTML के रूप में उत्तर लेना है और कोड टैग सेट की तलाश करना है, वैकल्पिक रूप से एक पूर्व टैग सेट से घिरा हुआ है जो अपनी लाइन पर शुरू होता है। परीक्षण में इसे 6 अलग-अलग प्रश्न सेटों पर सभी सही डेटा मिले।

मैंने मार्कडाउन कोड से काम करने की कोशिश की, लेकिन सही कोड ब्लॉक ढूंढना बहुत मुश्किल था।

नमूना चलता है

Challenge-Similarity-Detector 97752 122740
57

Challenge-Similarity-Detector 115715 116616
23

मैंने इसे देखने के लिए 3 दिनों का बेहतर हिस्सा बिताया है। सबसे मजेदार प्रयास के लिए यह चुनौती मेरे शीर्ष 5 में है। टीएफटीसी (चालान के लिए धन्यवाद)
मैट

अच्छी नौकरी! धन्यवाद, मुझे खुशी है कि आपने इसका आनंद लिया! :)
हाइपरएनुट्रिनो

नोट: मैंने पहले बताए गए पुरस्कार से सम्मानित किया क्योंकि मैं निलंबन का अनुरोध कर रहा हूं, इसलिए मैं इसे बाद में पुरस्कार नहीं दे सकता। बहुत बढ़िया! :)
हाइपरएन्यूट्रीनो

एक निलंबन का अनुरोध?
मैट

हां, मैंने डेनिस से मुझे 1 सप्ताह का निलंबन देने को कहा ताकि मैं स्कूलवर्क पर ध्यान केंद्रित कर सकूं। यह पहले किया गया है (हालांकि मैं अभी भी यहाँ हूँ ... मुझे नहीं पता कि मैं कब गायब हो जाऊँगा)।
हाइपरएनुट्रीनो

3

जावा + Jsoup, 1027 बाइट्स

पहले दो तर्क प्रश्न आईडी हैं।

golfed:

import org.jsoup.*;import org.jsoup.nodes.*;class M{String a1[]=new String[100],a2[]=new String[100],c[];int i1=0,i2=0;public static void main(String a[])throws Exception{String r="/codegolf/";M m=new M();m.c=m.a1;m.r(Jsoup.connect(r+a[0]).get());m.c=m.a2;m.r(Jsoup.connect(r+a[1]).get());int s=m.ld(m.a1[1],m.a2[1]);for(int i=2;i<m.a1.length;i++)for(int j=2;j<m.a2.length;i++){if(m.a1[i]==null)break;int d=m.ld(m.a1[i],m.a2[j]);if(d<s)s=d;}System.out.print(s);}void r(Document d){a:for(Element e:d.select("td")){for(Element p:e.select("pre")){ a(p.select("code").get(0).html());continue a;}}}void a(String d){c[c==a1?i1++:i2++]=d;}int ld(String a,String b){a=a.toLowerCase();b=b.toLowerCase();int[]costs=new int[b.length()+1];for(int j=0;j<costs.length;j++)costs[j]=j;for(int i=1;i<=a.length();i++){costs[0]=i;int nw=i-1;for(int j=1;j<=b.length();j++){int cj=Math.min(1+Math.min(costs[j],costs[j-1]),a.charAt(i-1)==b.charAt(j-1)?nw:nw+1);nw=costs[j];costs[j]=cj;}}return costs[b.length()];}}

पठनीय:

import org.jsoup.*;import org.jsoup.nodes.*;

class M {
    String a1[]=new String[100],a2[]=new String[100],c[];
    int i1=0,i2=0;
    public static void main(String a[])throws Exception{
    String r="/codegolf/";
    M m=new M();

    m.c=m.a1;
    m.r(Jsoup.connect(r+a[0]).get());
    m.c=m.a2;
    m.r(Jsoup.connect(r+a[1]).get());

    int s=m.ld(m.a1[1],m.a2[1]);
    for(int i=2;i<m.a1.length;i++)for(int j=2;j<m.a2.length;i++){if(m.a1[i]==null)break;int d=m.ld(m.a1[i],m.a2[j]);if(d<s)s=d;}
    System.out.print(s);
}

void r(Document d) {
    a:for(Element e:d.select("td")) {for(Element p:e.select("pre")) { 
        a(p.select("code").get(0).html());
        continue a;
    }}
}

void a(String d){c[c==a1?i1++:i2++]=d;}

int ld(String a, String b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    int [] costs = new int [b.length() + 1];
    for (int j = 0; j < costs.length; j++)costs[j] = j;
    for (int i = 1; i <= a.length(); i++) {
        costs[0] = i;
        int nw = i - 1;
        for (int j = 1; j <= b.length(); j++) {
            int cj = Math.min(1 + Math.min(costs[j], costs[j - 1]), a.charAt(i - 1) == b.charAt(j - 1) ? nw : nw + 1);
            nw = costs[j];
            costs[j] = cj;
        }
    }
    return costs[b.length()];
}

}


मुझे इससे हराएं!!!! अच्छा!
tuskiomi

1
PPCG में आपका स्वागत है! यह तीसरे पक्ष के पुस्तकालय का उपयोग करने के लिए नियमों के खिलाफ नहीं है, लेकिन हमें आवश्यकता है कि पुस्तकालय के उपयोग को भाषा के साथ नोट किया जाए (इसलिए एक जावा उत्तर जो JavaHTML नामक एक पुस्तकालय का उपयोग करता है उसे "Java + JavaHTML" कहा जाएगा)।
Mego

ठीक है धन्यवाद! मैं अगली बार के लिए ध्यान में रखूँगा!
टॉमहॉक

यदि आप चाहते हैं तो इस चुनौती में आपको पुस्तकालय का उपयोग करने से कुछ भी नहीं है।
मैट

मुझे अब यह हो सकता है कि मेरे उत्तर में किसी ने टॉप किया हो!
टॉमहॉक

0

गणितज्ञ, 540 बाइट्स

f=Flatten;l=Length;P=StringPosition;(H[r_]:=Block[{s,a,t,k},t={};d=1;k="/codegolf/"<>r;s=First/@P[Import[k,"Text"],"<pre><code>"];a=f[First/@P[Import[k,"Text"],"answerCount"]][[1]];While[d<l@s,If[s[[d]]>a,AppendTo[t,s[[d]]]];d++];Table[StringDelete[StringCases[StringTake[Import[k,"Text"],{t[[i]],t[[i]]+200}],"<pre><code>"~~__~~"</code></pre>"],{"<pre><code>","</code></pre>"}],{i, l@t}]];Min@DeleteCases[f@Table[EditDistance[ToString@Row@H[#1][[i]],ToString@Row@H[#2][[j]]],{i,l@H[#1]},{j,l@H[#1]}],0])&


इनपुट

["115715", "116616"]

उत्पादन

23

बिल्ट-इन EditDistance का उपयोग करता है जो "स्ट्रिंग्स या वैक्टर यू और वी के बीच एडिट या लेवेंसहाइट दूरी देता है।"

के रूप में परीक्षण के मामले के लिए गणितज्ञ

EditDistance["FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β","NαWα«X²ι↙AX²⁻ι¹β↙β↑↖β→A⁻α¹α"]

२३ देता है

मुझे लगता है कि मैं इसे
कुछ और मिनटों में चला सकता हूं

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