দুটি স্ট্রিং ইন্টারলেভ করার সম্ভাব্য সকল উপায়


21

আমি সম্প্রতি এই প্রশ্নটি স্ট্যাকওভারফ্লোতে দেখেছি । এটি দুর্দান্ত প্রশ্ন, তবে প্রশ্নটি নিয়ে একটি মারাত্মক সমস্যা রয়েছে। তারা এটি করার সর্বোত্তম উপায় জিজ্ঞাসা করছে। উদাহরণস্বরূপ, পড়ার পক্ষে সহজ, সর্বাধিক মূর্খবাদী, নেস্টেস্ট ইত্যাদি they তারা কি জানেন না যে বিষয়টি গুরুত্বপূর্ণ? আপনি কোডের কয়েকতম বাইট দিয়ে এটি কীভাবে করবেন সে সম্পর্কে জিজ্ঞাসা করার কথা!

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

চ্যালেঞ্জ

আপনাকে অবশ্যই সংক্ষিপ্ততম প্রোগ্রাম বা ফাংশনটি লিখতে হবে যা কোনও দুটি স্বেচ্ছাসেবী স্ট্রিং ইন্টারলাইভ করার সমস্ত সম্ভাব্য উপায় তৈরি করে। উদাহরণস্বরূপ, যদি দুটি স্ট্রিং হয় 'ab'এবং 'cd', আউটপুট হয়:

['abcd', 'acbd', 'acdb', 'cabd', 'cadb', 'cdab']

যেমন আপনি দেখতে পাচ্ছেন, aসর্বদা আগে ছিলেন bএবং cসর্বদা আগে ছিলেন d

আইও যে কোনও যুক্তিসঙ্গত বিন্যাসে থাকতে পারে। আপনার আউটপুট যাচাই করতে এই অজগর কোডটি ব্যবহার করুন। (ক্রেডিট: জেডি )

def shuffle(s,t):
    if s=="":
        return [t]
    elif t=="":
        return [s]
    else:
        leftShuffle=[s[0]+val for val in shuffle(s[1:],t)]
        rightShuffle=[t[0]+val for val in shuffle(s,t[1:])]
        leftShuffle.extend(rightShuffle)
        return leftShuffle

নমুনা আইও:

shuffle("$", "1234"):
['$1234', '1$234', '12$34', '123$4', '1234$']

shuffle("az", "by"):
['azby', 'abzy', 'abyz', 'bazy', 'bayz', 'byaz']

shuffle("code", "golf"):
['codegolf', 'codgeolf', 'codgoelf', 'codgolef', 'codgolfe', 'cogdeolf', 'cogdoelf',
'cogdolef', 'cogdolfe', 'cogodelf', 'cogodlef', 'cogodlfe', 'cogoldef', 'cogoldfe',
'cogolfde', 'cgodeolf', 'cgodoelf', 'cgodolef', 'cgodolfe', 'cgoodelf', 'cgoodlef',
'cgoodlfe', 'cgooldef', 'cgooldfe', 'cgoolfde', 'cgoodelf', 'cgoodlef', 'cgoodlfe',
'cgooldef', 'cgooldfe', 'cgoolfde', 'cgolodef', 'cgolodfe', 'cgolofde', 'cgolfode',
'gcodeolf', 'gcodoelf', 'gcodolef', 'gcodolfe', 'gcoodelf', 'gcoodlef', 'gcoodlfe',
'gcooldef', 'gcooldfe', 'gcoolfde', 'gcoodelf', 'gcoodlef', 'gcoodlfe', 'gcooldef',
'gcooldfe', 'gcoolfde', 'gcolodef', 'gcolodfe', 'gcolofde', 'gcolfode', 'gocodelf',
'gocodlef', 'gocodlfe', 'gocoldef', 'gocoldfe', 'gocolfde', 'goclodef', 'goclodfe',
'goclofde', 'goclfode', 'golcodef', 'golcodfe', 'golcofde', 'golcfode', 'golfcode']

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


5
কোডের খুব কম বাইটগুলি এটি করার সবচেয়ে সর্বোত্তম উপায়, এটি প্রত্যেকেই জানে! * (অস্বীকৃতি: সিআর নয়)।
আর

1
সব চরিত্র আলাদা? না অগত্যা?
অদিতসু

4
প্রকৃতপক্ষে ... আপনার "কোড", "গল্ফ" উদাহরণে আপনার একটি সদৃশ "o" এবং সদৃশ ফলাফলও রয়েছে, যেমন 'gcoodelf'। আমি ধরে নেব যা আপনি চান
aditsu

1
"আমি এই দুর্দান্ত প্রশ্নটি সবেমাত্র পেয়েছি However তবে, একটি মারাত্মক ত্রুটি রয়েছে: তারা এটি ভালভাবে সম্পাদন করতে চায়!"
সায়োস

1
"আবাব", "বিসি" এর জন্য আপনার নমুনা আইও সরবরাহ করা উচিত।
তাইমির

উত্তর:


1

পাইথ, 26

M?G?H++LhGgtGH+LhHgGtH]G]H

এখানে চেষ্টা করুন

এটি প্রদত্ত পুনরাবৃত্ত সূত্রটির একটি খুব প্রাথমিক প্রয়োগ। এটি একটি ফাংশন সংজ্ঞায়িত gকরে যা প্রয়োজনীয় কাজ সম্পাদন করে। লিঙ্কটি একটি পরিবর্তিত প্রোগ্রাম যা আরও সুবিধাজনক হওয়ার জন্য STDIN নিউলাইন থেকে পৃথক স্ট্রিংগুলি পড়ে reads কল করতে ফাংশন করতে g<string1><string2>

সম্প্রসারণ:

M                ##  Define a function g taking two arguments: G and H
 ?G?H ... ]G]H   ##  Two ternaries: if G is empty return a list containing H
                 ##  if H is empty return a list containing G
   +             ##  otherwise return these next two lists joined together
   +LhGgtGH      ##  the first letter of G added to each result of a recursive call to g
                 ##  with G missing its first character and H
   +LhHgGtH      ##  the same as above but with G and H swapped

দুটি পুনরাবৃত্ত কলগুলি একই রকম, তবে আমি আর তাদের গল্ফ দেওয়ার কোনও উপায় খুঁজে পাইনি।


10

হাস্কেল, 53 48 বাইট

a%""=[a]
a%b=[x:t|(x:y,z)<-[(a,b),(b,a)],t<-y%z]

একটি ফাংশন সংজ্ঞা দেয় % দেয় যার জন্য a%bস্ট্রিং সহ স্ট্রিংগুলির a,bএকটি তালিকা দেয় gives

দুটি স্ট্রিং দেওয়া, আমরা দুটি চরিত্রের মধ্য থেকে প্রথম চরিত্রটি নিতে বেছে নিই। তারপরে আমরা দুটি স্ট্রিংয়ের বাকী অংশগুলিকে পুনরুক্তি করি, প্রতিটি ফলাফলের জন্য এই চরিত্রটি প্রিপেন্ড করে।

যখন কোনও একটি স্ট্রিং ফাঁকা থাকে, কেবলমাত্র সম্ভাব্য ফলাফলটি অন্য স্ট্রিং। ""%""=[""]যথেষ্ট হবে, কিন্তু এটি দীর্ঘ।


53 বাইট:

a@(b:c)%d@(e:f)=((b:)<$>c%d)++((e:)<$>a%f)
a%d=[a++d]

%যার জন্য একটি ফাংশন সংজ্ঞায়িত করেa%da,d দেয় স্ট্রিং সহ স্ট্রিংগুলির একটি তালিকা দেয় gives

ফাংশন পুনরাবৃত্তি সংজ্ঞায়িত করা হয়। যদি আমরা প্রথম স্ট্রিং থেকে একটি অক্ষর গ্রহণ করি, তবে এটি অবশ্যই দ্বিতীয় স্ট্রিংয়ের সাথে প্রথম স্ট্রিংয়ের অবশেষে পুনরাবৃত্ত কলের প্রতিটি ফলাফলের জন্য প্রম্পেন্ড করা উচিত। অন্যান্য স্ট্রিংয়ের জন্য প্রতিসম।

বেস কেসগুলির জন্য, যদি কোনও স্ট্রিং খালি থাকে, ফলাফলটি তাদের একত্রীকরণের একক-উপাদান তালিকা। প্রতিটি স্ট্রিং ফাঁকা থাকার জন্য এটি দুটি ক্ষেত্রেের চেয়ে ছোট।


@aditsu ওহো, আমি বোঝানো ""%""=[""]
xnor

ঠিক একই ভাষায় এক বাইট দ্বারা আপনার উপরে জয়ের উত্তর পাওয়া অদ্ভুত
গর্বিত হাসেল্লার

10

হাস্কেল, 47

(x:s)#b=(x:)<$>s%b
a#b=[]
[]%b=[b]
a%b=a#b++b#a

% অপারেটর যা এই চ্যালেঞ্জ সমাধান করে।

#এমন একটি অপারেটর যা দুটি তালিকার মধ্যে নিয়ে যায় এবং সেগুলি আন্তঃবিভক্ত করার সমস্ত উপায় খুঁজে পায় যে প্রথম অক্ষরটি প্রথম স্ট্রিং থেকে আসে (একটি প্রান্তের কেস সহ - যদি প্রথম তালিকাটি খালি থাকে, তবে ফলাফলটি খালি তালিকা হয়) এতে পুনরাবৃত্তি করে %

তারপরে, %কেবল #দু'বার প্রয়োগ করে কাজ করে ।

সম্পাদনা: পূর্ববর্তী সংস্করণে একটি বাগ ছিল যা ""%""ফিরে এসেছিল ["",""], তাই আমি এটি ঠিক করেছিলাম। এটিতে বেস কেস যুক্ত করে এটি স্থির করা হয়েছিল %, যার পরে একই দৈর্ঘ্যের একটি বেস কেসটি সরানোর অনুমতি দেওয়া হয়েছিল #(যা সত্যিকার অর্থে, খুব একটা বোঝায় না)।


@ নিমিমি তবে প্রকারভেদগুলি - (#) :: [a]->[a]->[[a]]তাই, a::[a]এবং ফলাফলটি ধরণের হওয়া উচিত[[a]]
গর্বিত হাসেলেলার

উফ, আপনি ঠিক বলেছেন। দুঃখিত।
নিমি

8

পাইথন 2, 71 বাইট

f=lambda*p:[x[0]+t for x,y in p,p[::-1]for t in x and f(x[1:],y)]or['']

উদাহরণ রান:

>> f('ab','AB')
['abAB', 'aABb', 'aAbB', 'ABab', 'AabB', 'AaBb']

দুটি স্ট্রিং দেওয়া হয়েছে x,yআমরা xএটির প্রথম চরিত্রটি নিতে পারি এবং এটি হারিয়ে যাওয়া পুনরাবৃত্ত কলের প্রতিটি ফলাফলের জন্য এটি প্রেন্ডেন্ড করতে পারি f(x[1:],y)। অথবা, আমরা একই কাজ করতে পারেন xএবং yসুইচ। x,yইনপুট pবা এর বিপরীত `পি [:: - 1] হিসাবে গ্রহণ করে আমরা উভয়ই সম্ভাবনা পেয়েছি।

একটি খালি স্ট্রিং থেকে নেওয়া এড়াতে x, আমরা লজিকাল শর্ট সার্কিট দিয়ে x and। উভয় স্ট্রিং যদি খালি থাকে তবে দুটি স্ট্রিংও হতে পারে না xএবং আমরা সম্ভাবনার খালি তালিকা পাই, যা আমরা orসঠিক বেসের সাথে স্থির করি ['']

পাইথন 3 (73 বাইট) এ একই জাতীয় উত্পাদন কৌশল:

f=lambda p,s='':[f((x[1:],y),s+x[0])for x,y in[p,p[::-1]]if x]or print(s)

এই জাদু কি ধরনের?! (+1)
অদিতসু

3

পাইথন, 80

অনুরোধ হিসাবে, এখানে একটি অজগর উত্তর:

f=lambda a,b,c='':[c+x for x in[a+b][a>''<b:]or f(a[1:],b,a[0])+f(a,b[1:],b[0])]

4 বাইট খাওয়ার জন্য ধন্যবাদ Sp3000 :)


2

সিজেম, 38

q~L{_2$e&{_2$(\@jf+@@(@@jf++}{+a}?}2jp

এটি অনলাইনে চেষ্টা করুন

ডায়নামিক প্রোগ্রামিং (স্মৃতিযুক্ত পুনরাবৃত্তি ব্যবহার করে)।

ব্যাখ্যা:

q~         read and evaluate the input (2 strings)
L{…}2j     calculate with memoized recursion with no initial cache and 2 arguments
  _2$      copy the 2 strings
  e&{…}    if they are both non-empty
    _2$    copy the strings again (they're in reverse order)
    (      take out the first character of the first string
    \@     move the strings after the character
    j      solve recursively
    f+     prepend the character to all results
    @@     bring the other copy of the strings on top (in order)
    (      take out the first character of the second string
    @@     move the strings after the character
    j      solve recursively
    f+     prepend the character to all results
    +      concatenate the 2 sets of results
  {…}      else
    +      concatenate the 2 strings (at least one is empty)
    a      put the result in an array
  ?        end if
p          pretty-print the results for the input strings

2

সিজেম, 32 বাইট

qN/_:,eeWf%e~e!\f{\{_2$=(ot}/No}

এটি এখানে পরীক্ষা করুন।

এটি সত্যিই গল্ফযোগ্য অনুভব করে তবে এখন পর্যন্ত আমি কেবলমাত্র 4 টি বিকল্প সমাধান পেয়েছি যা সকলের কাছে একই বাইট গণনা রয়েছে:

qN/_ee{),*~}%e!\f{\{_2$=(ot}/No}
l_:!l_0f>@+])e!\f{\{_2$=(ot}/No}
ll__3$:!+.=])e!\f{\{_2$=(ot}/No}
qN/[_:,2,]ze~e!\f{\{_2$=(ot}/No} (found by Sp3000)

মৌলিক ধারণাটি হ'ল 0এস এবং এসগুলির সমস্ত ক্রম উত্পাদনের সাথে সম্পর্কিত ফলাফলটির 1প্রতিটি অক্ষরকে নেওয়া উচিত string এটি পর্যন্ত এবং অন্তর্ভুক্ত সমস্ত কিছু e!। বাকিগুলি কেবল তখন দুটি স্ট্রিং থেকে সেই ক্রমে অক্ষরগুলি টেনে নিয়ে যায়।


ভাল লাগল, আমি সেই ধারণাটি নিয়ে ভেবেছিলাম তবে ভাবিনি যে এটি গল্ফটি করতে পারে।
অদিতসু

@ অ্যাডিতসু আমাদের যা প্রয়োজন তা হ'ল এর মধ্যে একটি মিশ্রণ e*এবং .*যা প্রতিটি উপাদানকে আলাদা পরিমাণে পুনরাবৃত্তি করে। ;) (অর্থাত্ একটি অপারেটর :a.*:~I আমি মনে করি e*এটির জন্য এটি ব্যবহার করা যেতে পারে যেহেতু বর্তমানে দুটি তালিকা দেওয়া থাকলে এটি ত্রুটিযুক্ত।)
মার্টিন ইন্ডার

2

জাভাস্ক্রিপ্ট (ফায়ারফক্স 30-57), 88 84 81 বাইট

(s,t,g=(v,w)=>v[1]?f(v.slice(1),w).map(x=>v[0]+x):[v+w])=>[...g(s,t),...g(t,s)]

সম্পাদনা করুন: আমার সমাপ্তির অবস্থার উন্নতি করে 4 বাইট সংরক্ষণ করা হয়েছে। 3 বাইট সংরক্ষণ করা হয়েছে @ এডক 65 এর জন্য ধন্যবাদ।


প্রকাশের খুব কাছে, তবে একবার দেখুন - এটি সংক্ষিপ্ত:f=(a,b,z=(v,w)=>v[1]?f(v.slice(1),w).map(x=>v[0]+x):[v+w])=>z(a,b).concat(z(b,a))
edc65

@ edc65 খুব সুন্দর; আমি vশর্ত হিসাবে ব্যবহার করতে চেষ্টা করেছি এবং ব্যর্থ হয়েছি , তবে এটি ব্যবহারের জন্য আমার কাছে কখনও ঘটেনি v[1]
নীল

2

ব্র্যাচল্যাগ , 8 বাইট

p~cᵐz₁cc

এটি অনলাইন চেষ্টা করুন!

ইনপুট ভেরিয়েবলের মাধ্যমে দুটি স্ট্রিংয়ের তালিকা হিসাবে ইনপুট নেয় এবং আউটপুট ভেরিয়েবলের মাধ্যমে সমস্ত সম্ভাব্য ইন্টারলিভিং তৈরি করে। যেহেতু পরীক্ষার কেসগুলি যেখানে ভাগ করা চিঠিগুলি সেখানে নকল ইন্টারলিভিংয়ের অনুমতি বলে মনে হচ্ছে, সেগুলি এড়াতে আমি কোনও যত্ন নিই নি, তবে এটি কেবল ভাগ করা চিঠিগুলি দিয়ে নয়, আরও অনেক নকল তৈরি করে । (যদি এটি অনুমোদিত না হয় তবে ভাগ করে নেওয়া অক্ষরের ডুপ্লিকেটগুলি প্রয়োজনীয় না হয়, কেবলমাত্র {}ᵘঅনুলিপি ছাড়াই একটি তালিকা হিসাবে আউটপুট মোড়ানোর জন্য তিনটি বাইট যুক্ত করুন ))

p           A permutation of
            the input variable
   ᵐ        with each element
 ~c         arbitrarily partitioned,
    z       zipped
     ₁      without cycling,
      cc    and concatenated twice
            is the output variable.

মূলত, এটি উভয় স্ট্রিংয়ের প্রতিটি বিভাজন উত্পন্ন করে, তারপরে এগুলি উভয় ক্রমে সাধারণ ডিস্ট্রিমেন্টিক ফ্যাশনে বিভ্রান্ত করে। অতিরিক্ত সদৃশ আন্তঃবিভাজনগুলি পার্টিশন জোড়ার কারণে হয় যেখানে প্রথম দৈর্ঘ্যের এবং দ্বিতীয়টির দৈর্ঘ্যের মধ্যে পার্থক্য 0 বা 1 ব্যতীত অন্য কিছু মান থাকে, যার মধ্যে একটির খণ্ড থাকে যা শেষে একে অপরের সাথে সংযুক্ত থাকে। সুতরাং, নমুনা আউটপুট হিসাবে একই গুণিতক দিয়ে আউটপুট উত্পাদন করতে:

ব্র্যাচল্যাগ , 17 বাইট

p~cᵐ{lᵐ-ℕ<2&}z₁cc

এটি অনলাইন চেষ্টা করুন!

অতিরিক্ত কোড, {lᵐ-ℕ<2&}কোনও পার্টিশন জুটিকে ব্যর্থ করে যেখানে কোনও বহিরাগত বিভাগ তৈরি করা হয়। (পাইথন শেলটিতে আরও সহজে আউটপুট চেক করার জন্য কোটগুলি মুদ্রণের জন্য আমি টিআইওতে শিরোনামটি পরিবর্তন করেছি))


1

এমএটিএল , 34 30 বাইট

h1Mgw~hY@Xu!ttYs*w~tYs1Gn+*+!)

এটি এই উত্তরটি থেকে একটি ধারণা ব্যবহার করে : যদি স্ট্রিংগুলির দৈর্ঘ্য হয় mএবং n, বিট সেট m+nসহ সমস্ত বিট নিদর্শনগুলি গণনা করে m। একটি উপায়ে করুন যে এই গণনাটি হ'ল: একটি ভেক্টরের সমস্ত অনুমতি উত্পন্ন করুন mএবং এর সাথেn জিরো দিয়ে তৈরি করুন এবং তারপরে নকলগুলি সরিয়ে দিন।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

h     % implicitly input the two strings of lengths m and n. Concatenate
1M    % push the two strings again
g     % convert the second strings into ones
w~    % swap. Convert the second string into zeros
h     % concatenate: vector of zeros and ones
Y@    % 2D array with all permutations of that vector, each on a row
Xu    % remove duplicate rows
!     % transpose
ttYs  % duplicate twice. Cumulative sum along each column
*     % element-wise product. Produces, in each column, indices for
      % elements of the first string; 1, 2,...,m. The rest are 0
w~    % swap, negate
tYs   % duplicate. Cumulative sum along each column
1Gn+  % add length of first input
*     % element-wise product. Produces, in each column, indices for
      % elements of the second string: m+1,...,m+n. The rest are 0
+     % add. This gives indices into the concatenated string created initially
!     % transpose back
)     % index into concatenated string. Implicitly display

0

রুবি, 83 বাইট

একটি পুনরাবৃত্ত ফাংশন যা [a+b]যদি এই স্ট্রিংগুলির কোনও একটিই খালি থাকে তবে ফিরে আসে । অন্যথায়, এটি স্ট্রিংয়ের তালিকায় a[0] + every string in v[a[1..-1],b]যুক্ত স্ট্রিংগুলির একটি তালিকা প্রদান করেb[0] + every string in v[a,b[1..-1]]

v=->a,b{a[0]&&b[0]?v[a[1..-1],b].map{|i|a[0]+i}+v[a,b[1..-1]].map{|i|b[0]+i}:[a+b]}

0

ব্যাচ, 154 152 বাইট

@if "%~1%~2"=="" echo %3
@set t=%~1
@if not "%t%"=="" call %0 "%t:~1%" "%~2" %3%t:~,1%
@set t=%~2
@if not "%t%"=="" call %0 "%~1" "%t:~1%" %3%t:~,1%
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.