কোনও স্ট্রিং দুটি যমজ সন্তানের পরিবর্তন কিনা তা পরীক্ষা করুন


10

ব্যাখ্যা

দুটি স্ট্রিং তাদের অক্ষরকে ছেদ করে একটি নতুন স্ট্রিং গঠনের জন্য পরিবর্তন করা যেতে পারে, যেমন দুটি পাইল কার্ডের মতো একটি পাইল গঠনে পরিবর্তন করা যায়।

উদাহরণস্বরূপ, স্ট্রিংগুলি HELLOএবং WORLDরূপান্তরিত হতে পারে HWEOLRLLOD, বা HEWORLLLDO, বা সম্ভবত সহজভাবে HELLOWORLD

এটা না একটি এলোমেলো যদি চিঠির মূল অর্ডার সংরক্ষিত নয়। উদাহরণস্বরূপ, এলোমেলো হওয়ার পরে Dইন WORLDকখনই উপস্থিত হতে পারে না R। এর অর্থ হ'ল EHLLOWRDLO, উদাহরণস্বরূপ, এটি কোনও বদল নয় HELLOএবং WORLDযদিও এটিতে সমস্ত মূল অক্ষর রয়েছে contains

দুটি স্ট্রিং দুটি অভিন্ন স্ট্রিং দিয়ে শফলিং করে তৈরি করা যেতে পারে যদি স্ট্রিং হ'ল যমজদের শ্যাফেল । উদাহরণস্বরূপ, ABACBDECDEযমজ সন্তানের একটি সাফল্য কারণ এটি পরিবর্তন ABCDEএবং দ্বারা গঠিত হতে পারে ABCDEDBEACBCADEযমজদের বদল নয় কারণ এটি দুটি অভিন্ন স্ট্রিং বদল করে তৈরি করা যায় না।

প্রোগ্রামের বিশদ

একটি ইনপুট স্ট্রিং দেওয়া হয়েছে, 0যদি এটি যমজদের কোনও ঝাঁকুনি না হয় তবে আউটপুট এবং যমজদের একটি শাফেল হলে যমজ দুটি স্ট্রিংগুলির মধ্যে একটি আউটপুট।

আপনি ধরে নিতে পারেন ইনপুট স্ট্রিংয়ের দৈর্ঘ্য চারটি থেকে বিশটির মধ্যে রয়েছে এবং এটি পুরোপুরি বড় হাতের বর্ণানুক্রমিক অক্ষরের সমন্বয়ে গঠিত। এটি 10 ​​মিনিটের মধ্যে বলুন, একটি যুক্তিসঙ্গত সময়ে চালাতে সক্ষম হওয়া উচিত।

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম সমাধানটি জয়ী হয়।

উদাহরণ I / O

> ABACBDECDE
ABCDE

> DBEACBCADE
0

> FFFFFF
FFF

> FFGGG
0

> ABBA
0

> AABB
AB

> AABAAB
AAB

আমার একটি উদাহরণ রয়েছে (গল্ফবিহীন) বাস্তবায়ন


উদাহরণস্বরূপ স্ট্রিং এফজিজি দৃser়তা লঙ্ঘন করে that the input string has a length inclusively between four and twenty charactersএবং আমাকে "কখনও ইউজার ইনপুটকে বিশ্বাস করবেন না!", "চশমা বিশ্বাস করবেন না!"
ব্যবহারকারী অজানা

@ ইউসারুননড এটি এত বিব্রতকর! FFGGGএটি ধারাবাহিক করতে আমি এটি সম্পাদনা করেছি ।
পিটার ওলসন

1
কৌতূহলের বাইরে, কেউ কি ক্ষুদ্রতর ক্ষণস্থায়ী খারাপ সময়ের সময়ের জটিলতার সাথে সমাধান নিয়ে আসতে পারে বা প্রমাণ করতে পারে যে এর কোনওটিই নেই?
ইলমারি করোনেন

উত্তর:


4

হাস্কেল, 114

main=getLine>>=putStrLn.f.p;f x=head$[a|(a,b)<-x,a==b]++["0"]
p[]=[([],[])];p(x:y)=do(a,b)<-p y;[(x:a,b),(a,x:b)]

Ungolfed:

main :: IO ()
main = getLine >>= putStrLn . findMatch . partitions

-- | Find the first partition where the two subsequences are
-- equal. If none are, return "0".
findMatch :: [(String, String)] -> String
findMatch ps = head $ [a | (a,b) <- ps, a == b] ++ ["0"]

-- | Return all possible partitions of the input into two
-- subsequences. Preserves the order of each subsequence.
--
-- Example:
-- partitions "AB" == [("AB",""),("B","A"),("A","B"),("","AB")]
partitions :: [a] -> [([a], [a])]
partitions []     = [([], [])]
partitions (x:xs) = do (a, b) <- partitions xs
                       [(x:a, b), (a, x:b)]

ব্যাখ্যা:

বেশিরভাগ কাজ partitionsফাংশনে করা হচ্ছে । এটি (a, b)তালিকার পুচ্ছের সমস্ত পার্টিশন পুনরাবৃত্তভাবে উত্পন্ন করে এবং তারপরে তালিকার মোনাড ব্যবহার করে xতাদের প্রত্যেকের প্রাথমিক উপাদানটি পুনরায় সরবরাহ করতে এবং সমস্ত ফলাফল সংগ্রহ করে।

findMatchএই তালিকাটি ফিল্টার করে কাজ করে যাতে কেবলমাত্র পার্টিশন যেখানে সাবকোয়েন্সগুলি সমান থাকে। এরপরে এটি প্রথম পার্টিশনে প্রথম অনুচ্ছেদটি দেয়। যদি কেউ না থেকে থাকে তবে তালিকাটি খালি রয়েছে, তাই শেষে "0"যুক্ত হওয়া পরিবর্তে ফিরে আসবে।

main কেবল ইনপুটটি পড়ে, এটিকে দুটি ফাংশন দিয়ে ফিড করে এবং মুদ্রণ করে।


আমাদের মধ্যে যারা হাস্কেল পড়তে পারে না, আপনি কি তার ব্যাখ্যা দেবেন?
মিঃ উইজার্ড

1
@ মিঃ উইজার্ড: সম্পাদনা দেখুন।
হামার

আমি মনে করি যে আমি মোটামুটি অনুরূপ কিছু নিয়ে এসেছি, যদিও এটি সংক্ষিপ্ত নয়, তবে আমি একটি নির্বোধের ধরণে ফেলেছিলাম যা এটি সম্পূর্ণ ব্যর্থ হয়ে গেছে। আমি যদি গাণিতিকায় এই অ্যালগরিদমটি প্রয়োগ করি তবে কি আপত্তি আছে?
মিঃ উইজার্ড

4

আর, 113 অক্ষর

l=length(x<-charToRaw(scan(,'')));max(apply(combn(l,l/2),2,function(i)if(all(x[i]==x[-i]))rawToChar(x[i])else 0))

অবহেলিত (এবং পরিবর্তে একটি ফাংশন যা স্ট্রিং নেয়):

untwin <- function(x) {
  x <- charToRaw(x)
  indMtx <- combn(length(x),length(x)/2)
  res <- apply(indMtx, 2, function(i) {
    if (all(x[i]==x[-i]))
      rawToChar(x[i])
    else
      0
  })
  max(res)
}

untwin("ABACBDECDE") # "ABCDE"
untwin("DBEACBCADE") # 0

সমাধানটি combnম্যাট্রিক্সের কলাম হিসাবে সূচকগুলির সমস্ত সংমিশ্রণ উত্পন্ন করে এমন ফাংশনের উপর নির্ভর করে । applyতারপরে 2ম্যাট্রিক্সের প্রতিটি কলামে (মাত্রা ) একটি ফাংশন প্রয়োগ করে এবং স্ট্রিং বা শূন্যগুলির একটি ভেক্টর প্রদান করে। maxতারপরে সবচেয়ে বড় স্ট্রিংটি খুঁজে নিন (যা 0 টি ট্রাম্প করে)।

আর এর একটি দুর্দান্ত বৈশিষ্ট্য হ'ল সূচকগুলির একটি ভেক্টর প্রদত্ত ভেক্টরের একটি উপসেট নির্বাচন করা এবং তারপরে সূচকগুলিকে উপেক্ষা করে সেই উপসেটটির পরিপূরক নির্বাচন করা :x[i] == x[-i]


কিছু বর্ধমান উন্নতি হয়েছে এবং চরের গণনা হ্রাস পেয়েছে।
টমি

3

গণিত, 87

এটি সরাসরি হামারের পোস্টের উপর ভিত্তি করে, তবে আশা করা যায় এটি মেধা পোস্ট করার পক্ষে যথেষ্ট স্বতন্ত্র।

<<Combinatorica`

f=Catch[Cases[Characters@#~KSetPartitions~2,{x_,x_}:>Throw[""<>x]];0]&

টেস্ট:

f /@ {"ABACBDECDE", "DBEACBCADE", "FFFFFF", "FGG", "ABBA", "AABB", "AABAAB"}
{"এবিসিডিই", ০, "এফএফএফ", ০, ০, "এবি", "এএবি"}

1

ডি

string c(string in,string a=[],string b=[]){
    if(in.length==0)return a==b?a;"0";
    auto r=c(in[1..$],a~in[0],b);
    return r=="0"?c(in[1..$],a,b~in[0]):r;
}
void main(){writeln(c(readline));}

গভীরতার প্রথম পুনরাবৃত্ত অনুসন্ধান অনুসন্ধান

আমি int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";গার্ড ক্লজ দিয়ে এটি আরও দ্রুত করতে পারি


আইডিয়নে, আমি প্রোগ্রামটি শুরু করার চেষ্টা করে ব্যর্থ হয়েছি void main(){writeln(c("ABCADABCAD"));}- ডি এর একটি ভিন্ন সংস্করণ, আমার দোষ, অন্য কিছু? "এবিসিবিসিএ" সম্পর্কে কী?
ব্যবহারকারী অজানা

আপনাকে std.stdio আমদানি করতে হবে; আইও
র‌্যাচেট ফ্রিকের জন্য

1

রুবি, 89 টি অক্ষর

s=->a,x,y{a=="\n"?x==y ?x:?0:[s[b=a[1..-1],x+c=a[0],y],s[b,x,y+c]].max}
$><<s[gets,'','']

এই কোডটি একটি সরল পুনরাবৃত্ত অনুসন্ধান অনুসন্ধান অ্যালগরিদম প্রয়োগ করে। ইনপুটটি অবশ্যই STDIN এ দেওয়া উচিত।


1

পার্ল, 68 টি অক্ষর

/^((.+)(?{local($x,$,)=($,,$x.$^N)}))+$(?(?{$o=$,eq$x&&$,})|x)/?$o:0

ইনপুট স্ট্রিংটি $_ভেরিয়েবল হিসাবে ধরে নেওয়া হয় , আউটপুটটি হ'ল এক্সপ্রেশনটির মান। ইনপুটটিতে ট্রেলিং করা নতুন লাইনগুলি উপেক্ষা করা হয়। আপনি এটি কমান্ড লাইন থেকে এটি চালাতে পারেন:

perl -lne 'print /^((.+)(?{local($x,$,)=($,,$x.$^N)}))+$(?(?{$o=$,eq$x&&$,})|x)/?$o:0'

এই কোডটি ব্যাকট্র্যাকিংয়ের জন্য পার্লের রেগজিপ ইঞ্জিন (এবং বিশেষত এর এমবেডেড কোড এক্সিকিউশন বৈশিষ্ট্য) ব্যবহার করে। মূলত, এটি ^((.+))+$রেজিপক্সের বিপরীতে ইনপুট স্ট্রিংয়ের সাথে মেলে, বিজোড় এবং এমনকি সংখ্যায়িত সাব-ম্যাচগুলিকে ট্র্যাক করে এবং এবং $xএবং $,দুটি সমান না হলে শেষ পর্যন্ত ম্যাচটি প্রত্যাখ্যান করে।


এর কি সঠিক ফলাফল রয়েছে AABAAB?
পিটার ওলসন

হ্যাঁ এটা করে. (প্রকৃতপক্ষে, AABAABএই সমাধানের জন্য একটি সহজ কেস, যেহেতু বাইরের গ্রুপের সাথে কেবল দু'বার ম্যাচ করা দরকার AABBright এটি
ডানটি

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