एक पश्चगामी संबंध


10

एक प्रोग्राम या फ़ंक्शन लिखें, जो दो ASCII स्ट्रिंग्स दिए गए हैं Aऔर B, स्ट्रिंग्स का उत्पादन करेंगे A'और B'जहां आम सबस्ट्रिंग उनके स्थान पर उलट हैं। खोजने की प्रक्रिया A'इस प्रकार है:

  1. A' शुरू में खाली है।
  2. यदि पहला वर्ण Aअंदर है B, तो सबसे लंबा उपसर्ग खोजें, Aजिसका एक विकल्प है B। इस उपसर्ग को निकालें Aऔर इसके उलट जोड़ें A'
  3. अन्यथा, इस पहले पात्र को इसमें से निकालें Aऔर इसमें जोड़ें A'
  4. Aखाली होने तक 2-3 चरण दोहराएं ।

खोजने के B'समान किया जाता है।

उदाहरण

चलो स्ट्रिंग्स पर विचार करें A = "abc bab"और B = "abdabc"। इसके लिए A', ऐसा होता है:

  • A = "abc bab": पहला वर्ण "a"B में है और A में सबसे लंबा उपसर्ग है जो B में पाया जाता है "abc"। हम इस उपसर्ग को A से हटाते हैं और इसके उलट A को जोड़ते हैं "cba"
  • A = " bab": पहला वर्ण " "B में नहीं है, इसलिए हम इस वर्ण को A से निकालकर A में जोड़ देते हैं।
  • A = "bab": पहला वर्ण "b"B में है और A में सबसे लंबा उपसर्ग है जो B में पाया जाता है "b"। हम इस उपसर्ग को ए से हटाते हैं और इसके उत्क्रमण (जो अभी भी है "b") को ए 'में जोड़ते हैं ।
  • A = "ab": पहला वर्ण "a"B में है और A में सबसे लंबा उपसर्ग है जो B में पाया जाता है "ab"। हम इस उपसर्ग को A से हटाते हैं और इसके उलट A को जोड़ते हैं "ba"
  • A = "": A खाली है, इसलिए हम रुक जाते हैं।

इस प्रकार हम प्राप्त करते हैं A' = "cba" + " " + "b" + "ba" = "cba bba"। बी 'के लिए, प्रक्रिया समान है:

B = "abdabc"  ->  "a" in A, remove prefix "ab"
B = "dabc"    ->  "d" not in A, remove "d"
B = "abc"     ->  "a" in A, remove prefix "abc"

इस प्रकार हम प्राप्त करते हैं B' = "ba" + "d" + "cba" = "badcba"

अंत में, हम दो तारों को लौटाते हैं, अर्थात

(A', B') = ("cba bba", "badcba")

परीक्षण के मामलों

"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"

बाइट्स में सबसे छोटा कोड जीतता है।


क्या हम मानते हैं कि सभी इनपुट ASCII से कम है? क्या "cba bba", "badcba"उद्धरण और कॉमा को शामिल करने के लिए सटीक आउटपुट की उम्मीद है ?
AdmBorkBork

@TimmyD सटीक इनपुट / आउटपुट प्रारूप आपकी पसंद है। आप यह नहीं मान सकते हैं कि इनपुट ASCII से कम है - यह किसी भी मुद्रण योग्य ASCII हो सकता है।
20

क्या खाली स्ट्रिंग एक कानूनी इनपुट है?
MtnViewMark

@MtnViewMark हाँ।
orlp

जवाबों:



2

हास्केल, 120 111 बाइट्स

import Data.List
a&b=(a#b,b#a)
[]#_=[]
(a:y)#b=[a]%y where p%(i:w)|reverse(i:p)`isInfixOf`b=(i:p)%w;p%x=p++x#b

टेस्ट रन:

λ: "abc bab"&"abdabc"
("cba bba","badcba")

λ: "abcde"&"abcd bcde"
("dcbae","dcba edcb")

λ: "hello test"&"test banana"
("hello tset","tset banana")

λ: "birds flying high"&"whistling high nerds"
("bisdr flyhgih gni","wihstlhgih gni nesdr")

1

एसडब्ल्यूआई-प्रोलॉग, 312 बाइट्स

a(A,B,X,Y):-b(A,B,"",X),b(B,A,"",Y).
b(A,B,R,Z):-A="",R=Z;sub_string(A,0,1,_,C),(sub_string(B,_,1,_,C),(string_length(A,J),I is J-1,between(0,I,K),L is J-K,sub_string(A,0,L,_,S),sub_string(B,_,L,_,S),string_codes(S,E),reverse(E,F),string_codes(Y,F));S=C,Y=C),string_concat(S,V,A),string_concat(R,Y,X),b(V,B,X,Z).

उदाहरण: a("birds flying high","whistling high nerds",X,Y).आउटपुट

X = "bisdr flyhgih gni",
Y = "wihstlhgih gni nesdr" .

एक तरीका, जिस तरह से बहुत लंबा समाधान भी कैसे दिखाने वर्बोज़ Prolog है जब तार के साथ काम कर चला जाता है कि। `birds flying high`स्ट्रिंग्स ( "birds flying high") के बजाय कोड सरणियों ( ) का उपयोग करके इस चीज़ को छोटा करना संभव हो सकता है ।


1

पायथन 2.7, 169 156 152 141 बाइट्स

m=lambda A,B:(b(A,B),b(B,A))
def b(A,B,C=''):
 while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
 return C

फ़ंक्शन mइनपुट के रूप में 2 स्ट्रिंग्स लेता है। यह bफ़ंक्शन को दो बार कॉल करता है जो चश्मा के अनुसार वास्तविक प्रसंस्करण करता है।
यहां डेमो करें
इसका परीक्षण -

l=[("abc bab", "abdabc"),
("abcde", "abcd bcde"),
("hello test", "test banana"),
("birds flying high", "whistling high nerds")]
for e in l:
    print m(*e)

आउटपुट:

('cba bba', 'badcba')
('dcbae', 'dcba edcb')
('hello tset', 'tset banana')
('bisdr flyhgih gni', 'wihstlhgih gni nesdr')

पुनश्च: समाधान का उपयोग करने के लिए orlp के लिए धन्यवाद next()


m=lambda A,B:(b(A,B),b(B,A))
orlp

इसके अलावा आप while len(A)>0बस के साथ बदल सकते हैं while A। इसी तरह if len(p)>0बन जाता है if p
orlp

if len(p)भी हो सकता है if p। (पहले से ही ऊपर कहा गया है, लेकिन आप इसे याद किया।)
mbomb007

@ mbomb007 ने इसे ठीक से नहीं पढ़ा। बस को बदल दिया len(p)>0गया len(p)। इसके लिए धन्यवाद :)
कमेहामे

और भी छोटा while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]:।
orlp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.