চ্যালেঞ্জ সাদৃশ্য সনাক্তকারী


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
========================================

উত্তরে যদি কোনও বৈধ কোড স্নিপেট না থাকে তবে উত্তরটিকে সম্পূর্ণ উপেক্ষা করুন। মনে রাখবেন যে আপনার কেবল প্রথম কোডব্লক নেওয়া উচিত।

ফাইনাল স্পেস

দুটি প্রশ্ন আইডি 2 পূর্ণসংখ্যার জন্য কোনও যুক্তিসঙ্গত বিন্যাসে ইনপুট করা যেতে পারে। উভয় চ্যালেঞ্জ থেকে যে কোনও দুটি বৈধ উত্তরের মধ্যে আউটপুটটি ছোটতম লেভেনস্টেইনের দূরত্ব হওয়া উচিত। যদি চ্যালেঞ্জগুলির একটি বা উভয়ের জন্য কোনও "বৈধ" উত্তর না থাকে তবে আউটপুট -1

পরীক্ষা ক্ষেত্রে

কমরেড স্পার্কলপোনির চ্যালেঞ্জের জন্য 115715(এম্বেডড হেক্সাগনস) এবং 116616(এম্বেডেড ট্রায়াঙ্গলস) উভয়ের জন্য দুটি কাঠকয়ালের উত্তর (ক্রিটিক্সিলিথোসের দু'জনেরই) লেভেনস্টেইনের দূরত্ব ছিল 23, যা সবচেয়ে ছোট ছিল। সুতরাং, আপনার আউটপুট 115715, 116616হবে 23

সম্পাদন করা

আপনি ধরে নিতে পারেন যে কোনও API পৃষ্ঠাগুলির সীমাবদ্ধতার কারণে প্রশ্নটির সর্বাধিক 100 টি উত্তর রয়েছে। কোড ব্লকে নিজে ব্যাকটিক্স ব্যবহার করে তৈরি করা হয়েছে এবং নিজস্ব লাইনে না থাকলে কেবল কোড ব্লকে আপনার ব্যাকটিকগুলি উপেক্ষা করা উচিত নয়।

সম্পাদন করা

আমি অনুগ্রহের সময়কালটি প্রথম দিকে শেষ করে দিয়েছিলাম কারণ আমি এক সপ্তাহের সাসপেনশন পাওয়ার জন্য একটি মোডের কাছে একটি অনুরোধ করেছি এবং আমি চাইনি যে এই অনুগ্রহটি স্বয়ংক্রিয়ভাবে সর্বোচ্চ স্কোরিং উত্তরকে দেওয়া হবে (যা দীর্ঘতম হয়)। যদি কোনও নতুন জমা আসে বা অনুদানের সময়কালের আসল সমাপ্তির আগে (জুন 1, ইউটিসি 00:00) এর আগে 532 বাইটের চেয়ে ছোট হয়ে যাওয়ার জন্য কোনও জমা দেওয়া যথেষ্ট পরিমাণে গল্ফ হয় তবে আমি সেই প্রতিদানটি আমার প্রতিশ্রুতির প্রতি দৃ true় থাকার জন্য দেব, পরে স্থগিতের মেয়াদ শেষ হয়ে যায়। যদি আমি সঠিকভাবে মনে রাখি, পরের বারের জন্য আমাকে অনুগ্রহকাল দ্বিগুণ করতে হবে তাই আপনি যদি উত্তর পেয়ে থাকেন তবে আপনি +200 পেতে পারেন :)


1
একটি বৈধ কোড স্নিপেট হিসাবে গণনা করা নিয়ে আমি বিভ্রান্ত। এইচটিএমএলে কেবল <কোড> ট্যাগে যা কিছু আছে কেন?
ক্যালভিনের

@ হেলকাহোম্বা নতুন লাইনের বিধিনিষেধ সম্পর্কে কী? সেগুলি অন্তর্ভুক্ত করার জন্য আমি অন্য কোনও উপায় সন্ধান করার চেষ্টা করতে পারি।
হাইপার নিউট্রিনো

@ হেলকাহোম্বা মূলত, উত্তরে যদি একটি লাইনের মধ্যে ব্যাকটিক-সীমিত কোড থাকে তবে এটিকে উপেক্ষা করা উচিত।
হাইপারনিউটারিনো

এটি সেই উত্তরগুলির মধ্যে একটি, যেখানে প্রশ্নের মূল অংশটি করা সহজ। পৃষ্ঠাটি ডাউনলোড করা এবং কোড ব্লকগুলি বের করা লেভেনস্টেইন দূরত্বের চেয়ে শক্ত doing
বিলিন্ট

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]

কিছু পাঠযোগ্যতার জন্য আমি সেখানে নিউলাইনগুলি রেখেছি। এখনও আমার বাইট গণনা প্রতিফলিত হয়।

খুব নিশ্চিত যে আমার এটির একটি হ্যান্ডেল আছে। আমার পক্ষে শক্ত অংশটি আসলে লেভেনস্টাইন দূরত্ব পাচ্ছিল যেহেতু পাওয়ারশেলের পক্ষে একটি বিল্টিন নেই যতটা আমি জানি। যার কারণে আমি লেভেনস্টাইন দূরত্ব সম্পর্কিত সম্পর্কিত চ্যালেঞ্জের জবাব দিতে সক্ষম হয়েছি । যখন আমার কোড এলডি-এর জন্য একটি বেনামি ফাংশনকে বোঝায় আপনি কীভাবে এটি কাজ করে সে সম্পর্কে আরও বিশদ বিশদের জন্য সেই উত্তরটি উল্লেখ করতে পারেন।

মন্তব্য এবং অগ্রগতি সূচক সহ কোড

কোডটি আসল ধীরে ধীরে পেতে পারে (এলডির কারণে) তাই আমি নিজের জন্য কিছু অগ্রগতি সূচক তৈরি করেছি যাতে আমি ক্রিয়াটি প্রকাশের সাথে সাথে অনুসরণ করতে পারি এবং এটি কোথাও লুপের মধ্যে আটকে ছিল না তা অনুমান করি না। অগ্রগতি পর্যবেক্ষণের কোডটি শীর্ষ ব্লকে নয় বা আমার বাইট গণনায় গণনা করা হয়নি।

# 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]

কোড ব্লকগুলি সন্ধানের জন্য আমার যুক্তিটি এইচটিএমএল হিসাবে উত্তর গ্রহণ করা এবং একটি কোড ট্যাগ সেট সন্ধান করা, allyচ্ছিকভাবে নিজের লাইনে শুরু হওয়া প্রাক ট্যাগ সেট দ্বারা ঘিরে রয়েছে। পরীক্ষায় এটি 6 টি বিভিন্ন প্রশ্ন সেটে সমস্ত সঠিক ডেটা খুঁজে পেয়েছে।

আমি মার্কডাউন কোড থেকে কাজ করার চেষ্টা করেছি তবে সঠিক কোড ব্লকটি পাওয়া খুব কঠিন ছিল।

নমুনা রান

Challenge-Similarity-Detector 97752 122740
57

Challenge-Similarity-Detector 115715 116616
23

আমি এটি দেখার জন্য 3 দিনের ভাল অংশটি ব্যয় করেছি। বেশিরভাগ মজার চেষ্টা করার জন্য এই চ্যালেঞ্জটি আমার শীর্ষ 5 এ। টিএফটিসি (চ্যালেঞ্জের জন্য ধন্যবাদ)
ম্যাট

সুন্দর কাজ! ধন্যবাদ, আপনি আনন্দিত হয়ে আমি আনন্দিত! :)
হাইপারনিউট্রিনো

দ্রষ্টব্য: আমি আগেই বরকতটিকে পুরষ্কার দিয়েছিলাম কারণ আমি স্থগিতের জন্য অনুরোধ করছি তাই পরে আমি এটি প্রদান করতে পারি না। সাবাশ! :)
হাইপারনিউট্রিনো

স্থগিতের জন্য অনুরোধ করছেন?
ম্যাট

হ্যাঁ, আমি ডেনিসকে আমাকে 1-সপ্তাহের সাসপেনশন দিতে বলেছিলাম যাতে আমি স্কুল কর্মের দিকে মনোনিবেশ করতে পারি। এটি আগে সম্পন্ন হয়েছে (যদিও আমি এখনও এখানে আছি ... আমি কখন অদৃশ্য হয়ে যাব জানি না)।
হাইপারনিউটারিনো

3

জাভা + জসোপ, 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
পিপিসিজিতে আপনাকে স্বাগতম! এটি কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহারের বিধিবিরোধী নয়, তবে আমাদের প্রয়োজন লাইব্রেরির ব্যবহারটি ভাষার সাথে উল্লেখ করা উচিত (সুতরাং জাভা উত্তর যে জাভাএইচটিএমএল ব্যবহার করে একটি "জাভা + জাভা এইচটিএমএল" লেবেলযুক্ত হবে)।
মেগো

ঠিক আছে ধন্যবাদ! আমি পরের বারের জন্য এটি মনে রাখব!
Tomahawk2001913

আপনি চাইলে এই চ্যালেঞ্জটিতে একটি লাইব্রেরি ব্যবহার থেকে আপনাকে বিরত করার কিছুই নেই।
ম্যাট

আমার এখন হতে পারে যে কেউ আমার উত্তর শীর্ষে আছে!
Tomahawk2001913

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["FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β","NαWα«X²ι↙AX²⁻ι¹β↙β↑↖β→A⁻α¹α"]

23 রিটার্ন দেয়

আমি অনুমান করি যে আমি এটি আরও কিছুটা গল্ফ করতে পারি
, চালাতে কয়েক মিনিট সময় নেয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.