Thử thách tương tự


11

Thử thách

Đưa ra hai ID câu hỏi, cố gắng tìm hiểu mức độ giống nhau của chúng bằng cách xem các câu trả lời.

Chi tiết

Bạn sẽ được cung cấp hai ID câu hỏi cho codegolf.stackexchange.com; bạn có thể cho rằng có tồn tại các câu hỏi cho cả hai ID không bị xóa, nhưng không nhất thiết phải mở. Bạn phải chạy qua tất cả các câu trả lời và xác định khoảng cách Levenshtein tối thiểu giữa mã trong các câu trả lời cho hai câu hỏi (không bao gồm các câu trả lời bị xóa). Nghĩa là, bạn nên so sánh mọi câu trả lời trong câu hỏi 1 với mọi câu trả lời trong câu hỏi 2 và xác định khoảng cách Levenshtein tối thiểu. Để tìm mã trong câu trả lời, giả sử quy trình sau:

Cách tìm đoạn mã

Phần thân văn bản là mã thực tế của câu trả lời nếu nó nằm trong backticks và nằm trên dòng riêng của nó hoặc nếu nó được thụt vào với 4 khoảng trắng, với một dòng trống phía trên nó, trừ khi không có văn bản nào ở trên.

Ví dụ về các đoạn mã hợp lệ và không hợp lệ (có .dấu cách) (cách nhau bởi một tấn dấu bằng)

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

Nếu không có đoạn mã hợp lệ trong câu trả lời, hãy bỏ qua câu trả lời hoàn toàn. Lưu ý rằng bạn chỉ nên lấy codeblock đầu tiên.

Thông số kỹ thuật cuối cùng

Hai ID câu hỏi có thể được nhập vào ở bất kỳ định dạng hợp lý nào cho 2 số nguyên. Đầu ra phải là khoảng cách Levenshtein nhỏ nhất giữa hai câu trả lời hợp lệ từ bất kỳ thử thách nào. Nếu không có câu trả lời "hợp lệ" cho một hoặc cả hai thử thách, hãy xuất ra -1.

Trường hợp thử nghiệm

Đối với thử thách 115715(Hình lục giác nhúng) và 116616(Hình tam giác nhúng) của cả đồng chí SparklePony, hai câu trả lời của Char than (cả hai bởi KritixiLithos) có khoảng cách Levenshtein là 23, nhỏ nhất. Vì vậy, đầu ra của bạn 115715, 116616sẽ là 23.

Biên tập

Bạn có thể cho rằng câu hỏi có tối đa 100 câu trả lời do hạn chế kích thước trang API. Bạn không nên bỏ qua backticks trong các khối mã, chỉ khi chính khối mã được tạo bằng backticks chứ không phải trên dòng riêng của nó.

Biên tập

Tôi đã chấm dứt thời hạn tiền thưởng sớm vì tôi đã yêu cầu một mod phải tạm ngưng một tuần và tôi không muốn tiền thưởng được tự động trao cho câu trả lời có điểm cao nhất (điều này xảy ra lâu nhất). Nếu một bài nộp mới được gửi đến hoặc một bài nộp được chơi đủ để trở nên ngắn hơn 535 byte trước khi kết thúc thời hạn tiền thưởng thực sự (UTC 00:00 ngày 1 tháng 6), tôi sẽ đưa tiền thưởng đó để thực hiện đúng lời hứa của tôi, sau đình chỉ hết hạn. Nếu tôi nhớ chính xác, tôi cần tăng gấp đôi thời gian tiền thưởng vào lần tới để nếu bạn nhận được câu trả lời, bạn có thể nhận được +200 :)


1
Tôi bối rối bởi những gì được coi là một đoạn mã hợp lệ. Tại sao không phải bất cứ thứ gì trong thẻ <code> trong html?
Sở thích của Calvin

@HelkaHomba Điều gì về các hạn chế dòng mới? Tôi có thể cố gắng tìm một cách khác để kết hợp những thứ đó.
HyperNeutrino

@HelkaHomba Về cơ bản, nếu câu trả lời chứa mã được phân tách bằng backtick trong một dòng thì nên bỏ qua.
HyperNeutrino

Đây là một trong những câu trả lời, nơi dễ thực hiện phần chính của câu hỏi. Tải xuống trang và trích xuất các khối mã khó hơn so với thực hiện khoảng cách levenshtein.
Bálint

1
Mát mẻ. Chỉ cần kiểm tra.
Matt

Câu trả lời:


1

PowerShell, 535 byte

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

Tôi để lại dòng mới trong đó cho một số dễ đọc. Chúng vẫn được phản ánh trong số byte của tôi.

Khá chắc chắn rằng tôi có một xử lý về điều này. Điều khó khăn đối với tôi là thực sự có được khoảng cách Levenshtein vì PowerShell không có tích hợp cho điều đó theo như tôi biết. Do đó, tôi đã có thể trả lời thử thách liên quan đến khoảng cách Levenshtein . Khi mã của tôi đề cập đến một hàm ẩn danh cho LD, bạn có thể tham khảo câu trả lời đó để được giải thích chi tiết hơn về cách thức hoạt động của nó.

Mã với ý kiến ​​và chỉ báo tiến độ

Mã có thể bị chậm thực sự (vì LD) vì vậy tôi đã tự xây dựng một số chỉ số tiến bộ để tôi có thể theo dõi hành động khi nó mở ra và không cho rằng nó bị kẹt trong một vòng lặp ở đâu đó. Mã cho tiến trình giám sát không nằm trong khối trên cùng và cũng không được tính vào số byte của tôi.

# 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: /codegolf//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]

Logic của tôi để tìm các khối mã là lấy câu trả lời dưới dạng HTML và tìm kiếm một bộ thẻ mã, được bao quanh tùy ý bởi một bộ thẻ trước bắt đầu trên dòng riêng của nó. Trong thử nghiệm, nó tìm thấy tất cả các dữ liệu chính xác trên 6 bộ câu hỏi khác nhau.

Tôi đã cố gắng làm việc từ mã markdown nhưng quá khó để tìm đúng khối mã.

Chạy mẫu

Challenge-Similarity-Detector 97752 122740
57

Challenge-Similarity-Detector 115715 116616
23

Tôi đã dành phần tốt hơn của 3 ngày để xem xét điều này. Thử thách này nằm trong top 5 của tôi cho những nỗ lực thú vị nhất. TFTC (Cảm ơn vì cuộc trò chuyện)
Matt

Công việc tốt! Cảm ơn, tôi rất vui vì bạn thích nó! :)
HyperNeutrino

Lưu ý: Tôi đã trao tiền thưởng sớm hơn so với tuyên bố vì tôi đang yêu cầu đình chỉ để tôi không thể trao thưởng sau này. Làm tốt lắm! :)
HyperNeutrino

Yêu cầu đình chỉ?
Matt

Có, tôi đã yêu cầu Dennis cho tôi đình chỉ 1 tuần để tôi có thể tập trung vào việc học. Nó đã được thực hiện trước đây (mặc dù tôi vẫn ở đây ... Tôi không biết khi nào tôi sẽ biến mất).
HyperNeutrino

3

Java + Jsoup, 1027 byte

Hai đối số đầu tiên là ID câu hỏi.

Chơi gôn

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()];}}

Có thể đọc được

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()];
}

}


đánh tôi với nó !!!! Đẹp!
tuskiomi

1
Chào mừng đến với PPCG! Việc sử dụng thư viện của bên thứ ba không trái với quy tắc, nhưng chúng tôi yêu cầu việc sử dụng thư viện phải được ghi chú bằng ngôn ngữ (vì vậy câu trả lời Java sử dụng thư viện có tên JavaHTML sẽ được gắn nhãn "Java + JavaHTML").
Mego

Được rồi cảm ơn! Tôi sẽ ghi nhớ điều đó cho lần tới!
Tomahawk2001913

Không có gì ngăn bạn sử dụng một thư viện trong thử thách này nếu bạn muốn.
Matt

Bây giờ tôi có thể phải có ai đó đứng đầu câu trả lời của tôi!
Tomahawk2001913

0

Toán học, 540 byte

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])&


đầu vào

["115715", "116616"]

đầu ra

23

sử dụng EditDistance tích hợp "cung cấp khoảng cách chỉnh sửa hoặc Levenshtein giữa các chuỗi hoặc vectơ u và v."

Đối với trường hợp kiểm tra toán học

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

trả lại 23

Tôi đoán tôi có thể chơi gôn thêm một chút
Mất vài phút để chạy

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.