সর্বাধিক সাবস্ট্রিং নির্মাণ


18

এই চ্যালেঞ্জে, আপনি দুটি জিনিস পাস করেছেন:

  1. একটি স্ট্রিং দৈর্ঘ্য, N
  2. Lএকটি নির্দিষ্ট পয়েন্ট মান সহ স্ট্রিংগুলির একটি তালিকা । যে স্ট্রিংটি পাস করা হয় না তার 0 পয়েন্টের মান থাকে

আপনাকে দৈর্ঘ্যের একটি স্ট্রিং তৈরি Nকরতে হবে যাতে সমস্ত সাবস্ট্রিং পয়েন্টের যোগফল যতটা সম্ভব বড় হয়।

উদাহরণ স্বরূপ:

5 [("ABC", 3), ("DEF", 4), ("CDG", 2)]

আউটপুট করা উচিত

ABCDG

কারণ পয়েন্ট ( ABCএবং CDG) সহ দুটি সাবস্ট্রিংয়ের মোট 5 পয়েন্ট রয়েছে এবং অন্য কোনও সম্ভাব্য নির্মাণ 5 বা ততোধিক পয়েন্ট দিতে পারে না।

সাবস্ট্রিংগুলি স্ট্রিংয়ে একাধিকবার ব্যবহার করা যেতে পারে এবং ওভারল্যাপ করতে পারে। আপনি ধরে নিতে পারেন যে পয়েন্টগুলি সর্বদা ইতিবাচক থাকবে, স্তরটির দৈর্ঘ্য 1 থেকে Nঅক্ষরের দীর্ঘ হবে এবং এটি N > 0। যদি একাধিক নির্মাণ সর্বাধিক হয় তবে এগুলির যে কোনও একটি মুদ্রণ করুন।

আপনার প্রোগ্রামটি অবশ্যই যুক্তিসঙ্গত পরিমাণে চলবে (প্রতিটি উদাহরণের জন্য এক মিনিটের বেশি নয়):

1 [("A", 7), ("B", 4), ("C", 100)]     => C
2 [("A", 2), ("B", 3), ("AB", 2)]      => AB
2 [("A", 1), ("B", 2), ("CD", 3)]      => BB
2 [("AD", 1), ("B", 2), ("ZB", 3)]     => ZB
3 [("AB", 2), ("BC", 1), ("CA", 3)]    => CAB
3 [("ABC", 4), ("DEF", 4), ("E", 1)]   => DEF
4 [("A", 1), ("BAB", 2), ("ABCD", 3)]  => AAAA or ABAB or BABA or ABCD
5 [("A", 1), ("BAB", 2), ("ABCD", 3)]  => BABCD or BABAB
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)] => ABCDG
5 [("AB", 10), ("BC", 2), ("CA", 2)]   => ABCAB
6 [("AB", 10), ("BC", 2), ("CA", 2)]   => ABABAB
8 [("AA", 3), ("BA", 5)]               => BAAAAAAA
10 [("ABCDE", 19), ("ACEBD",  18), ("ABEDC", 17), ("BCEDA", 16), ("EBDAC", 15), ("BACD", 14), ("CADB", 13), ("ABDC", 12), ("CABD", 11), ("EBDC", 10), ("ACE", 9), ("CBA", 8), ("AEC", 7), ("BE", 6), ("AE", 5), ("DC", 4), ("BA", 3), ("A", 2), ("D", 1)]
=> ACEBDACEBD

এটি একটি , তাই আপনার পছন্দের ভাষায় আপনার সংক্ষিপ্ত উত্তরটি প্রস্তুত করুন!


আমাদের কি আপনার সঠিক ইনপুট ফর্ম্যাটটি ব্যবহার করতে হবে বা আমরা আমাদের ভাষার জন্য কোনও সুবিধাজনক ইনপুট ফর্ম্যাট ব্যবহার করতে পারি?
flawr

@ অবৈধ ইনপুট যে কোনও সুবিধাজনক পদ্ধতি ভাল (অভিধান, স্টিডিন, ফাংশন প্যারাম)
নাথান মেরিল

DEFTuple একটি কমা অনুপস্থিত
isaacg

আমার কাছে একটি দুর্দান্ত সমাধান আছে তবে এটি শেষ পরীক্ষার ক্ষেত্রে খুব ধীর।
isaacg

1
@ আইসএইচজি আমার একটি মার্জিত সমাধান রয়েছে, দুঃখের বিষয় এই মন্তব্যটি এটির পক্ষে খুব ছোট। (আমি কেবল
ফর্ম্যাটকে

উত্তর:


1

পাইথন 2.7, 503 বাইট

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

import re
v=lambda l,s:sum([len([m.start() for m in re.finditer('(?=%s)'%u,s)])*v for u,v in l])
def m(n,l,e):
 if len(e)==n:
  yield e
 else:
  u=1
  for s,v in sorted(l,key=lambda j:j[1],reverse=True):
   for i in range(len(s)-1,0,-1):
    if len(e)+len(s)-i <= n and e.endswith(s[:i]):
     for r in m(n,l,e+s[i:]):
      u=0;yield r
   if len(e)+len(s)<=n:
    for r in m(n,l,e+s):
     u=0;yield r
  if u:
   yield e
def p(n,l):
 b,r=-1,0
 for s in m(n,l,''):
  a=v(l,s)
  if a>b:b,r=a,s
 return r

এটি পরীক্ষা করার জন্য:

if __name__ == "__main__":
    for n, l in [
            (1, [("A", 7), ("B", 4), ("C", 100)]),     # => C
            (2, [("A", 2), ("B", 3), ("AB", 2)]),      # => AB
            (2, [("A", 1), ("B", 2), ("CD", 3)]),      # => BB
            (2, [("AD", 1), ("B", 2), ("ZB", 3)]),     # => ZB
            (3, [("AB", 2), ("BC", 1), ("CA", 3)]),    # => CAB
            (3, [("ABC", 4), ("DEF", 4), ("E", 1)]),   # => DEF
            (4, [("A", 1), ("BAB", 2), ("ABCD", 3)]),  # => AAAA or ABAB or BABA or ABCD
            (5, [("A", 1), ("BAB", 2), ("ABCD", 3)]),  # => BABCD or BABAB
            (5, [("ABC", 3), ("DEF", 4), ("CDG", 2)]), # => ABCDG
            (5, [("AB", 10), ("BC", 2), ("CA", 2)]),   # => ABCAB
            (6, [("AB", 10), ("BC", 2), ("CA", 2)]),   # => ABABAB
            (8, [("AA", 3), ("BA", 5)]),               # => BAAAAAAA
            (10, [("ABCDE", 19), ("ACEBD",  18), ("ABEDC", 17), ("BCEDA", 16), ("EBDAC", 15), ("BACD", 14), ("CADB", 13), ("ABDC", 12), ("CABD", 11), ("EBDC", 10), ("ACE", 9), ("CBA", 8), ("AEC", 7), ("BE", 6), ("AE", 5), ("DC", 4), ("BA", 3), ("A", 2), ("D", 1)]) # => ACEBDACEBD
    ]:
        print p(n, l)

ব্যাখ্যা

vফাংশন কেবল সাবস্ট্রিং এল এর সব ঘটনার জন্য অনুসন্ধান দ্বারা একটি প্রদত্ত স্ট্রিং এর মান গণনা mফাংশন দৈর্ঘ্যের সমস্ত স্ট্রিং উল্লেখ nপ্রেফিক্স সহ eমধ্যে সাবস্ট্রিং থেকে উত্পন্ন করা যায় যে lmপুনরাবৃত্তভাবে নিজেকে কল; প্রথম কল মধ্যে পাস করা উচিত ''জন্য e। উদাহরণ স্বরূপ:

>>> for s in m(4, [("A", 1), ("BAB", 2), ("ABCD", 3)], ''):print s
ABCD
BABA
ABCD
ABAB
AAAA

p(যেমন দ্বারা গণিত ফাংশন কেবল সব সম্ভব স্ট্রিং মাধ্যমে loops m) এবং সর্বোচ্চ মান এক (যেমন দ্বারা নির্ধারিত ফেরৎ v)।

মনে রাখবেন যে mফাংশনটি সাবস্ট্রিংয়ের মানগুলির উপর ভিত্তি করে বাছাই করে প্রকৃতিকে অগ্রাধিকার দেয়। এটি অনুকূলতা নিশ্চিত করার জন্য অপ্রয়োজনীয় হিসাবে প্রমাণিত হয় এবং এটি কার্যক্ষমতাকে কিছুটা বাধা দেয়; আমি এটিকে সরিয়ে 20 ডলার বা তার বেশি বাইট সঞ্চয় করতে পারি।

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