दो तारों के बीच न्यूनतम संपादित दूरी का पता लगाएं


13

व्याख्या

संपादित दूरी दो तार के बीच सम्मिलन, हटाए जाने, या खिलाड़ी को बदलने की न्यूनतम संभव संख्या के एक समारोह में एक और शब्द एक शब्द कन्वर्ट करने के लिए है।

सम्मिलन और विलोपन लागत 1, और प्रतिस्थापन 2 लागत।

उदाहरण के लिए, के बीच की दूरी ABऔर A1 है, क्योंकि विलोपन की लागत 1 है और केवल आवश्यक संपादन Bचरित्र का विलोपन है ।

के बीच की दूरी CARऔर FAR2 है, क्योंकि प्रतिस्थापन की लागत 2. यह देखने का एक और तरीका एक विलोपन और एक सम्मिलन है।

नियम

दिए गए दो इनपुट स्ट्रिंग्स (हालांकि आपकी भाषा में सुविधाजनक है), आपके प्रोग्राम को दो स्ट्रिंग्स के बीच न्यूनतम संपादन दूरी मिलनी चाहिए।

आप मान सकते हैं कि स्ट्रिंग्स में केवल वर्ण होते हैं A-Zऔर 100 से कम वर्ण और 0 से अधिक वर्ण होते हैं।

यह कोड गोल्फ है , इसलिए सबसे छोटा समाधान जीतता है।

नमूना परीक्षण मामले

ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8

मैंने एक बार अपने एल्गोरिदम क्लास में एक्सेल में ऐसा किया था। एक .xls दस्तावेज़ के रूप में परियोजना को चालू करने के लिए थोड़े मजेदार था। यह वास्तव में बहुत अच्छा काम किया। मैं देखूंगा कि क्या मैं इसे पा सकता हूं।
captncraig

PHP को इसे आसानी से जीतना चाहिए।
मई

@ st0le - levenshteinफ़ंक्शन में निर्मित प्रतिस्थापन को एक संपादन (स्थानापन्न) के रूप में मानते हैं, दो नहीं (हटाएं + डालें)।
श्री लामा

जवाबों:


7

ब्रेनफक, 2680

+>>>>>>>>>>>>>>>>>>>>>>++++++>,<[->-----<]>--[+++++++++++++++++++++
+++++++++++>>[->>+<<]>>+<<,--------------------------------]>>[-<<<
+>>>]<<<<[>[-<<+>>]<<<]>[-<<<<<+>>>>>]>[>>],----------[++++++++++>>
[->>+<<]>>+<<,----------]>>[-<<<+>>>]<<<<[>[-<<+>>]<<<]>[-<<+>>]<<[
-<+>>+<]<<<[->+<]>[-<+>>>>+<<<]>>>[-<+>]<[->+>+<<]<[-<+>]<[->+>+<<]
<[-<+>>+<]<[->+<]>>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>]<<[->>+
>+<<<]>>>[-<<<+>>>]<[->>+[->+>+<<]<<[->>+<<]>>]>>[-]<[<<]<<<+[->>>+
<<<]>>>[-<+<<+>>>]<<<<<[->>[->>>>[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>
+<<]>>>>]>>[->>>>+<<<<]>>>>[-<<<<+<<+>>>>>>]<<+[->>+<<]>>[-<<+<+>>>
]<<<<<<<<]>>[-]>>[-]>>[-]-[+<<-]+>>>>>>>>>>>>>>>>>[-<+>]<[->+<<<<+>
>>]<<<[->>>>>>[-<+>]<[->+<<<<+>>>]<<<<<<<[-]<<+>>>>>>[-<<<<+>>>>>>>
>>>[-<+>]<[->+>+<<]<<<<<<<<<[->+<]>[->>>>>>>>+<<<<<<<<<+>]<<<[->+<]
>[->>>>>>>>+<<<<<<<<<+>]>>>>>>>>>[-<<<<<+>>>>>]<<<<<[->>+>>>+<<<<<]
>>>>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>>>]<<<<<<+>>-
[-<<[-<<<<+>>>>]<<<<[->>+>>+<<<<]>>[->>>>>>[->>+<<]<<[->>+<<]<<[->>
+<<]<<[->>+<<]>>]>>>>]>>[->>+<<]>>[-<<+>>>>+<<]->>-[-[->>+<<]>>]>[-
>+<]>[-<+>>>+<<]<<<[->+<]>[-<+>>>+<<]+[->>[-<<+>>]>>[-<<+>>]<<<<<<+
]<<<<<<[->>>>>>+<<<<<<]>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<[->>>>+<<<<]
-<<[-]>>>>>>>>[-<<<<<<<<+>>>>>>>>]<<<<[->>[->>+<<]<<[->>+<<]>>]>>-[
-[->>+<<]>>]<[->+<]>[-<+>>>+<<]+[->>[-<<+>>]<<<<+]>>[-<<+>>]<<<<<<<
<-[+>>[-<<+>>]>>[-<<+>>]>>[-<<+>>]<<<<<<<<-]+>>>[-]<[->+<]>>>[-]<[-
>+<]>>>[-]<[->+<]>>>[->+<]>[-<+>>>>>>>>>>>>>+<<<<<<<<<<<<]>>>>>>>>>
>>>-[-[->>+<<]>>]>[->+<]>[-<+<+>>]<<<<-[+>>[-<<+>>]<<<<-]+>>[-<+>]>
>>>>>>>>[->+<]>[-<+>>>>>>>>>>>+<<<<<<<<<<]>>>>>[->+<]>[-<+>>>>>+<<<
<]>>>>-[-[->>+<<]>>]>[->+<]>[-<+<+>>]<<<<-[+>>[-<<+>>]<<<<-]+>[->-<
]>[-<[-]+>]<[->>>+<<<]>>>[-<<+<+>>>]<<-[+>[->+<]<]<[->>+<-[[-]>[->+
<]>[-<+>>>+<<]+>>[-<<[-]>>]<[->+<]>[-<+>>>+<<]+>>[-<<[-]>>]<[->+<]>
[-<+>>>+<<]+>>[-<<[-]>>]<<[-<<[-]+>>]<<[-<<[-]+>>]<<[-<<[-]+>>]<<<+
>->->>->>-<<<<<]<[->+<]]>[-<+>]>>[-<<<+>>>]<<<[->>>>>>>>>>>>>+<<<<<
<<<<<<<<]>>>>>>>>[->+<]>[-<+>>>>>>>>>+<<<<<<<<]>[->+<]>[-<+>>>>>>>>
>+<<<<<<<<]>>>>>>>>>[->>>+<<<]>>>[-<<+<+>>>]<<<<<[->>>>>+<<<<<]>>>>
>[-<<<<<+<<<+>>>>>>>>]<<<<<<<<+>>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]
<<[->>+<<]<<[->>+<<]>>>>>>>>>>]<<<<[-<<[-<<<<<<+>>>>>>]<<<<<<[->>+>
>>>+<<<<<<]>>[->>>>>>>>[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>+<<]<<[->>
+<<]>>]>>>>>>]<<[-]<<[->>>>+<<<<]>>>>>>[-[->>+<<]<<[->>+<<]>>>>]<<[
->>>>>+<<<<<]-[+<<-]+>>>>>>>>>>>>>>>]<<]>>>>>>>>[->+<]<<[->+<]<<[->
+<]>>>>>[-[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>]<<<<[->>[->>>>+<<<<]>>
>>[-<<+<<+>>>>]<<+[-[->>+<<]<<[->>+<<]<<[->>+<<]>>>>>>]<<<<]>>[-[->
>+<<]>>]>>>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>>>[->-[>+>>]>
[+[-<+>]>+>>]<<<<<]>[-]<++++++[->++++++++[->+>+<<<<+>>]<]>>>.<.<<<.

गतिशील प्रोग्रामिंग का उपयोग करना, बिल्कुल।

इनपुट स्ट्रिंग्स को एक स्थान से अलग किया जाना चाहिए, और उसके बाद एक नई लाइन। उदाहरण के लिए:

INTENTION EXECUTION
008

1
अच्छी तरह से गठबंधन और बहुत पठनीय - मुझे यह पसंद है, +1!
थॉमस

क्या यह कंप्यूटर की भाषा है? : O

यह इस प्रश्न के लिए सबसे भ्रमित करने वाला सबमिशन है ... +1 क्योंकि यह BF है।
हाइपरएनुट्रिनो

5

अजगर, 138 148 152 वर्ण

ठीक है, मैं सिद्धांत जानता था, लेकिन इससे पहले कभी संपादित दूरी को लागू नहीं किया था, इसलिए यहाँ जाता है:

x,y=raw_input().split()
d=range(99)
for a in x:
 c=d;d=[d[0]+1]
 for b,p,q in zip(y,c[1:],c):d+=[min(d[-1]+1,p+1,q+2*(a!=b))]
print d[-1]

4

PHP, 40

नियमों के अनुसार कहा गया है, लेकिन नियमों की भावना नहीं:

<?=levenshtein($argv[1],$argv[2],1,2,1);

यह तर्क के रूप में दो पैरामीटर लेता है। उदाहरण कॉलिंग php edit_dist.php word1 word2:।
आम तौर levenshtein()पर एक प्रतिस्थापन को एक ऑपरेशन के रूप में माना जाता है, लेकिन इसका एक अतिभारित रूप होता है जहां सम्मिलित / उप / हटाए गए वज़न निर्दिष्ट किए जा सकते हैं। इस मामले में, इसका 1/2/1।


3

एपीएल (90 अक्षर)

⊃⌽({h←1+c←⊃⍵⋄d←h,1↓⍵⋄h,(⊂⍵){y←⍵+1⋄d[y]←⍺{h⌷b=⍵⌷a:⍵⌷⍺⋄1+d[⍵]⌊y⌷⍺}⍵}¨⍳x}⍣(⊃⍴b←,⍞))0,⍳x←⍴a←,⍞

मैं अपने इंटरप्रेटर के रूप में डायलाग एपीएल का उपयोग कर रहा हूं, ⎕IO1 पर ⎕MLसेट और 0. पर सेट करता हूं । प्रत्यक्ष फ़ंक्शन ( { ... }) गणना करता है, इनपुट के रूप में एक पंक्ति दी जाती है, दूरी मैट्रिक्स में अगली पंक्ति। (यह प्रारंभिक पंक्ति के साथ शुरू किया गया है 0,⍳x:।) पावर ऑपरेटर ( ) का उपयोग दूसरी स्ट्रिंग में प्रत्येक वर्ण के लिए फ़ंक्शन को एक बार घोंसला बनाने के लिए किया जाता है ( ⊃⍴b)। उस सब के बाद, अंतिम पंक्ति उलट ( ) है, और इसका पहला तत्व लिया गया है ( )।

उदाहरण:

      ⊃⌽({h←1+c←⊃⍵⋄d←h,1↓⍵⋄h,(⊂⍵){y←⍵+1⋄d[y]←⍺{h⌷b=⍵⌷a:⍵⌷⍺⋄1+d[⍵]⌊y⌷⍺}⍵}¨⍳x}⍣(⊃⍴b←,⍞))0,⍳x←⍴a←,⍞
LOCKSMITH
BLACKSMITH
3
      ⊃⌽({h←1+c←⊃⍵⋄d←h,1↓⍵⋄h,(⊂⍵){y←⍵+1⋄d[y]←⍺{h⌷b=⍵⌷a:⍵⌷⍺⋄1+d[⍵]⌊y⌷⍺}⍵}¨⍳x}⍣(⊃⍴b←,⍞))0,⍳x←⍴a←,⍞
GATTTGTGACGCACCCTCAGAACTGCAGTAATGGTCCAGCTGCTTCACAGGCAACTGGTAACCACCTCATTTGGGGATGTTTCTGCCTTGCTAGCAGTGCCAGAGAGAACTTCATCATTGTCACCTCATCAAAGACTACTTTTTCAGACATCTCCTGTAG
AAGTACTGAACTCCTAATATCACCAATTCTTCTAAGTTCCTGGACATTGATCCGGAGGAGGATTCGCAGTTCAACATCAAGGTAAGGAAGGATACAGCATTGTTATCGTTGTTGAGATATTAGTAAGAAATACGCCTTTCCCCATGTTGTAAACGGGCTA
118

3

आर 51

यह उपयोगकर्ता से दो पंक्तियों में पढ़ता है (जो इनपुट हैं) और फिर adistदूरी की गणना करने के लिए फ़ंक्शन का उपयोग करता है । चूँकि इस समस्या के लिए प्रतिस्थापन लागत 2 है इसलिए हमें एडिस्ट के लिए लागत पैरामीटर के लिए एक नामित वेक्टर जोड़ना होगा। चूंकि एडिस्ट के लिए एक काउंट पैरामीटर भी है, इसलिए हम केवल लागत को कम कर सकते हैं इसलिए हमारे पास अभी भी पैरामीटर नामों के लिए एक अनूठा मैच है।

x=readLines(n=2);adist(x[1],x[2],cos=c(i=1,d=1,s=2))

उदाहरण का उपयोग करें

> x=readLines(n=2);adist(x[1],x[2],cos=c(i=1,d=1,s=2))
MART
KARMA
     [,1]
[1,]    5

0

रूबी 1.9, 124

l=->a,b{a[0]?b[0]?[(a[0]==b[0]?-1:1)+l[a[1..-1],b[1..-1]],l[a[1..-1],b],l[a,b[1..-1]]].min+1: a.size: b.size}
puts l[*ARGV]

यहां धीमी, पुनरावर्ती रूबी विधि का गोल्फ संस्करण, प्रतिस्थापन के लिए वजन दोगुना करने के लिए संशोधित किया गया है। तथ्य यह है कि एक स्ट्रिंग के पहले चरित्र को हटाने के लिए 7 अक्षर लगते हैं वास्तव में दर्द होता है, और यह (a[0]==b[0]?-1:1)कुछ के साथ बदलने के लिए अच्छा होगा, -1**a[0]<=>b[0]लेकिन संचालन का क्रम मेरा दोस्त नहीं है।


0

स्मॉलटॉक (स्मॉलटाक / एक्स), 34

मैं भाग्यशाली हूँ - मानक "स्ट्रिंग" वर्ग में पहले से ही लेवेंसहाइट हैं:

इनपुट ए, बी:

a levenshteinTo:b s:2 k:2 c:1 i:1 d:1

(अतिरिक्त पैरामीटर प्रतिस्थापन, विलोपन आदि पर अलग-अलग भार के लिए अनुमति देते हैं)

परीक्षण चालन:

#( 'ISLANDER'  'SLANDER' 
   'MART'      'KARMA'   
   'KITTEN'    'SITTING' 
   'INTENTION' 'EXECUTION'  
) pairWiseDo:[:a :b|
    a print. ' ' print. b print. ' ' print.
    (a levenshteinTo:b
            s:2 k:2 c:1 i:1 d:1) printCR.
].

->

ISLANDER SLANDER 1
MART KARMA 5
KITTEN SITTING 5
INTENTION EXECUTION 8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.