সংক্ষিপ্ততম দীর্ঘতম সাবসেক্সেন্স কোড


11

আপনার টাস্ক SLCSC সমস্যা, সমাধানের জন্য সম্ভাব্য স্বল্পতম কোড খোঁজার যা গঠিত সমাধান করতে দীর্ঘতম প্রচলিত Subsequence সমস্যা

জন্য দুই বা ততোধিক স্ট্রিং অবস্থায় LCS সমস্যার একটি বৈধ সমাধান এস 1 , ... এস এন কোনো স্ট্রিং টি সর্বোচ্চ দৈর্ঘ্য যেমন যে অক্ষর টি সব প্রদর্শিত S আমি হিসাবে, একই আদেশ টি

দ্রষ্টব্য যে T টি এস i এর একটি সাব স্ট্রিং হতে হবে না ।

উদাহরণ

স্ট্রিং axbyczএবং xaybzcদৈর্ঘ্য 3 8 সাধারণ subsequences আছে:

abc abz ayc ayz xbc xbz xyc xyz

এর যে কোনও একটি এলসিএস সমস্যার বৈধ সমাধান হতে পারে।

বিস্তারিত

নীচের বিধিগুলি মেনে একটি প্রোগ্রাম বা একটি ফাংশন লিখুন যা এলসিএস সমস্যা সমাধান করে, উপরে বর্ণিত হিসাবে:

  • ইনপুটটিতে দুটি বা ততোধিক স্ট্রিং থাকবে যাতে কেবল ছোট হাতের অক্ষর থাকে।

    আপনি এই স্ট্রিংগুলিকে স্ট্রিংগুলির অ্যারে বা আপনার পছন্দসই একটি ডিলিমিটার সহ একক স্ট্রিং পড়তে পারেন।

  • আপনার কোডটিতে সমস্যার সম্ভাব্য সমাধানগুলির যে কোনও একটিকে আউটপুট অবশ্যই দিতে হবে, তারপরে একটি লাইনফিড বা চারপাশে উদ্ধৃতি দ্বারা আবশ্যক।

  • আপনি ধরে নিতে পারেন যে স্ট্রিংগুলি 1000 টির চেয়ে কম অক্ষরের এবং কমপক্ষে 20 টি স্ট্রিং রয়েছে।

    এই সীমাবদ্ধতার মধ্যে, আপনার কোডটি তত্ত্ব হিসাবে প্রত্যাশার মতো কাজ করা উচিত (সীমাহীন সময় এবং মেমরি দেওয়া)।

  • আপনার কোডটি অবশ্যই আমার মেশিনে এক ঘন্টার মধ্যে পরবর্তী বিভাগের সংযুক্ত পরীক্ষার কেসগুলি সম্পূর্ণ করতে হবে (ইন্টেল কোর i7-3770, 16 জিবি র‌্যাম)।

    সমস্ত সম্ভাব্য অনুচ্ছেদগুলিতে কেবল পুনরাবৃত্তি হওয়া পদ্ধতির সময় সীমা মেনে চলবে না।

  • বিল্ট-ইনগুলি ব্যবহার করা যা এই কার্যকে তুচ্ছ করে তোলে, যেমন LongestCommonSequenceঅনুমোদিত নয়।

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

পরীক্ষার মামলা

a
ab

আউটপুট: a


aaaaxbbbb
bbbbxcccc
ccccxaaaa

আউটপুট: x


hxbecqibzpyqhosszypghkdddykjfjcajnwfmtfhqcpavqrtoipocijrmqpgzoufkjkyurczxuhkcpehbhpsuieqgjcepuhbpronmlrcgvipvibhuyqndbjbrrzpqbdegmqgjliclcgahxoouqxqpujsyfwbdthteidvigudsuoznykkzskspjufgkhaxorbrdvgodlb
qnnprxqpnafnhekcxljyysobbpyhynvolgtrntqtjpxpchqwgtkpxxvmwwcohxplsailheuzhkbtayvmxnttycdkbdvryjkfhshulptkuarqwuidrnjsydftsyhuueebnrjvkfvhqmyrclehcwethsqzcyfvyohzskvgttggndmdvdgollryqoswviqurrqhiqrqtyrl

আউটপুট: hxbbpyhogntqppcqgkxchpsieuhbncvpuqndbjqmclchqyfttdvgoysuhrrlবা একই দৈর্ঘ্যের অন্য কোনও সাধারণ অনুচ্ছেদ


riikscwpvsbxrvkpymvbbpmwclizxlhihiubycxmxwviuajdzoonjpkgiuiulbjdpkztsqznhbjhymwzkutmkkkhirryabricvhb
jnrzutfnbqhbaueicsvltalvqoorafnadevojjcsnlftoskhntashydksoheydbeuwlswdzivxnvcrxbgxmquvdnfairsppodznm
kzimnldhqklxyezcuyjaiasaeslicegmnwfavllanoolkhvqkjdvxrsjapqqwnrplcwqginwinktxnkfcuuvoyntrqwwucarfvjg

আউটপুট: icsvllvjnlktywuarবা একই দৈর্ঘ্যের অন্য কোনও সাধারণ অনুচ্ছেদ


rblartqkfggrjpiipuzzypkycnyckkcqceeujiyy
yfpnedyjtiwrhyuktripdwyvgkblzodeufkelhub
ywcyboxwqkibwvredkrbdsyudkulpvmhixeqxynh
bnxwahbzhwjxkotnvbxrojkkldtsodtjmvdrmbgr

আউটপুট: krkkবা একই দৈর্ঘ্যের অন্য কোনও সাধারণ অনুচ্ছেদ


bwfscmotshoczmduwaev
coywaaizdaxjovipsmeh
dobzcpoiedenzlfdjpiu
bbhfeqscvvbwkuoxdoge
drqrzwbcpcsvneodelja

আউটপুট: codeবা একই দৈর্ঘ্যের অন্য কোনও সাধারণ অনুচ্ছেদ


nqrualgoedlf
jgqorzglfnpa
fgttvnogldfx
pgostsulyfug
sgnhoyjlnfvr
wdttgkolfkbt

আউটপুট: golfবা একই দৈর্ঘ্যের অন্য কোনও সাধারণ অনুচ্ছেদ


epopyfuhgowedpiqpgfj
ddxyestqynpwmytxhozm
ptubgzyqqksieoovuezv
tovotqmnhgzttfpywjgr
aomvytkgaijlgqzkljls
vzvxpaixrnprxvenbbuo
syfuwxlpcyontqlmfvib
arxleuomstkjegpduwcx
xgqrxaopouvkvwgbzewn
yggunddigctgpnuztzai
izroomywwztdymqszsuo
kiawjnxjncdtufhkrjsp

আউটপুট: খালি স্ট্রিং



পুনঃটুইটগুলি এই প্রশ্নটি ইনপুট হিসাবে মাত্র দুটি স্ট্রিং দেয় এবং এর কোনও সময়সীমা থাকে না। সমস্ত বিদ্যমান উত্তরগুলি নিষ্প্রভ পন্থাগুলি ব্যবহার করে যা এই প্রশ্নের বিধি মেনে চলার জন্য খুব ধীরগতির।
ডেনিস

শেষ উদাহরণটি সম্ভবত গণনা করতে দীর্ঘতম সময় নেয়, তবে প্রথমে প্রতিটি অক্ষর যা প্রতিটি স্ট্রিংয়ে উপস্থিত হয় না তা সরিয়ে দিয়ে খালি স্ট্রিং আউটপুট দেওয়ার ক্ষেত্রে এটি ক্ষুদ্র। একই সংখ্যার স্ট্রিং এবং স্ট্রিংয়ের দৈর্ঘ্যের সাথে আপনি কী আরও একটি উদাহরণ যুক্ত করতে পারেন, যেখানে ব্যবহৃত প্রতিটি অক্ষর প্রতিটি স্ট্রিংয়ে উপস্থিত হয় এবং যেখানে এলসিএস কমপক্ষে 5 টি অক্ষর বা তাই? এর মতো কিছু: ghostbin.com/paste/x9caq
Tyilo

@ টাইলিও এমন কিছু যুক্তি সংযুক্ত করে যা তাড়াতাড়ি পুনরাবৃত্তি শেষ হয় যদি স্ট্রিংগুলিতে আরও সাধারণ অক্ষর না থাকে তবে শেষ পরীক্ষার ঘটনাটি প্রায় এটিই যথেষ্ট।
ডেনিস

@ ডেনিস তাই সমাধানটি 20 স্বেচ্ছাসেবী দৈর্ঘ্যের 1000 টি স্ট্রিং দিয়ে যুক্তিসঙ্গত সময়ে চালাতে সক্ষম হওয়া উচিত নয়?
টাইলো

উত্তর:


4

সিজেম, 31

q~L{_:&\f{_2$f#:).>j+}{,}$W>s}j

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

ডেনিসকে 9 বাইট গল্ফ দিয়ে ধন্যবাদ!

ব্যাখ্যা:

এই অ্যালগরিদমটি পর্বের প্রথম অবস্থার জন্য প্রতিটি সম্ভাব্য চরিত্রের চেষ্টা করে, প্রতিটি অক্ষরে সেই অক্ষরটির প্রথম উপস্থিতির পরে স্ট্রিংয়ের সাথে প্রতিস্থাপন করে এবং তারপরে নিজেকে পুনরাবৃত্তভাবে ডাকে (স্মৃতি সহ) calls

q~          read and evaluate the input (taken as an array)
L{…}j       execute block with recursive memoization and no starting values
  _         duplicate the array of strings
  :&\       intersect the strings as character sets and move before the array
             these are all the possible characters for the sequence
  f{…}      for each character and the array
    _2$     duplicate the array and the character
    f#      find the character position in each string
    :)      increment the positions (to skip the character)
    .>      slice each string starting at the corresponding position
    j       call the j block recursively
    +       concatenate the starting character with the result
  {,}$      sort resulting strings (one for each character) by length
  W>        keep only the last element, if any
  s         convert (from 0/1-string array) to string

5

পাইথন - 665 644

ইনডেন্টেশন স্তর:

1: space
2: tab
3: tab + space
4: 2 tabs
5: 2 tabs + space

কোডটি একটি ফাংশন সংজ্ঞায়িত করে o, যা স্ট্রিংগুলির একটি তালিকা আর্গুমেন্ট হিসাবে গ্রহণ করে এবং স্ট্রিংগুলির জন্য এলসিএসের একটি প্রদান করে।

def o(t):
 t=[[y for y in x if y in reduce(lambda x,y:x.intersection(y),t,set(t[0]))]for x in t];l=map(len,t);C=[0]*reduce(lambda x,y:x*-~y,l,1);y=lambda z:[x-1for x in z];m=len(t);e=enumerate
 def g(h):
    r,x=0,1
    for k,j in e(h):r+=-~j*x;x*=-~l[k]
    return r
 def f(h):
    i=len(h)
    if i==m:
     b=g(h);c=t[0][h[0]]
     for k,j in e(h):
         if t[k][j]!=c:break
     else:C[b]=1+C[g(y(h))];return
     r=0
     for k,_ in e(h):a=h[:];a[k]-=1;r=max(r,C[g(a)])
     C[b]=r;return
    for j,_ in e(t[i]):f(h+[j])
 def p(h):
    if min(h)==-1:return''
    v=C[g(h)]
    for k,_ in e(h):
        a=h[:];a[k]-=1
        if v==C[g(a)]:return p(a)
    return p(y(h))+t[0][h[0]]
 f([]);return p(y(l))

পরীক্ষার কোড:

tests = [
"""
a
ab
""",
"""
aaaaxbbbb
bbbbxcccc
ccccxaaaa
""",
"""
hxbecqibzpyqhosszypghkdddykjfjcajnwfmtfhqcpavqrtoipocijrmqpgzoufkjkyurczxuhkcpehbhpsuieqgjcepuhbpronmlrcgvipvibhuyqndbjbrrzpqbdegmqgjliclcgahxoouqxqpujsyfwbdthteidvigudsuoznykkzskspjufgkhaxorbrdvgodlb
qnnprxqpnafnhekcxljyysobbpyhynvolgtrntqtjpxpchqwgtkpxxvmwwcohxplsailheuzhkbtayvmxnttycdkbdvryjkfhshulptkuarqwuidrnjsydftsyhuueebnrjvkfvhqmyrclehcwethsqzcyfvyohzskvgttggndmdvdgollryqoswviqurrqhiqrqtyrl
""",
"""
riikscwpvsbxrvkpymvbbpmwclizxlhihiubycxmxwviuajdzoonjpkgiuiulbjdpkztsqznhbjhymwzkutmkkkhirryabricvhb
jnrzutfnbqhbaueicsvltalvqoorafnadevojjcsnlftoskhntashydksoheydbeuwlswdzivxnvcrxbgxmquvdnfairsppodznm
kzimnldhqklxyezcuyjaiasaeslicegmnwfavllanoolkhvqkjdvxrsjapqqwnrplcwqginwinktxnkfcuuvoyntrqwwucarfvjg
""",
"""
rblartqkfggrjpiipuzzypkycnyckkcqceeujiyy
yfpnedyjtiwrhyuktripdwyvgkblzodeufkelhub
ywcyboxwqkibwvredkrbdsyudkulpvmhixeqxynh
bnxwahbzhwjxkotnvbxrojkkldtsodtjmvdrmbgr
""",
"""
bwfscmotshoczmduwaev
coywaaizdaxjovipsmeh
dobzcpoiedenzlfdjpiu
bbhfeqscvvbwkuoxdoge
drqrzwbcpcsvneodelja
""",
"""
nqrualgoedlf
jgqorzglfnpa
fgttvnogldfx
pgostsulyfug
sgnhoyjlnfvr
wdttgkolfkbt
""",
"""
epopyfuhgowedpiqpgfj
ddxyestqynpwmytxhozm
ptubgzyqqksieoovuezv
tovotqmnhgzttfpywjgr
aomvytkgaijlgqzkljls
vzvxpaixrnprxvenbbuo
syfuwxlpcyontqlmfvib
arxleuomstkjegpduwcx
xgqrxaopouvkvwgbzewn
yggunddigctgpnuztzai
izroomywwztdymqszsuo
kiawjnxjncdtufhkrjsp
"""
]

for s in tests:
 print o(s.strip().split())

আমার কম্পিউটারে পরীক্ষা চালাতে সময় লাগে:

$ time python 52808-shortest-longest-common-subsequence-code-golfed.py
a
x
hecbpyhogntqtpcqgkxchpsieuhbncvhuqndbjqmclchqyfhtdvgoysuhrrl
icsvllvanlktywuar
krkk
code
golf

        9.03 real         8.99 user         0.03 sys

1
আপনার কোডটি 666 বাইটে পেতে একটি বাইট যুক্ত করা উচিত। তাই ধাতু। \ এম /
অ্যালেক্স এ।

@AlexA। হ্যাঁ আমি এটিও লক্ষ করেছি যে বাইটগুলি গণনা করার সময় এটি শেষ লাইনে একটি নতুন লাইন অন্তর্ভুক্ত করে।
টাইলো

আমি এখনই দেখতে পাচ্ছি কয়েকটি ছোট উন্নতি যা সাহায্য করা উচিত। প্রথমত, আপনার যে কোনও জায়গায় (n+1), আপনি -~nপ্রতি ক্ষেত্রে ২ টি বাইট সংরক্ষণ করে এটি প্রতিস্থাপন করতে পারেন । এছাড়াও, আপনি যে কোনও জায়গায় ব্যবহার mapকরেন না কেন lambdaপরিবর্তে তালিকার বোঝাপড়াটি বিবেচনা করুন। উদাহরণস্বরূপ, map(lambda x:x-1,z)এটিকে পরিবর্তন করে তিনটি বাইট দ্বারা সংক্ষিপ্ত করা যায় [~-x for x in z]
কেদে

r,x=r+(j+1)*x,x*(l[k]+1)সংক্ষিপ্ত করা যেতে পারে r+=(j+1)*x;x*=(l[k]+1)। এছাড়াও, আপনার প্রয়োজন নেই u=...কারণ uকেবল এক জায়গায় ব্যবহৃত হয়। চিঠির জন্য কেবল কোডটি বিকল্প করুন u
mbomb007

@ ভিওজ- এবং এমবিম্ব 7007 ধন্যবাদ।
টাইলো

4

পাইথ, 59 58 55 35 বাইট

L&@Fb?+yPMbeeb@FeMbeolNmyXJbdP@bdlb

@ আইস্যাককে ধন্যবাদ পুরো 20 বাইট কেটে!

55 বাইট সংস্করণ:

DCHR?k!&.AH@FH?+Cm<1dHeeHql{medH1h.MlZ.eC++<Hk]<1b>HhkH

পরিবর্তন করে 3 বাইট কেটে .U@bZকরার @F(ভাঁজ অপারেটর)।

58 বাইট সংস্করণ:

DCHR?k!&.AH.U@bZH?+Cm<1dHeeHql{medH1h.MlZ.eC++<Hk]<1b>HhkH

বুলিয়ান শর্তসাপেক্ষে বিন্যাসটি পরিবর্তন করে একটি বাইট কেটে দিন।

59 বাইট সংস্করণ:

DCHR?k|!.AH!.U@bZH?+Cm<1dHeeHql{medH1h.MlZ.eC++<Hk]<1b>HhkH

এই কঠিন ছিল! পাইথন সেগফোল্টিং রেখেছিল! খুব নিশ্চিত যে এটি কোনও ধরণের বাগ ছিল, তবে আমি কোনও ন্যূনতম পরীক্ষার কেস পেতে পারি না। আচ্ছা ভালো.

আমি এই এক থেকে অ্যালগরিদম ভিত্তিক । কোনটি কেবলমাত্র দুটি স্ট্রিংয়ের জন্য নকশাকৃত except এটি আরও কাজ করতে আমাকে কিছুটা টুইট করতে হয়েছিল। তারপরে, সর্বশেষ পরীক্ষার কেসটি খুব বেশি সময় নিয়েছিল, তাই সাধারণ কোনও অক্ষর না থাকলে পুনরাবৃত্তি থেকে বেরিয়ে আসার জন্য আমাকে একটি অতিরিক্ত চেক যোগ করতে হয়েছিল।

এটি বেশ ধীর, কিন্তু উচিত একটি ঘন্টা (আশা) কম গ্রহণ। আমি আমার কোর আই 3-তে 6 গিগাবাইট র‌্যামের মাধ্যমে পরীক্ষা করছি, সুতরাং আপনার 16-জিবি কোর আই 7 এর মাধ্যমে ফুঁ দেওয়া উচিত। :)

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

সম্পাদনা : @ ডেনিস বলেছেন যে এটি পাস!

এটি পরীক্ষা করতে, নিম্নলিখিত লাইনটি যুক্ত করুন:

CQ

এবং স্ট্যান্ডার্ড ইনপুট (যেমন ['a', 'ab']) এর মাধ্যমে স্ট্রিংগুলির একটি তালিকা দিন ।

35 বাইট সংস্করণের ব্যাখ্যা:

WIP।

55 বাইট সংস্করণের ব্যাখ্যা:

DCH                                                        define a function C that takes a list of strings H
   R                                                       return the following expression
    ?                                                      if
      !&.AH@FH                                             there are no more common letters OR all the strings are empty
     k                                                     return the empty string
              ?          ql{medH1                          else if the last character of every string is equal
               +Cm<1dHeeH                                  return the result of adding the last character to recursion with every item without its last character
                                 h.MlZ.eC++<Hk]<1b>HhkH    otherwise, return the largest result of recursing len(H) times, each time with one element's last character cut off

@ ডেনিস ওকে; আমি এটিতে কাজ করব।
kirbyfan64sos

@ ডেনিস আপডেট হয়েছে। আপনি এখন আবার চেষ্টা করতে পারেন।
kirbyfan64sos

শেষ পরীক্ষার কেসটি এখনই তাত্ক্ষণিকভাবে শেষ হয়।
ডেনিস

@ ডেনিস ইয়েসএসএসএস !!
kirbyfan64sos

@ kirbyfan64sos segfaults সম্পর্কে: পুনরাবৃত্তির গভীরতা যখন খুব বেশি যায় যেমন পাইথ সেগফাল্টস যেমন অনন্ত পুনরাবৃত্তি হিসাবে।
isaacg

4

সি, 618 564 বাইট

d,M,N,A[9999][2];char*(R[9999][20]),b[1000];L(char**s,n){char*j[20],c,a=0;int x[n],y=n-1,z,i,t,m=0,w=1;for(;y;)x[y--]=999;for(;y<N;y++){for(i=0;i<n&&s[i]==R[y][i];i++);if(i/n){a=A[y][0];m=A[y][1];w=0;if(m+d<M||!a)goto J;else{c=a;goto K;}}}for(c=97;w&&c<'{';c++){K:t=1,y=1,z=1;for(i=0;i<n;j[i++]++){for(j[i]=s[i];*j[i]-c;j[i]++)t&=!!*j[i];y&=j[i]-s[i]>x[i]?z=0,1:0;}t&=!y;I:if(t){if(z)for(i=0;i<n;i++)x[i]=j[i]-s[i];d++,t+=L(j,n),d--,m=t>m?a=c,t:m;}}if(w){for(y=0;y<n;y++)R[N][y]=s[y];A[N][0]=a;A[N++][1]=m;}J:if(d+m>=M)M=d+m,b[d]=a;if(!d)N=0,M=0,puts(b);return m;}

এবং এখানে এটি "পাঠযোগ্যতা" এর জন্য অবমুক্ত করা হয়েছে:

d,M,N,A[9999][2];
char*(R[9999][20]),b[1000];
L(char**s,n){
    char*j[20],c,a=0;
    int x[n],y=n-1,z,i,t,m=0,w=1;
    for(;y;)
        x[y--]=999;
    for(;y<N;y++){
        for(i=0;i<n&&s[i]==R[y][i];i++);
        if(i/n){
            a=A[y][0];
            m=A[y][1];
            w=0;
            if(m+d<M||!a)
                goto J;
            else{
                c=a;
                goto K;
            }
        }
    }
    for(c=97;w&&c<'{';c++){
        K:
        t=1,
        y=1,
        z=1;
        for(i=0;i<n;j[i++]++){
            for(j[i]=s[i];*j[i]-c;j[i]++)
                t&=!!*j[i];
            y&=j[i]-s[i]>x[i]?z=0,1:0;
        }
        t&=!y;
        I:
        if(t){
            if(z)
                for(i=0;i<n;i++)
                    x[i]=j[i]-s[i];
            d++,
            t+=L(j,n),
            d--,
            m=t>m?a=c,t:m;
        }
    }
    if(w){
        for(y=0;y<n;y++)R[N][y]=s[y];
        A[N][0]=a;
        A[N++][1]=m;
    }
    J:
    if(d+m>=M)
        M=d+m,b[d]=a;
    if(!d)
        N=0,M=0,puts(b);
    return m;
}

মহিলা ও ভদ্রলোক, আমি একটি ভয়াবহ ভুল করেছি। এটা তোলে ব্যবহৃত সুন্দর হতে ... এবং এতে যান-কম ... এখন অন্তত এটা ফাস্ট

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

অভিগমন

কোডটি বিভ্রান্ত হওয়া সত্ত্বেও, কৌশলটি এখানে খুব জটিল নয়। আমরা বরং একটি নিষ্পাপ পুনরাবৃত্ত আলগোরিদিম দিয়ে শুরু করি, যা আমি সিউডোকোড দিয়ে বর্ণনা করব:

Function L (array of strings s, number of strings n), returns length:

Create array of strings j of size n;

For each character c in "a-z",
    For each integer i less than n,
         Set the i'th string of j to the i'th string of s, starting at the first appearance of c in s[i]. (e.g. j[i][0] == c)
         If c does not occur in the i'th string of s, continue on to the next c.
    end For

    new_length := L( j, n ) + 1; // (C) t = new_length
    if new_length > best_length
        best_character := c; // (C) a = best_character
        best_length := new_length; // (C) m = best_length
    end if
end For

// (C) d = current_depth_in_recursion_tree
if best_length + current_depth_in_recursion_tree >= best_found
     prepend best_character to output_string // (C) b = output_string
     // (C) M = best_found, which represents the longest common substring found at any given point in the execution.
     best_found = best_length + current_depth;
end if

if current_depth_in_recursion_tree == 0
    reset all variables, print output_string
end if 

return best_length

এখন, এই অ্যালগরিদমটি নিজেরাই বেশ নৃশংস (তবে প্রায় 230 ডলার বাইটে ফিট হতে পারে, আমি খুঁজে পেয়েছি)। এইভাবে কেউ দ্রুত ফলাফল পায় না। এই অ্যালগরিদমটি স্ট্রিং দৈর্ঘ্যের সাথে অবিশ্বাস্যভাবে দুর্বল। এই অ্যালগরিদম নেই , তবে, মোটামুটি ভাল স্ট্রিং বৃহত্তর সংখ্যার স্কেল। শেষ পরীক্ষার কেসটি কার্যত তাত্ক্ষণিকভাবে সমাধান করা হবে, কারণ কোনও স্ট্রিংয়ের sকোনও অক্ষরই cমিল নেই have আমি উপরে দুটি বাস্তব কৌশল প্রয়োগ করেছি যার ফলে অবিশ্বাস্য গতি বৃদ্ধি পেয়েছিল:

  • প্রতি কল এ L, আমাদের আগে এই একই ইনপুট দেওয়া হয়েছিল কিনা তা পরীক্ষা করে দেখুন । যেহেতু অনুশীলনে তথ্য একই পংক্তির মাধ্যমে একই স্ট্রিংগুলিতে প্রেরণ করা হয়, তাই আমাদের আসলে স্ট্রিংগুলির তুলনা করতে হবে না , কেবলমাত্র অবস্থানগুলি, যা দুর্দান্ত। যদি আমরা দেখতে পাই যে আমরা এই তথ্যটি আগে পেয়েছি, গণনাগুলি চালানোর দরকার নেই (বেশিরভাগ সময়, তবে আউটপুট পাওয়া এটিকে আরও জটিল করে তোলে) এবং আমরা কেবল দৈর্ঘ্য ফিরিয়ে দিয়ে পালাতে পারি। আমরা যদি কোনও মিল খুঁজে না পাই তবে ভবিষ্যতের কলগুলির সাথে তুলনা করতে এই ইনপুট / আউটপুটটির সেটটি সংরক্ষণ করুন। সি কোডে, দ্বিতীয় forলুপটি ইনপুটটির সাথে মিল খুঁজে পাওয়ার চেষ্টা করে। পরিচিত ইনপুট পয়েন্টারগুলিতে সংরক্ষণ করা হয় Rএবং সংশ্লিষ্ট দৈর্ঘ্য এবং অক্ষরের আউটপুট মানগুলি সংরক্ষণ করা হয়A। এই পরিকল্পনার রানটাইমের উপর বিশেষত দীর্ঘতর স্ট্রিংগুলির সাথে কঠোর প্রভাব ছিল।

  • প্রতিটি সময় আমরা অবস্থানে এটি cমধ্যে s, একটি সুযোগ আমরা ডান বাদুড় বন্ধ জানি যে কি আমরা পেয়েছি অনুকূল নয়। যদি প্রতিটি অবস্থানের অন্য কোনও বর্ণের কিছু পরিচিত অবস্থানের পরেc উপস্থিত হয় তবে আমরা স্বয়ংক্রিয়ভাবে জানি যে এটি cএকটি সর্বোত্তম স্তরকে বাড়ে না কারণ আপনি এটিতে আরও একটি অক্ষর ফিট করতে পারেন fit এর অর্থ হ'ল অল্প ব্যয়ের জন্য আমরা Lবড় বড় স্ট্রিংয়ের জন্য কয়েকশ কল কল করতে পারি । উপরের সি yকোডটিতে একটি পতাকা সেট রয়েছে যদি আমরা স্বয়ংক্রিয়ভাবে জানতে পারি যে এই চরিত্রটি একটি সাবপটিমাল স্ট্রিংয়ের দিকে পরিচালিত করে, এবং zআমরা যদি এমন কোনও চরিত্র পাই যা অন্য কোনও পরিচিত চরিত্রের চেয়ে একচেটিয়াভাবে পূর্বের উপস্থিতিগুলি খুঁজে পেয়ে থাকে। অক্ষরের বর্তমানতম উপস্থিতি সংরক্ষণ করা হয়x। এই ধারণার বর্তমান বাস্তবায়ন কিছুটা অগোছালো তবে অনেক ক্ষেত্রে প্রায় দ্বিগুণ কর্মক্ষমতা।

এই দুটি ধারণার সাহায্যে, এক ঘন্টার মধ্যে যা শেষ হয়নি তা এখন প্রায় 0.015 সেকেন্ড সময় নেয়।

সম্ভবত আরও অনেক ছোট কৌশল রয়েছে যা পারফরম্যান্সকে গতিময় করতে পারে, তবে এই মুহুর্তে আমি সবকিছু গল্ফ করার ক্ষমতা নিয়ে চিন্তিত হতে শুরু করি। আমি এখনও গল্ফ নিয়ে সন্তুষ্ট নই, তাই সম্ভবত আমি পরে এটিতে ফিরে আসব!

সময়

এখানে কিছু টেস্টিং কোড রয়েছে, যা আমি আপনাকে অনলাইনে চেষ্টা করার জন্য আমন্ত্রণ জানিয়েছি :

#include "stdio.h"
#include "time.h"

#define SIZE_ARRAY(x) (sizeof(x) / sizeof(*x))

int main(int argc, char** argv) {
    /* Our test case */
    char* test7[] = {
        "nqrualgoedlf",
        "jgqorzglfnpa",
        "fgttvnogldfx",
        "pgostsulyfug",
        "sgnhoyjlnfvr",
        "wdttgkolfkbt"
    };

    printf("Test 7:\n\t");
    clock_t start = clock();

    /* The call to L */
    int size = L(test7, SIZE_ARRAY(test7));


    double dt = ((double)(clock() - start)) / CLOCKS_PER_SEC;
    printf("\tSize: %d\n", size);
    printf("\tElapsed time: %lf s\n", dt);

    return 0;
}

আমি অপ্টিমাইজেশন সেটিং সহ একটি 1.7 গিগাহার্টজ ইন্টেল কোর আই 7 চিপযুক্ত একটি ল্যাপটপে ওপির পরীক্ষার কেসগুলি চালিয়েছি -Ofast। সিমুলেশনটি 712KB প্রয়োজনের একটি শীর্ষের প্রতিবেদন করেছে। সময় সহ প্রতিটি পরীক্ষার মামলার উদাহরণ এখানে দেওয়া হয়েছে:

Test 1:
    a
    Size: 1
    Elapsed time: 0.000020 s
Test 2:
    x
    Size: 1
    Elapsed time: 0.000017 s
Test 3:
    hecbpyhogntqppcqgkxchpsieuhbmcbhuqdjbrqmclchqyfhtdvdoysuhrrl
    Size: 60
    Elapsed time: 0.054547 s
Test 4:
    ihicvaoodsnktkrar
    Size: 17
    Elapsed time: 0.007459 s
Test 5:
    krkk
    Size: 4
    Elapsed time: 0.000051 s
Test 6:
    code
    Size: 4
    Elapsed time: 0.000045 s
Test 7:
    golf
    Size: 4
    Elapsed time: 0.000040 s
Test 8:

    Size: 0
    Elapsed time: 0.000029 s


Total time: 0.062293 s

গল্ফিংয়ের ক্ষেত্রে, আমি পারফরম্যান্সের পরিবর্তে উল্লেখযোগ্যভাবে হিট করেছি এবং যেহেতু লোকেরা আমার আগের 618-বাইট সমাধানের ব্রুট স্পিড (0.013624 গুলি সংযুক্ত সমস্ত পরীক্ষার সংশ্লেষ সম্পন্ন করতে) পছন্দ করেছে, তাই আমি এখানে রেফারেন্সের জন্য রেখে দেব:

d,M,N,A[9999][2];char*(R[9999][20]),b[1000];L(char**s,n){char*j[20],c,a=0;int x[n],y,z,i,t,m=0,w=1;for(y=0;y<n;y++)x[y]=999;for(y=0;y<N;y++){for(i=0;i<n;i++)if(s[i]!=R[y][i])break;if(i==n){a=A[y][0];m=A[y][1];w=0;if(m+d<M||!a)goto J;else{c=a;goto K;}}}for(c=97;w&&c<'{';c++){K:t=1,y=1,z=1;for(i=0;i<n;j[i++]++){for(j[i]=s[i];*j[i]-c;j[i]++)if(!*j[i]){t=0;goto I;}if(j[i]-s[i]>x[i])z=0;if(j[i]-s[i]<x[i])y=0;}if(y){t=0;}I:if(t){if(z){for(i=0;i<n;i++){x[i]=j[i]-s[i];}}d++,t+=L(j,n),d--,m=t>m?(a=c),t:m;}}if(w){for(y=0;y<n;y++)R[N][y]=s[y];A[N][0]=a;A[N++][1]=m;}J:if(d+m>=M)M=d+m,b[d]=a;if(!d)N=0,M=0,puts(b);return m;}

অ্যালগরিদম নিজেই অপরিবর্তিত, তবে নতুন কোডটি বিভাগগুলি এবং কিছু কৌশলযুক্ত বিটওয়াইজ অপারেশনগুলির উপর নির্ভর করে যা পুরো বিষয়টি ধীর করে দেয়।


আমি একই ধরণের বিষয়ে দ্রুততম কোড চ্যালেঞ্জ পোস্ট করার বিষয়ে ভাবছিলাম, তবে দেখে মনে হচ্ছে আমার আর দরকার নেই। 0.01s এবং 712KB কেবল অবাক করা।
ডেনিস

এটি কেবল আশ্চর্যজনক!
kirbyfan64sos

আপনার ব্যাখ্যার সন্ধান করছেন, হেক কি best_found? এটি কেবল দু'বার উল্লেখ করা হয়েছে, একবার যখন এটি শর্তাধীন ব্যবহৃত হয় এবং অন্যটি পুনরায় সেট করা হয়।
kirbyfan64sos

সি উত্সের উপর নজর দিলে মনে best_foundহয় এটি সেট হয়ে গেছে best_length + current_depth। আপনার সম্ভবত এটি ব্যাখ্যায় উল্লেখ করা উচিত!
kirbyfan64sos

@ kirbyfan64sos best_foundএকটি গ্লোবাল পূর্ণসংখ্যা যা কার্যকর করার কোনও নির্দিষ্ট সময়ে পাওয়া দীর্ঘতম সাধারণ স্ট্র্রিংয়ের দৈর্ঘ্য বর্ণনা করে। আমি ব্যাখ্যায় রাখব!
ব্রেইনস্টিল

1

পাইথন 2, 285

কোড:

import re
def f(s,a,b):
  if b==[]:return s+f('',[],a)
  if a==[]:return s+max([f(b[0][i],[b[0][i+1:]],b[1:]) for i in range(len(b[0]))],key=len) if b[0]!='' else ''
  return max([f(s,a+[b[0][i.start()+1:]],b[1:]) for i in re.finditer(s[-1],b[0])],key=len) if ~b[0].find(s[-1]) else ''

ব্যবহার:

print f('',[],['axbycz','xaybzc'])

ব্যাখ্যা:

এটি একটি পুনরাবৃত্তি ফাংশন। sআমরা যে চরিত্রটি সন্ধান করছি is aপরে কাটা স্ট্রিংয়ের তালিকা রয়েছে sbস্ট্রোলের তালিকাটি এখনও অবিকৃত রয়েছে। fদীর্ঘতম সাধারণ স্ট্রিং প্রদান করে returns

প্রথম শর্তটি পরীক্ষা করে যদি আমরা সমস্ত স্ট্রিংয়ের মধ্য দিয়ে যেতে পেরেছি। যদি তা হয় তবে এর অর্থ sসাধারণ চরিত্র এবং এটি ফিরে আসে sএবং আরও সাধারণ অক্ষর সন্ধান করে।

দ্বিতীয় শর্তটি পরীক্ষা করে যদি আমরা কোনও স্ট্রিংয়ের মধ্য দিয়ে যেতে না শুরু করি যার অর্থ আমাদের একটি অক্ষরও নেই ( a==[]সমতুল্য s=='')। যদি তাই হয় তবে আমরা প্রথম স্ট্রিংয়ের প্রতিটি অক্ষর চেক করি b

শেষ পংক্তিতে প্রথম স্ট্রিংটি সরানো bহয় a, sএই স্ট্রিংয়ের প্রতিটি ঘটনা খুঁজে পেয়ে ।

প্রথম কলটিতে, sখালি স্ট্রিং হওয়া উচিত। aখালি তালিকা bহওয়া উচিত এবং এতে সমস্ত স্ট্রিং থাকা উচিত।


2
আপনার ডিফল্ট আর্গুমেন্টগুলি ব্যবহার করা উচিত যাতে কেবল স্ট্রিংগুলিকে ফাংশনে সরবরাহ করা প্রয়োজন, যেমন f(b,s='',a=[])
মলমূত্র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.