লেভেনস্টাইন দূরত্ব


40

অনেক সম্পাদন করা দূরত্ব যেমন প্রশ্ন, আছে যদিও এই এক , একটি সহজ প্রশ্ন একটি প্রোগ্রাম যা Levenshtein দূরত্ব হিসাব করে লিখতে নয়।

কিছু এক্সপোশন

দুটি স্ট্রিংয়ের মধ্যে লেভেনস্টেইন সম্পাদনার দূরত্ব হ'ল একটি শব্দকে অন্য শব্দের মধ্যে রূপান্তর করার জন্য সন্নিবেশ, মুছে ফেলা বা বিকল্পগুলির ন্যূনতম সম্ভাব্য সংখ্যা। এই ক্ষেত্রে, প্রতিটি সন্নিবেশ, মুছে ফেলা এবং প্রতিস্থাপনের জন্য ব্যয় হয় 1

উদাহরণস্বরূপ, এর মধ্যকার দূরত্ব 3 rollএবং rollingকারণ মুছে ফেলার জন্য 1 ব্যয় হয় এবং আমাদের 3 টি অক্ষর মুছতে হবে। tollএবং এর মধ্যে দূরত্ব tall1, কারণ প্রতিস্থাপনের জন্য ব্যয় হয় 1।

বিধি

  • ইনপুট দুটি স্ট্রিং হবে। আপনি ধরে নিতে পারেন যে স্ট্রিংগুলি ছোট হাতের অক্ষরে থাকে, কেবলমাত্র অক্ষর থাকে, খালি থাকে না এবং সর্বোচ্চ দৈর্ঘ্যের 100 টি অক্ষর হয় characters
  • উপরে বর্ণিত হিসাবে আউটপুটটি দুটি স্ট্রিংয়ের নূন্যতম লেভেনস্টেইন সম্পাদনার দূরত্ব হবে।
  • আপনার কোড অবশ্যই একটি প্রোগ্রাম বা একটি ফাংশন। এটির নামকরণের ফাংশন হওয়ার দরকার নেই, তবে এটি কোনও বিল্ট-ইন ফাংশন হতে পারে না যা সরাসরি লেভেনস্টেইনের দূরত্বকে গণনা করে। অন্যান্য বিল্ট-ইনগুলি অনুমোদিত।
  • এটি কোড গল্ফ, তাই সংক্ষিপ্ত উত্তরটি জেতে।

কিছু উদাহরণ

>>> lev("atoll", "bowl")
3
>>> lev("tar", "tarp")
1
>>> lev("turing", "tarpit")
4
>>> lev("antidisestablishmentarianism", "bulb")
27

সর্বদা হিসাবে, সমস্যাটি যদি অস্পষ্ট হয় তবে দয়া করে আমাকে জানান। শুভকামনা এবং ভাল গল্ফিং!

তালিকা

var QUESTION_ID=67474;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>

উত্তর:


8

পাইথ, 34 বাইট

J]wf}z=Jsmsm++.DdkXLdkGXLkdGhld-Jk

প্রদর্শন

এটি বিশেষত গল্ফযুক্ত এবং খুব ধীর নয়। এটি একটি যুক্তিসঙ্গত সময়ের মধ্যে অতীত 2 পরিবর্তনগুলি হ্যান্ডেল করতে পারে না।


3
তবে এটি কাজ করে, এবং এটিই গণনা করে। : পি
কনর ও'ব্রায়েন

10

মতলব, 177 163 বাইট

function l=c(a,b);m=nnz(a)+1;n=nnz(b)+1;for i=0:m-1;for j=0:n-1;z=max(i,j);try;z=min([l(i,j+1)+1,l(i+1,j)+1,l(i,j)+(a(i)~=b(j))]);end;l(i+1,j+1)=z;end;end;l=l(m,n)

এটি এই সূত্রের একটি সরল বাস্তবায়ন:

এখানে চিত্র বর্ণনা লিখুন

Ungolfed:

function l=l(a,b);
m=nnz(a)+1;
n=nnz(b)+1;
for i=0:m-1;
    for j=0:n-1;
        z=max(i,j);
        try;
            z=min([l(i,j+1)+1,l(i+1,j)+1,l(i,j)+(a(i)~=b(j))]);
        end;
        l(i+1,j+1)=z;
    end;
end;
l=l(m,n)

যদি স্কোর কোডটি আপনি অন্তর্ভুক্ত না করেন তবে দয়া করে স্কোর কোডটি অন্তর্ভুক্ত করুন। অন্যথায় আমি মনে করি অনেকগুলি শ্বেত স্পেস রয়েছে যা গল্ফ করা যেতে পারে।
অ্যালেক্স এ।

1
@AlexA। ইন্ডেন্টেশন উদ্দেশ্যে অগ্রণী স্থান এবং নিউলাইনগুলি গণনা করা হয় না (এবং নিরাপদে সরানো যেতে পারে)। একবার একবার এটি অনুমোদিত ছিল এবং কেউ অভিযোগ করেনি।
edc65

1
@ edc65 এখন মেটা sensকমত্যটি হল যে স্কোর করা কোডটি প্রদান করা উচিত।
অ্যালেক্স এ

2
ঠিক আছে, তবে সংখ্যাগরিষ্ঠ অপঠনযোগ্য সংস্করণ পছন্দ করে। আমি এখনও এখানে পঠনযোগ্য সংস্করণটি এখানে রেখেছি, যদি কেউ দেখতে চায় যে আসলে কী চলছে =))
flawr

2
গল্ফযুক্ত জমা (একটি যেটি স্কোর করেছে) পাশাপাশি একটি অব্যক্ত সংস্করণ উভয়ই সরবরাহ করা সাধারণ অনুশীলন, আমাদের কেবল প্রয়োজন যে স্কোরটি অন্তর্ভুক্ত করা উচিত। ;)
অ্যালেক্স এ।

7

পাইথন 2, 151 140 138 বাইট

উইকিপিডিয়া ভিত্তিক লেভেনস্টেইন দূরত্বের ধীরে ধীরে পুনরাবৃত্তির প্রয়োগ (11 টি চর শেভিং করার জন্য @ কেনিকে ধন্যবাদ এবং অন্য 2 এর জন্য @ শার্লক 9)।

def l(s,t):
 def f(m,n):
  if m*n<1:return m or n
  return 1+min([f(m-1,n),f(m,n-1),f(m-1,n-1)-(s[m-1]==t[n-1])])
 return f(len(s),len(t))

উপস্থাপিত পরীক্ষার মামলার জন্য সঠিক উত্তর দেওয়া:

assert l("tar", "tarp") == 1
assert l("turing", "tarpit") == 4
assert l("antidisestablishmentarianism", "bulb") == 27        
assert l("atoll", "bowl") == 3

1
আপনি হয়ত কিছু 3-4 বা if !n*m:return n if n else mঅন্য 2 টি করে বাট বাঁচাতে পারেন return 1+min([ f(..), f(..), f(..) - (s[..] == t[..]) ])
কেনে 21

আপনি f(m-1,n-1)-(s[m-1]==t[n-1])পরিবর্তে ব্যবহার করে 2 বাইট সংরক্ষণ করতে হবে f(m-1,n-1)+(s[m-1]!=t[n-1])-1
শার্লক 9


5

জাভাস্ক্রিপ্ট (ES6) 106 113 122

নীলের পরামর্শ অনুসরণ করে 16 বাইট সংরক্ষণ করা হয়েছে সম্পাদনা করুন

বেনামে ফাংশন হিসাবে।

(s,t)=>[...s].map((u,i)=>w=w.map((v,j)=>p=j--?Math.min(p,v,w[j]-(u==t[j]))+1:i+1),w=[...[,...t].keys()])|p

এটি ওয়েগনার – ফিশার অ্যালগরিদমের একটি গল্ফ বাস্তবায়ন যা সংযুক্ত উইকিপিডিয়া নিবন্ধে বর্ণিত ঠিক যেমন দুটি ম্যাট্রিক্স সারি সহ আইট্রেটিভ বিভাগে (এমনকি যদি বাস্তবে মাত্র 1 সারি ব্যবহৃত হয় - অ্যারে ডাব্লু )

কম গল্ফড

(s,t)=>
{
  w = [...[0,...t].keys()];
  for(i = 0; i < s.length; i++)
    w = w.map((v,j)=>
              p = j
              ? Math.min(p+1, v+1, w[j-1] + (s[i]!=t[j-1]))
              : i+1
             );
  return p
}

পরীক্ষার স্নিপেট

L=(s,t)=>[...s].map((u,i)=>w=w.map((v,j)=>p=j--?Math.min(p,v,w[j]-(u==t[j]))+1:i+1),w=[...[,...t].keys()])|p

console.log=x=>O.textContent+=x+'\n';

[["atoll", "bowl"],["tar", "tarp"]
,["turing", "tarpit"],["antidisestablishmentarianism", "bulb"]]
.forEach(t=>console.log(t+' => '+L(...t)))
<pre id=O></pre>


1
আপনি কি [...[0,...t].keys()]পরিবর্তে ব্যবহার করতে পারেন ? পারলে 2 বাইট সাশ্রয় করুন।
নিল

1
@ নিল যা দেখতে দেখতে কুৎসিত তবে এটি আরও খাটো। Thx
edc65

1
আসলে আপনি অন্য একটি বাইট সংরক্ষণ করতে পারেন, [...[,...t].keys()]কাজ করে আমারও মনে হয়।
নীল

আমি এটি ব্যবহার করে অন্য বাইটটি শেভ করতে পেরেছি [...s].map():(s,t)=>(w=[...[,...t].keys()],[...s].map((u,i)=>w=w.map((v,j)=>p=j--?Math.min(p,v,w[j]-(s[i-1]==t[j]))+1:i)),p)
নীল

@ নিল দুর্দান্ত, আবারও ধন্যবাদ!
edc65

4

পাইথন 2, 118 বাইট

এই সমাধানটির একটি গল্ফ , তবে এটি এক বছরের জন্য উইলিয়ামের মতো মনে হচ্ছে না, তাই আমাকে এটি নিজে পোস্ট করতে হবে:

def l(s,t):f=lambda m,n:m or n if m*n<1else-~min(f(m-1,n),f(m,n-1),f(m-1,n-1)-(s[m-1]==t[n-1]));print f(len(s),len(t))

Repl.it চেষ্টা করুন

দুটি স্ট্রিং নেয় এবং দূরত্বকে আউটপুট দেয় STDOUT( মেটা দ্বারা অনুমোদিত )। দয়া করে পরামর্শ মন্তব্য করুন, আমি নিশ্চিত এটি আরও গল্ফ করা যেতে পারে।


কোনও কার্যক্রমে সমস্ত কিছু মোড়ানো দরকার? আপনি দুটি input()এস বা একটি ব্যবহার করতে পারেন input().split()?
শার্লক

@ শার্লক ৯ আমি এটি চেষ্টা করেছি, তবে যতটুকু আমি বলতে পারি এটির জন্য 1 বাইট অতিরিক্ত খরচ হয়
ফ্লিপট্যাক

ঠিক আছে, আমি ভুলে গেছি যে আপনি সংজ্ঞায়িত প্রয়োজন sএবং tকোডে কোথাও। কিছু মনে করো না. ভাল কাজ: ডি
শার্লক

আমি নিশ্চিত না কেন উইলেম ব্যবহার করেছিল m or n। আপনি এটি দিয়ে প্রতিস্থাপন করতে পারেন m+n
আরনাউল্ড

3

অটোআইটি , 333 বাইট

Func l($0,$1,$_=StringLen,$z=StringMid)
Dim $2=$_($0),$3=$_($1),$4[$2+1][$3+1]
For $5=0 To $2
$4[$5][0]=$5
Next
For $6=0 To $3
$4[0][$6]=$6
Next
For $5=1 To $2
For $6=1 To $3
$9=$z($0,$5,1)<>$z($1,$6,1)
$7=1+$4[$5][$6-1]
$8=$9+$4[$5-1][$6-1]
$m=1+$4[$5-1][$6]
$m=$m>$7?$7:$m
$4[$5][$6]=$m>$8?$8:$m
Next
Next
Return $4[$2][$3]
EndFunc

নমুনা পরীক্ষার কোড:

ConsoleWrite(l("atoll", "bowl") & @LF)
ConsoleWrite(l("tar", "tarp") & @LF)
ConsoleWrite(l("turing", "tarpit") & @LF)
ConsoleWrite(l("antidisestablishmentarianism", "bulb") & @LF)

উৎপাদনের

3
1
4
27

3

k4, 66 বাইট

{$[~#x;#y;~#y;#x;&/.z.s'[-1 0 -1_\:x;0 -1 -1_\:y]+1 1,~(*|x)=*|y]}

একটি বিরক্তিকর এবং মূলত অলগের অমীমাংসিত ইমপ্লিট। প্রাক্তন .:

  f:{$[~#x;#y;~#y;#x;&/.z.s'[-1 0 -1_\:x;0 -1 -1_\:y]+1 1,~(*|x)=*|y]}
  f["kitten";"sitting"]
3
  f["atoll";"bowl"]
3
  f["tar";"tarp"]
1
  f["turing";"tarpit"]
4
  f["antidisestablishmentarianism";"bulb"]
27

3

গুরুতরভাবে, 86 82 78 বাইট

,#,#`k;;;░="+l"£@"│d);)[]oq╜Riu)@d);)@[]oq╜Riu(@)@)@[]oq╜Ri3}@)=Y+km"£@IRi`;╗ƒ

হেক্স ডাম্প:

2c232c23606b3b3b3bb03d222b6c229c4022b364293b295b5d6f71bd526975294064293b29405b
5d6f71bd5269752840294029405b5d6f71bd5269337d40293d592b6b6d229c40495269603bbb9f

এটি অনলাইন চেষ্টা করুন

(দ্রষ্টব্য যে লিঙ্কটি অন্য সংস্করণে রয়েছে কারণ অনলাইন দোভাষী সম্পর্কে নতুন, সংক্ষিপ্ত সংস্করণটি ভেঙে যায়, যদিও এটি ডাউনলোডযোগ্য দোভাষীর সাথে সূক্ষ্মভাবে কাজ করে))

এটি সর্বাধিক সরল বাস্তবায়ন সম্পর্কে গুরুতরভাবে পুনরাবৃত্ত সংজ্ঞাটির অনুমতি দেয়। এটি খুব ধীর কারণ এটি কোনও স্মৃতিচারণ করে না। সম্ভবত সারণী পদ্ধতিটি সংক্ষিপ্ত হতে পারে (রেজিস্টারগুলিকে সারি হিসাবে ব্যবহার করে) তবে আমি এতে যথেষ্ট খুশি হব, যদিও এতে আমার ভাষা-ভাষা-ভাষার প্রায়শই রয়েছে short যে এক ব্যবহার করতে পারেন

[]oq`<code>`Ri

একটি যথাযথ দ্বি-যুক্তি ফাংশন কল হিসাবে বেশ সুন্দর ছিল।

ব্যাখ্যা:

,#,#                             Read in two arguments, break them into lists of chars
    `                       `;╗ƒ put the quoted function in reg0 and immediately call it
     k;;;                        put the two lists in a list and make 3 copies
         ░                       replace the latter two with one with empty lists removed
          =                      replace two more with 1 if no empty lists removed, else 0
           "..."£@"..."£@        push the two functions described below, moving 
                                 the boolean above them both
                         I       select the correct function based on the condition
                          Ri     call the function, returning the correct distance
                                 for these substrings

   There are two functions that can be called from the main function above. Each expects 
   two strings, i and j, to be on the stack. This situation is ensured by putting 
   those strings in a list and using R to call the functions with that list as the stack.
   The first is very simple:

+l                             Concatenate the strings and take their length.
                               This is equivalent to the length of the longer
                               string, since one of the strings will be empty.

   The second function is very long and complicated. It will do the "insertion, deletion, 
   substitution" part of the recursive definition. Here's what happens in 4 parts:

│d);)                          After this, the stack is top[i-,j,i,j,ci,i-], where i- is 
                               list i with its last character, ci, chopped off.
     []oq                      this puts i- and j into a list so that they can be passed
                               as arguments recursively into the main function
         ╜Riu                  this calls the main function (from reg0) with the args
                               which will return a number to which we add 1 to get #d,
                               the min distance if we delete a character
)@d);)@                        After this, the stack is top[i,j-,ci,i-,#d,cj,j-], where 
                               j- and cj are the same idea as i- and ci
       []oq╜Riu                listify arguments, recurse and increment to get #i
                               (distance if we insert)
(@)@)@                         After this, the stack is top[i-,j-,#d,cj,#i,ci]
      []oq╜Ri                  listify arguments, recurse to get min distance between 
                               them but we still need to add 1 when we'd need to 
                               substitute because the chars we chopped off are different
(((@)                          After this, the stack is top[cj,ci,#s,#d,#i]
     =Y                        1 if they are not equal, 0 if they are
       +                       add it to the distance we find to get the distance
                               if we substitute here
        k                      put them all in a list
         m                     push the minimum distance over the three options

আমি পছন্দ করি যে কোডটি কীভাবে প্রাক-উপাদানটি থেকে পালানোর চেষ্টা করে :)
ম্যাক্সোমাτ

3

পাইথন 3, 267 216 184 162 বাইট

এই ফাংশনটি 2 x len(word_2)+1আকারে থাকা একটি অ্যারের ব্যবহার করে লেভেনস্টাইন দূরত্ব গণনা করে ।

সম্পাদনা: এটি উইলেমের পাইথন 2 উত্তরের নিকটবর্তী হয় না, তবে এখানে এবং সেখানে অনেকগুলি স্বল্প পরিমার্জন সহ আরও গল্ফযুক্ত উত্তর।

def e(p,q):
 m=len(q);r=range;*a,=r(m+1);b=[1]*-~m
 for i in r(len(p)):
  for j in r(m):b[j+1]=1+min(a[j+1],b[j],a[j]-(p[i]==q[j]))
  a,b=b,[i+2]*-~m
 return a[m]

Ungolfed:

def edit_distance(word_1,word_2):
    len_1 = len(word_1)
    len_2 = len(word_2)
    dist = [[x for x in range(len_2+1)], [1 for y in range(len_2+1)]]
    for i in range(len_1):
        for j in range(len_2):
            if word_1[i] == word_2[j]:
                dist[1][j+1] = dist[0][j]
            else:
                deletion = dist[0][j+1]+1
                insertion = dist[1][j]+1
                substitution = dist[0][j]+1
                dist[1][j+1] = min(deletion, insertion, substitution)
        dist[0], dist[1] = dist[1], [i+2 for m in range(len_2+1)]
    return dist[0][len_2]

3

রেটিনা , 78 72 বাইট

&`(.)*$(?<!(?=((?<-4>\4)|(?<-1>.(?<-4>)?))*,(?(4),))^.*,((.)|(?<-1>.))*)

এটি অনলাইন চেষ্টা করুন!

একরকম, এটি একটি খাঁটি রেইগেক্স সমাধান যেখানে ফলাফলটি সেই অবস্থানের সংখ্যা যা থেকে রেজেক্সের সাথে মেলে। কারণ কেন ...

যথাযথ সতর্কতা, এটি সুপার অদক্ষ। যেভাবে এটি কাজ করে তা হ'ল এটি রিজেক্স ইঞ্জিনের ব্যাকট্র্যাকারটিতে প্রকৃত অপ্টিমাইজেশনকে অফলোড করে, যা কেবল সম্ভব কিছু সংখ্যক পরিবর্তন থেকে শুরু করে সংযোজন, মুছে ফেলা এবং বিকল্পগুলির সাথে স্ট্রিংগুলি মেলে না দেওয়া পর্যন্ত আরও একটিকে অনুমতি দেয় ব্রুট সমস্ত সম্ভাব্য প্রান্তিককরণকে বাধ্য করে ।

কিছুটা আরও বুদ্ধিমান সমাধানের জন্য, এটি একবারে মিলছে এবং এতে কোনও নেতিবাচক চেহারা নেই। এখানে, ফলাফলটি গ্রুপে ক্যাপচারের সংখ্যা 2, যা আপনি match.Groups[2].Captures.Countসি # তে অ্যাক্সেস করতে পারতেন । যদিও এটি এখনও মারাত্মকভাবে অক্ষম।

ব্যাখ্যা

আমি উপরের দ্বিতীয় সংস্করণটি ব্যাখ্যা করছি, কারণ এটি ধারণাগতভাবে কিছুটা সহজ (এটি কেবলমাত্র একটি একক রেজেক্স ম্যাচ হিসাবে)। এখানে একটি অদম্য সংস্করণ আমি গ্রুপগুলির নাম দিয়েছি (বা তাদের ক্যাপচার না করে তৈরি করেছি) এবং মন্তব্যগুলি যুক্ত করেছি। মনে রাখবেন যে চেহারাটির পিছনের অংশগুলি পিছন থেকে সামনের দিকে পড়তে হবে, তবে এর মধ্যে বিকল্পগুলি এবং চেহারাগুলির সামনে থেকে পিছনে পড়া উচিত। হ্যাঁ।

.+                      # Ensures backtracking from smallest to largest for next repetition
(?<ops>(?<distance>.))* # This puts the current attempted distances onto two different stacks,
                        # one to work with, and one for the result.
$                       # Make sure the lookbehind starts from the end.
(?<=                    # The basic idea is now to match up the strings character by character,
                        # allowing insertions/deletions/substitutions at the cost of one capture
                        # on <ops>. Remember to read from the bottom up.
  (?=                   # Start matching forwards again. We need to go through the other string
                        # front-to-back due to the nature of the stack (the last character we
                        # remembered from the second string must be the first character we check
                        # against in the first string).
    (?:
      (?<-str>\k<str>)  # Either match the current character against the corresponding one from
                        # the other string.
    |
      (?<-ops>          # Or consume one operation to...
        .               # consume a character without matching it to the other string (a deletion)
        (?<-str>)?      # optionally dropping a character from the other string as well 
                        # (a substitution).
      )
    )*                  # Rinse and repeat.
    ,(?(str),)          # Ensure we reached the end of the first string while consuming all of the 
                        # second string. This is only possible if the two strings can be matched up 
                        # in no more than <distance> operations.
  )
  ^.*,                  # Match the rest of string to get back to the front.
  (?:                   # This remembers the second string from back-to-front.
    (?<str>.)           # Either capture the current character.
  |
    (?<-ops>.)          # Or skip it, consuming an operation. This is an insertion.
  )*
)

-২-বাইট সংস্করণের একমাত্র পার্থক্য হ'ল আমরা পর্যাপ্ত অবস্থান নেই এবং .+যেখানে আমাদের পর্যাপ্ত পরিমাণ নেই সেই সমস্ত অবস্থান গণনা করে আমরা শীর্ষস্থানীয় (এবং প্রথম দিকে দ্বিতীয় গোষ্ঠীটি) বাদ দিতে পারি<ops>


3

হাস্কেল , 67 64 বাইট

e@(a:r)#f@(b:s)=sum[1|a/=b]+minimum[r#f,e#s,r#s]
x#y=length$x++y

এটি অনলাইন চেষ্টা করুন! ব্যবহারের উদাহরণ: "turing" # "tarpit"ফলন 4


ব্যাখ্যা (পূর্ববর্তী by 67 বাইট সংস্করণের জন্য)

e@(a:r)#f@(b:s)|a==b=r#s|1<3=1+minimum[r#f,e#s,r#s]
x#y=length$x++y

এটি একটি পুনরাবৃত্ত সমাধান। দুটি স্ট্রিং দেওয়া হয়েছে eএবং f, আমরা প্রথমে তাদের প্রথম অক্ষর aএবং b। তারা সমান হন, তাহলে Levenshtein দূরত্ব eএবং fএর Levenshtein দূরত্ব হিসাবে একই rএবং s, বাকি eএবং fপ্রথম অক্ষর মুছে ফেলার পর। অন্যথায়, হয় aবা bঅপসারণ করা প্রয়োজন, বা একটি অন্য দ্বারা প্রতিস্থাপিত হয়। [r#f,e#s,r#s]এই তিনটি ক্ষেত্রে পুনরাবৃত্তভাবে লেভেনস্টাইন গণনা করে, সবচেয়ে ছোটটিকে minimumবেছে নেয় এবং 1প্রয়োজনীয় অপসারণ বা প্রতিস্থাপনের জন্য অ্যাকাউন্টে যোগ করা হয়।

যদি একটি স্ট্রিং খালি থাকে, তবে আমরা এবং দ্বিতীয় লাইনে থাকি। এই ক্ষেত্রে, দূরত্বটি খালি নয় খালি স্ট্রিংয়ের দৈর্ঘ্য বা সমানভাবে উভয় স্ট্রিংয়ের দৈর্ঘ্য একসাথে একত্রিত হয়।


1
বাহ, এটি একটি গুরুতর উত্তম সমাধান, সত্যই মার্জিত এবং সংক্ষিপ্ত।
জিজিপিটি

3

পাইথন 3 , 105 94 93 বাইট

Xnor দ্বারা -11 বাইট

l=lambda a,b:b>""<a and min(l(a[1:],b[1:])+(a[0]!=b[0]),l(a[1:],b)+1,l(a,b[1:])+1)or len(a+b)

উপর সবচেয়ে কম প্রয়োগের Golfed সংস্করণ উইকিবই

এটি অনলাইন চেষ্টা করুন!


সুন্দর সমাধান। l=চাহিদা অন্তর্ভুক্ত সংখ্যাত কারণ ফাংশন recursive এবং করা হবে। আপনি বেসগুলির কেসগুলিতে একত্রিত করতে পারেন if b>""<a else len(a+b)
xnor

অপারেটরদের সাথে দুর্দান্ত খেলা, থেক্স!
মোভাটিকা

2

হাস্কেল, 136 বাইট

কল করুন e। বিট উপর ধীর antidisestablishmentarianismইত্যাদি

l=length
e a b=v a(l a)b(l b)
v a i b j|i*j==0=i+j|0<1=minimum[1+v a(i-1)b j,1+v a i b(j-1),fromEnum(a!!(i-1)/=b!!(j-1))+v a(i-1)b(j-1)]

2

জल्फ, 4 বাইট

এখানে চেষ্টা করুন!

~LiI
~L   calculate the Levenshtein distance of
  i   input string
   I  and another input string

আমি গতকাল এই বিল্টিনকে যুক্ত করেছি, তবে আজ এই চ্যালেঞ্জটি দেখেছি, ঠিক এখনই। তবুও, এই উত্তরটি অপ্রকাশ্য।

আরও নতুন সংস্করণে:

~Li

অন্তর্নিহিত দ্বিতীয় ইনপুট লাগে।


" । আপনার কোড একটি প্রোগ্রাম বা ফাংশন এটি একটি নামে ফাংশন হতে হবে উচিত না, কিন্তু এটা একটি বিল্ট-ইন ফাংশন যা সরাসরি Levenshtein দুরত্ব গণনা হতে পারে না অন্য বিল্ট-ইন অনুমতি দেওয়া হয়।। "
কেভিন Cruijssen

আহ, আপনি এটি উল্লেখ করেছেন যে এটি অ-প্রতিযোগিতামূলক বলে উল্লেখ করেছে .. এটি শিরোনামে রাখা ভাল, বা বিল্টিন ছাড়া কোনও বৈধ প্রোগ্রাম / ফাংশন যুক্ত করুন।
কেভিন ক্রুইজসেন

2

জিএনইউ প্রোলগ, 133 বাইট

m([H|A],B):-B=A;B=[H|A].
d([H|A]-[H|B],D):-d(A-B,D).
d(A-B,D):-A=B,D=0;D#=E+1,m(A,X),m(B,Y),d(X-Y,E).
l(W,D):-d(W,D),(E#<D,l(W,E);!).

যুক্তি হিসাবে একটি tuple লাগে। ব্যবহারের উদাহরণ:

| ?- l("turing"-"tarpit",D).

D = 4

yes

mনির্দিষ্ট করে Bহয় Aহয় সরাসরি বা তার প্রথম অক্ষর দিয়ে সরানো হয়েছে। dব্যবহারসমূহ mএকটি সাবরুটিন যেমন গণনা করতে একটি tuple উপাদানের মধ্যে সম্পাদন করা দূরত্ব (সম্পাদনাগুলি একটি সিরিজ দূরত্ব অর্থাৎ যে ধর্মান্তরিত অপরের মধ্যে এক)। তারপরে lসর্বনিম্ন সন্ধানের জন্য একটি স্ট্যান্ডার্ড ট্রিক d(আপনি একটি স্বেচ্ছাসেবী দূরত্ব গ্রহণ করেন, তারপরে একটি স্বেচ্ছাসেবী ছোট দূরত্ব নিন, আপনি ছোট না হওয়া পর্যন্ত পুনরাবৃত্তি করুন)।


1

পার্ল, 168 166 163 বাইট

sub l{my($S,$T,$m)=(@_,100);$S*$T?do{$m=++$_<$m?$_:$m for l($S-1,$T),l($S,--$T),l(--$S,$T)-($a[$S]eq$b[$T]);$m}:$S||$T}print l~~(@a=shift=~/./g),~~(@b=shift=~/./g)

পুনরাবৃত্তিমূলক বাস্তবায়ন। একটি file.plহিসাবে সংরক্ষণ করুন এবং হিসাবে চালানো perl file.pl atoll bowl

sub l {
    my($S,$T,$m)=(@_,100);

    $S*$T
    ? do {
        $m = ++$_ < $m ? $_ : $m
        for
            l($S-1,   $T),
            l($S  , --$T),
            l(--$S,   $T) - ($a[$S] eq $b[$T])
        ;    
        $m
    }
    : $S||$T
}
print l~~(@a=shift=~/./g),~~(@b=shift=~/./g)


অন্য দুটি বাস্তবায়ন উভয়ই দীর্ঘতর (পূর্ণ ম্যাট্রিক্স: 237 বাইট, দুটি এক-সারি পুনরাবৃত্ত: 187)।

  • আপডেট 166 : ()কলিং বাদ l
  • আপডেট 163 : ট্রাইনারি মধ্যে আপত্তি returnদ্বারা doদূরীকরণ।


0

সি, 192 বাইট

#define m(x,y) (x>y?x:y)
#define r(x,y) l(s,ls-x,t,lt-y)
int l(char*s,int ls,char*t,int lt){if(!ls)return lt;if(!lt)return ls;a=r(1,1);if(s[ls]==t[ls])return a;return m(m(r(0,1),r(1,0)),a)+1;}
---------

বিশদ

#include <stdio.h>

#define m(x,y) (x>y?x:y)
#define f(x) char x[128];fgets(x,100,stdin)
#define r(x,y) l(s,ls-x,t,lt-y)

int l(char*s,int ls,char*t,int lt)
{
    if(!ls) return lt;
    if(!lt) return ls;

    int a = r(1,1);
    if(s[ls]==t[ls]) return a;

    return m(m(r(0,1),r(1,0)),a)+1;
}

int main(void)
{
    f(a);
    f(b);
    printf("%d", l(a,strlen(a),b,strlen(b)));
    return 0;
}

0

সি #, 215 210 198

public int L(string s,string t){int c,f,a,i,j;var v=new int[100];for(c=i=0;i<s.Length;i++)for(f=c=i,j=0;j<t.Length;j++){a=c;c=f;f=i==0?j+1:v[j];if(f<a)a=f;v[j]=c=s[i]==t[j]?c:1+(c<a?c:a);}return c;}

আরও পঠনযোগ্য:

public int L(string s,string t){
    int c,f,a,i,j;
    var v=new int[100];
    for(c=i=0;i<s.Length;i++)
        for(f=c=i,j=0;j<t.Length;j++){
            a=c;
            c=f;
            f=(i==0)?j+1:v[j];
            if (f<a) a=f;
            v[j]=c=(s[i]==t[j])?c:1+((c<a)?c:a);
        }
    return c;
}

0

পাওয়ারশেল v3 +, 247 বাইট

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

এলডি'র সাথে জড়িত অন্য চ্যালেঞ্জগুলি সমাধান করার জন্য আমি এটি শেষ করেছি।

মন্তব্য সহ কোড ব্যাখ্যা।

# Get both of the string passed as arguments. $c being the compare string
# and $d being the difference string. 
$c,$d=$args

# Save the lengths of these strings. $e is the length of $c and $f is the length of $d
$e,$f=$c,$d|% le*

# Create the multidimentional array $m for recording LD calculations
$m=[object[,]]::new($f+1,$e+1)

# Populate the first column 
0..$e|%{$m[0,$_]=$_}

# Populate the first row
0..$f|%{$m[$_,0]=$_}

# Calculate the Levenshtein distance by working through each position in the matrix. 
# Working the columns
1..$e|%{
    # Save the column index for use in the next pipeline
    $i=$_

    # Working the rows.
    1..$f|%{
        # Calculate the smallest value between the following values in the matrix relative to this one
        # cell above, cell to the left, cell in the upper left. 
        # Upper left also contain the cost calculation for this pass.    
        $m[$_,$i]=(($m[($_-1),$i]+1),($m[$_,($i-1)]+1),($m[($_-1),($i-1)]+((1,0)[($c[($i-1)]-eq$d[($_-1)])]))|sort)[0]
    }
}
# Return the last element of the matrix to get LD 
$m[$f,$e]

0

জাভাস্ক্রিপ্ট (ES6),  95 91  89 বাইট

হিসাবে ইনপুট লাগে (source)(target)। মূলত @ উইলেমের পাইথন উত্তরের একটি বন্দর (পরে @ ফ্লিপট্যাক দ্বারা অনুকূলিত )।

s=>t=>(g=m=>m*n?1+Math.min(g(m,--n),g(--m)-(s[m]==t[n++]),g(m)):m+n)(s.length,n=t.length)

এটি অনলাইন চেষ্টা করুন!

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