একটি পিছনের সম্পর্ক


10

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা দুটি এএসসিআইআই স্ট্রিং দেওয়া থাকে 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"বি এবং একটি দীর্ঘতম উপসর্গ বি পাওয়া যায় "abc"। আমরা এ উপসর্গটি এ থেকে সরিয়েছি এবং এর বিপরীতটি "cba"'এ' তে যুক্ত করব।
  • A = " bab": প্রথম চরিত্রটি " "বি তে নেই, সুতরাং আমরা এই চরিত্রটিকে এ থেকে সরিয়ে এ 'এ যুক্ত করব।
  • A = "bab": প্রথম অক্ষর "b"বি এবং একটি দীর্ঘতম উপসর্গ বি পাওয়া যায় "b"। আমরা এ উপসর্গটি এ থেকে সরিয়েছি এবং এর বিপরীতটি (যা এখনও রয়েছে "b") এ 'তে যুক্ত করি।
  • A = "ab": প্রথম অক্ষর "a"বি এবং একটি দীর্ঘতম উপসর্গ বি পাওয়া যায় "ab"। আমরা এ উপসর্গটি এ থেকে সরিয়েছি এবং এর বিপরীতটি "ba"'এ' তে যুক্ত করব।
  • 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"কোট এবং কমা অন্তর্ভুক্ত করার অনুরূপ ?
অ্যাডমবর্কবার্ক

@ টিমমিডি সঠিক ইনপুট / আউটপুট ফর্ম্যাটটি আপনার পছন্দ। আপনি অনুমান করতে পারবেন না যে ইনপুটটি ছোট হাতের ASCII - এটি কোনও মুদ্রণযোগ্য ASCII হতে পারে।
orlp

খালি স্ট্রিং কি আইনী ইনপুট?
এমটিএনভিউমার্ক

@ এমটিএনভিউমার্ক হ্যাঁ।
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" .

একটি উপায়, উপায় দীর্ঘ দীর্ঘ সমাধান যা খুব বেশি বোঝায় যে স্ট্রিংগুলির সাথে কাজ করার সময় ভার্বোজ প্রোলোগ কেমন হয়। `birds flying high`স্ট্রিং ( "birds flying high") এর পরিবর্তে কোড অ্যারে ( ) ব্যবহার করে এই জিনিসটি ছোট করা সম্ভব হতে পারে ।


1

পাইথন ২.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 টি স্ট্রিং নেয় t এটি 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')

PS: সমাধানটি ব্যবহার করে orlp ধন্যবাদ Thanks 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.