সংক্ষিপ্ত সাধারণ সুপারস্টারিং


26

স্ট্রিং প্রদত্ত একটি তালিকা s_0, s_1, ..., s_nসংক্ষিপ্ত স্ট্রিং এটি Sযে প্রতিটি ধারণ s_0, s_1, ..., s_nহিসেবে সাবস্ট্রিং

উদাহরণ :

  • S('LOREM', 'DOLOR', 'SED', 'DO', 'MAGNA', 'AD', 'DOLORE')='SEDOLOREMAGNAD'
  • S('ABCDE', 'BCD', 'C')='ABCDE'

সংক্ষিপ্ততম প্রোগ্রাম (বা ফাংশন) লিখুন যা এই সমস্যার সমাধান করে। আপনি চাইলে আপনি অ্যারে বা অক্ষর / পূর্ণসংখ্যার তালিকা হিসাবে স্ট্রিংগুলি উপস্থাপন করতে পারেন। স্ট্যান্ডার্ড লাইব্রেরি ঠিক আছে। ইনপুট / আউটপুট জন্য আপনি যে কোনও সুবিধাজনক তা ব্যবহার করতে পারেন: STDIN / STDOUT, ব্যবহারকারী প্রম্পট, পরামিতি / কোনও ফাংশনের রিটার্ন মান ইত্যাদি

পারফরম্যান্স সমালোচনাযোগ্য নয় - আসুন ধরা যাক, মোট দৈর্ঘ্যের <100 টি অক্ষরের ইনপুটের জন্য ফলাফলটি অবশ্যই আধুনিক আধুনিক হার্ডওয়্যারে <10 সেকেন্ডে গণনা করতে হবে।


3
+1 দুর্দান্ত প্রশ্ন। আমি আপনাকে প্রত্যাশিত ফলাফলের অতিরিক্ত কিছু উদাহরণ অন্তর্ভুক্ত করার পরামর্শ দিচ্ছি যাতে জমা দেওয়া লোকেরা বিভিন্ন ক্ষেত্রে পরিচালনা করতে সক্ষম কিনা তা সহজেই লোকেরা বিচার করতে পারে।
ডেভিডসি

কীভাবে ইনপুট / আউটপুট পরিচালনা করা উচিত? ফলাফলটি কোনও কার্য থেকে মুদ্রিত হওয়া বা ফিরে আসা উচিত?
ফ্লোরকোয়েন

সুতরাং, কোনও "প্রতিটি স্ট্রিংয়ের জন্য, যদি এতে সবগুলি থাকে ..., এটি ফিরিয়ে দিন" কোনও বৈধ সমাধান নয়?
জন ডিভোরাক

আমি সন্দেহ একটি উত্তর হতে চলেছে। এই প্রশ্নটি স্ট্যাক ওভারফ্লোতে (কোড-গল্ফ অংশ ব্যতীত) বেশ ভাল ফিট হতে পারে ।
জন ডিভোরাক

উত্তর:


8

পাইথন 2, 170 153/157/159

ব্যাপটিস্টের কিছু ধারণার জন্য সংক্ষিপ্ত ধন্যবাদ ।

from itertools import*
print min((reduce(lambda s,w:(w+s[max(i*(s[:i]==w[-i:])for i in range(99)):],s)[w in s],p)
for p in permutations(input())),key=len)

দ্বিতীয় লাইন বিরতি প্রয়োজন হয় না।

ইনপুট: 'LOREM', 'DOLOR', 'SED', 'DO', 'MAGNA', 'AD', 'DOLORE'
আউটপুট:SEDOLOREMAGNAD

এমনকি দীর্ঘ ইনপুট স্ট্রিং সহ, সর্বাধিক input টি ইনপুট স্ট্রিং থাকলে এটি 2 সেকেন্ডেরও কম সময়ে চলবে (যেমন দেওয়া উদাহরণটিতে যেমন আমার মেশিনে 1.7 1.5 সেকেন্ডে চলে)। 8 বা ততোধিক ইনপুট স্ট্রিং সহ, যদিও সময় জটিলতা রয়েছে তাই এটি 10 ​​সেকেন্ডেরও বেশি সময় নেয় O(n!)

ব্যাপটিস্ট যেমন উল্লেখ করেছেন, স্বেচ্ছাচারিত ইনপুট দৈর্ঘ্য সমর্থন করা উচিত (কোড 157 অক্ষরের মোট দৈর্ঘ্য তৈরি করা) এর range(99)সাথে প্রতিস্থাপন করা দরকার range(len(w))। যদি খালি ইনপুট স্ট্রিংগুলি সমর্থন করা উচিত, তবে এটিতে পরিবর্তন করতে হবে range(len(w)+1)। যদিও আমি মনে করি range(99)200 এর চেয়ে কম ইনপুট দৈর্ঘ্যের জন্য সঠিকভাবে কাজ করে।

আরও পরীক্ষা:

>>> "AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE",  "R"
SEDOLOREMAGNAD

>>> 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvw
... xyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu
... vwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'ZOOM', 'aZ', 'Za', 'ZA'
aZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZOOM

5

গণিত 337 418 372

ম্যাথমেটিক্স ব্যবহার করে বাস্তবায়ন করতে ব্যর্থ চেষ্টা করার পরে LongestCommonSubsequencePositions, আমি প্যাটার্ন ম্যাচিংয়ের দিকে রইলাম।

v=Length;
p[t_]:=Subsets[t,{2}];
f[w_]:=Module[{c,x,s=Flatten,r={{a___,Longest[y__]},{y__,b___}}:>{{a,y},{y,b},{y},{a,y,b}}},
c=p@w;
x=SortBy[Cases[s[{#/.r,(Reverse@#)/.r}&/@c,1],{_,_,_,_}],v[#[[3]]]&][[-1]];
Append[Complement[w,{x[[1]],x[[2]]}],x[[4]]]]

g[r_]:=With[{h=Complement[r,Cases[Join[p@r,p@Reverse@r],y_/;!StringFreeQ@@y:>y[[2]]]]},
FixedPoint[f,Characters/@h,v@h-1]<>""]

প্যাটার্ন-মিলের নিয়ম,

r={{a___,Longest[y__]},{y__,b___}}:> {{a,y},{y,b},{y},{a,y,b}}},

শৃঙ্খলাবদ্ধ জোড় (অক্ষরের তালিকাগুলি হিসাবে উপস্থাপিত) নেয় এবং প্রত্যাবর্তন করে: (1) শব্দ {a,y}এবং {y,b}তারপরে (2) সাধারণ স্ট্রিং, yযা অন্য শব্দের শুরুর সাথে একটি শব্দের প্রান্তকে যুক্ত করে এবং, অবশেষে, সম্মিলিত শব্দ {a,y,b}যা ইনপুট শব্দগুলিকে প্রতিস্থাপন করবে। সম্পর্কিত উদাহরণের জন্য বেলিসারিয়াসটি দেখুন: /mathematica/6144/looking-for-longest-common-substring-solution

পরপর তিনটি আন্ডারস্কোর অক্ষর বোঝায় যে উপাদানটি শূন্য বা আরও বেশি অক্ষরের ক্রম।

Reverseউভয় আদেশ পরীক্ষা করা হয়েছে তা নিশ্চিত করার জন্য পরে নিযুক্ত করা হয়। যে জোড়াগুলি লিঙ্কযোগ্য অক্ষরগুলি ভাগ করে তাদের অপরিবর্তিত এবং অগ্রাহ্য করা হয়।

সম্পাদনা করুন :

নীচে অন্য শব্দের "সমাধিযুক্ত" (অর্থাত্ সম্পূর্ণরূপে অন্তর্ভুক্ত) তালিকার তালিকা থেকে সরানো হয়েছে, (@ ফ্লর্নকোকের মন্তব্যের প্রতিক্রিয়া হিসাবে)।

h=Complement[r,Cases[Join[p@r,p@Reverse@r],x_/;!StringFreeQ@@x:> x[[2]]]]

উদাহরণ :

 {{"D", "O", "L", "O", "R", "E"}, {"L", "O", "R", "E", "M"}} /. r

আয়

{D "ডি", "ও", "এল", "ও", "আর", "ই"}, L "এল", "ও", "আর", "ই", "এম"}, "এল", "ও", "আর", "ই"}, {"ডি", "ও", "এল", "ও", "আর", "ই", "এম"}


ব্যবহার

g[{"LOREM", "ORE", "R"}]

AbsoluteTiming[g[{"AD", "DO", "DOLOR", "DOLORE", "LOREM", "MAGNA", "SED", "ORE",  "R"}]]

"Lorem"

{0.006256, "SedoloreMAGNAD"}


এই ইনপুট জন্য কাজ করে "LOREM", "ORE", "R"?
ফ্লর্নকোয়

(অর্থাত্ এটি কি সঠিক আউটপুট উত্পাদন করে "LOREM"?)
ফ্লর্নকোয়

@flornquake। আমার স্নাতকের. আমি এটি বর্তমান সংস্করণে সম্বোধন করেছি। আমি আশা করি আমি অন্য কোনও মামলা মিস করিনি। ধন্যবাদ।
ডেভিডসি

কিছুনা কিন্তু সেরা!
ডেভিডসি

3

গল্ফস্ক্রিপ্ট, 66 টি অক্ষর

{.,1>{.`{[1$]-s:h;.,),\`{:g<`{\+.g?0<{;}*}+h%~}+/}+%.&}*}:s~{,}$0=

বেশ সংক্ষিপ্ত, তবে ক্ষতিকারক সময় জটিলতার কারণে (এবং গল্ফস্ক্রিপ্ট) সত্যই ধীর হয়ে গেছে, এটি 10 ​​সেকেন্ডের সময়সীমা ভেঙে দেয়।

উদাহরণ:

['LOREM' 'DOLOR' 'SED' 'DO' 'MAGNA' 'AD' 'DOLORE']
{.,1>{.`{[1$]-s:h;.,),\`{:g<`{\+.g?0<{;}*}+h%~}+/}+%.&}*}:s~{,}$0=
# => SEDOLOREMAGNAD

['AB' 'BC' 'CA' 'BCD' 'CDE']
{.,1>{.`{[1$]-s:h;.,),\`{:g<`{\+.g?0<{;}*}+h%~}+/}+%.&}*}:s~{,}$0=
# => CABCDE

2

পাইথন 2, 203 187 200

from itertools import permutations as p
def n(c,s=''):
 for x in c:s+=x[next((i+1 for i,l in [(j,x[:j+1])for j in range(len(x))][::-1]if s.endswith(l)),0):]
 return s
print min(map(n,p(input())),key=len)

ইনপুট: ['LOREM', 'DOLOR', 'SED', 'DO', 'MAGNA', 'AD', 'DOLORE']
আউটপুট:SEDOLOREMAGNAD

সম্পাদন করা

reduceকিছু নোংরা আমদানির কৌশল ব্যবহার করে , আমি এটি আরও কমাতে পারি (এবং কেবল এক লাইনে!):

print min((reduce(lambda a,x:a+x[next((i+1 for i,l in [(j,x[:j+1])for j in range(len(x))][::-1]if a.endswith(l)),0):],P,'')for P in __import__('itertools').permutations(input())),key=len)

সম্পাদনা 2

ফ্লর্নকোয়াক হিসাবে উল্লিখিত হয়েছে, যখন একটি শব্দ অন্য শব্দটিতে থাকে তখন এটি ভুল ফলাফল দেয়। এটির সমাধানের জন্য আরও ১৩ টি চর যোগ করা হয়েছে:

print min((reduce(lambda a,x:a+(x[next((i+1 for i,l in [(j,x[:j+1])for j in range(len(x))][::-1]if a.endswith(l)),0):],'')[x in a],P,'')for P in __import__('itertools').permutations(input())),key=len)

ক্লিন আপ সংস্করণ এখানে:

from itertools import permutations

def solve(*strings):
    """
    Given a list of strings, return the shortest string that contains them all.
    """
    return min((simplify(p) for p in permutations(strings)), key=len)

def prefixes(s):
    """
    Return a list of all the prefixes of the given string (including itself),
    in ascending order (from shortest to longest).
    """
    return [s[:i+1] for i in range(len(s))]
    return [(i,s[:i+1]) for i in range(len(s))][::-1]

def simplify(strings):
    """
    Given a list of strings, concatenate them wile removing overlaps between
    successive elements.
    """
    ret = ''
    for s in strings:
        if s in ret:
            break
        for i, prefix in reversed(list(enumerate(prefixes(s)))):
            if ret.endswith(prefix):
                ret += s[i+1:]
                break
        else:
            ret += s
    return ret

print solve('LOREM', 'DOLOR', 'SED', 'DO', 'MAGNA', 'AD', 'DOLORE')

তাত্ত্বিক নির্ভুলতার ব্যয়ে কয়েকটি অক্ষর মুণ্ডন করা সম্ভব ( range(99)পরিবর্তে range(len(x))এটির জন্য চিন্তাভাবনা করার জন্য কৃতিত্ব)


আপনি যদি যথার্থতা ত্যাগ করতে ইচ্ছুক হন তবে আপনি সেইসাথে লোভী দৃষ্টিভঙ্গি বা 2 পদ্ধতির বহুভৌলিক অনুমানের উপাদানটিও ব্যবহার করতে পারেন।
পিটার টেলর

চমৎকার সমাধান! নতুন শব্দগুলি ইতিমধ্যে সুপারস্ট্রিংয়ে রয়েছে কিনা তা আপনাকে পরীক্ষা করতে হবে, যদিও: 'LOREM', 'ORE', 'R'ভুলভাবে আউটপুট উত্পাদন করে LOREMORER
flornquake

পছন্দ করুন আমি এটি ঠিক করতে পেরেছি তবে এতে 13 টি অক্ষর যুক্ত হয়েছে।
ব্যাপটিস্ট এম।

1

পাইথন, ১৪৪ টি চর

S=lambda A,s:min(S(A-set([a]),s+a[i:])for a in A for i in range(len(a)+1)if i==0 or s[-i:]==a[:i])if A else(len(s),s)
T=lambda L:S(set(L),'')[1]

Sশব্দের একটি সেট নেয় Aযা এখনও রাখার প্রয়োজন হয় এবং একটি স্ট্রিং sশব্দ যুক্ত শব্দটিকে এখনও পর্যন্ত রাখা হয়। আমরা একটি অবশিষ্ট শব্দ বাছাই aথেকে Aএবং এ থেকেই ওভারল্যাপ 0করতে len(a)শেষে দিয়ে অক্ষর s

প্রদত্ত উদাহরণে প্রায় 0.15 সেকেন্ড সময় নেয়।


সত্যিই সুন্দর! তবে কিছু অন্যান্য সমাধানের মতো, এটি ইনপুটটির মতো কাজ করে না ['LOREM', 'ORE', 'R']। আমি এটি ঠিক করার জন্য স্বাধীনতা নিয়েছি এবং আপনার সমাধানটি আরও কিছুটা গল্ফ করব: S=lambda A,s='':A and min((S(A-{a},(s+a[max(i*(s[-i:]==a[:i])for i in range(len(a))):],s)[a in s])for a in A),key=len)or s(দ্বিতীয় লাইনের প্রয়োজন নেই)। ব্যবহার: S({'LOREM', 'DOLOR', 'SED', 'DO', 'MAGNA', 'AD', 'DOLORE'})আয় 'SEDOLOREMAGNAD'
ফ্লর্নকোয়

0

হাস্কেল, 121

import Data.List
a p []=[(length p,p)]
a p s=[r|w<-s,t<-tails w,isInfixOf w$p++t,r<-a(p++t)(s\\[w])]
s=snd.minimum.a ""

মাইনাস টু যদি ফাংশনটি কোনও নামের সাথে আবদ্ধ না হয়

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