একটি শব্দ তালিকা থেকে সংক্ষিপ্ততম পেংগ্রামগুলি সন্ধান করুন


10

একটি পেঙ্গ্রাম হ'ল একটি স্ট্রিং যাতে প্রতিটি বর্ণ থাকে a- zইংরেজী বর্ণমালা, কেস-সংবেদনশীল। (প্যাং্রামে যদি কোনও চিঠির একাধিক অনুলিপি থাকে, বা এতে অক্ষরগুলি ছাড়াও অক্ষরযুক্ত অক্ষর থাকে তবে এটি ঠিক আছে))

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যার ইনপুটটি স্ট্রিংগুলির একটি তালিকা এবং যা নীচে বৈশিষ্ট্যযুক্ত এক বা একাধিক স্ট্রিংকে আউটপুট দেয়:

  • প্রতিটি আউটপুট স্ট্রিং অবশ্যই প্যাংগ্রাম হতে হবে।
  • প্রতিটি আউটপুট স্ট্রিং ফাঁকা করে পৃথক করে ইনপুট তালিকা থেকে এক বা একাধিক স্ট্রিংকে সংযুক্ত করে গঠন করতে হবে।
  • এই বৈশিষ্ট্যগুলি সহ সমস্ত স্ট্রিংয়ের মধ্যে প্রতিটি আউটপুট স্ট্রিং অবশ্যই সংক্ষিপ্ত বা সংক্ষিপ্ততার জন্য আবদ্ধ হওয়া উচিত।

অনেক প্রোগ্রাম কেবল একটি স্ট্রিং আউটপুট বেছে নেবে; আপনি কেবলমাত্র একাধিক স্ট্রিং আউটপুট দিতে চাই যদি অন্যথায় আউটপুট সীমাবদ্ধ করতে অতিরিক্ত কোড লিখতে হয়।

আপনি ধরে নিতে পারেন যে ইনপুটটিতে কোনও অপ্রিন্টযোগ্য অক্ষর বা স্পেস নেই, এবং এর কোনও শব্দই (তালিকার দৈর্ঘ্যের প্রাকৃতিক লোগারিদমের 26 গুণ) অক্ষর দীর্ঘ নয়। (তবে আপনি ধরেই নিতে পারেন না যে ইনপুটটিতে অক্ষর বা কেবল ছোট হাতের অক্ষর ব্যতীত কিছুই নেই; বিরাম চিহ্ন এবং বড় হাতের অক্ষর সম্পূর্ণভাবে সম্ভব are)

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

abcdefghi
defghijkl
ijklmnop
lmnopqrs
opqrstuvw
rstuvwxyz

আপনার জমা দেওয়ার পাশাপাশি আপনার প্রোগ্রামের আউটপুটটির একটি নমুনা অন্তর্ভুক্ত করা উচিত। (বিভিন্ন শব্দ তালিকাগুলি ব্যবহারের ফলে এটি বিভিন্ন ব্যক্তির পক্ষে পৃথক হতে পারে))

বিজয় শর্ত

এটি একটি চ্যালেঞ্জ। বিজয়ী হ'ল সংক্ষিপ্ততম প্রোগ্রাম (বাইটে) যা বহুগুণে চলে । (এমন লোকদের জন্য সংক্ষিপ্তসারগুলি যা এর অর্থ জানেন না: আপনি যদি শব্দের তালিকার আকার দ্বিগুণ করেন তবে প্রোগ্রামটি ধ্রুবক ফ্যাক্টরের চেয়ে ধীরে ধীরে কম হওয়া উচিত become তবে, প্রশ্নটির ধ্রুবক ফ্যাক্টরটি আপনার মতো বড় হতে পারে উদাহরণস্বরূপ, এটি চারগুণ ধীর বা আটগুণ ধীর হয়ে যাওয়ার পক্ষে বৈধ, তবে শব্দের তালিকার দৈর্ঘ্যের একটি ফ্যাক্টর দ্বারা এটি ছোট হওয়ার পক্ষে নয়; যে উপাদানটির মাধ্যমে এটি ধীর হয়ে যায় তাকে আবদ্ধ করতে হবে))


জটিলতা নির্ধারণ করার সময়, আমরা কি প্রতিটি শব্দটি সর্বাধিক ২ letters টি বর্ণের দীর্ঘ বলে প্রমাণ করতে পারি? বর্ণমালার আকারটি 26 টির ধ্রুবক?
xnor

হ্যাঁ. জটিলতাটিকে সংজ্ঞায়িত / গণনা করা সহজ করার জন্য আমি আংশিকভাবে সেখানে ইনপুটটিতে এই সীমাবদ্ধতা রেখেছি।

আমি মনে করি এটি প্রযুক্তিগতভাবে চলে। আপনি যদি বারবার ইনপুট শব্দের উপেক্ষা করেন তবে সর্বাধিক 27 ^ 26 সম্ভাব্য ইনপুট শব্দ রয়েছে এবং তাই সম্ভাব্য ইনপুট হিসাবে তাদের 2 টি (27 ^ 26) সম্ভাব্য সাবসেট রয়েছে। এটি বিশাল তবে ধ্রুবক। সুতরাং, এই সীমাবদ্ধ সেটটিতে যে কোনও প্রোগ্রাম স্থির-সময়, ধ্রুবকটি সমস্ত সম্ভাব্য ইনপুটগুলির উপরে সর্বাধিক সংখ্যক পদক্ষেপ গ্রহণ করে।
xnor

আমি বলিনি যে ইনপুটটিতে কোনও নকল শব্দ নেই। আমার ধারণা আপনি বিরাম চিহ্নগুলি ফিল্টার করে এবং প্রথমে ইনপুটটি ডুপ্লিকেট করে প্রোগ্রামটি "প্রযুক্তিগত" ও (এন) সময়ে চালাতে পারেন, যদিও (বা আরও বেশি সম্ভাবনা হে (এন লগ এন), যা একটি রেডিক্সের তুলনায় অনেক কম স্মৃতি ব্যবহার করবে) প্রতিলিপি হবে)। তারপরে আপনাকে ফিল্টার্ড সংস্করণ থেকে মূল শব্দ তালিকায় ফিরে যেতে হবে। যদিও আপনি প্রকৃতপক্ষে এই সমস্ত পদক্ষেপগুলি অতিক্রম না করা পর্যন্ত আপনি প্রশ্নে বহুপদী সময় দাবি করতে পারবেন না!

আমি চিঠিবিহীন সম্পর্কে ভুলে যেতে চাই আমরা কী এগুলি ASCII, বা অন্যথায় কিছু সীমাবদ্ধ সেট মধ্যে অনুমান করতে পারি? যদি তা হয়, তবে আমি মনে করি যে অনুলিপি দ্বারা শুরু হওয়া কোনও অ্যালগরিদম বহু-সময় বলে দাবি করতে পারে।
xnor

উত্তর:


3

রুবি 159 (পুনরাবৃত্ত)

চুনি 227 220 229 227 221 (পুনরাবৃত্ত)

নতুন পুনরাবৃত্তি সমাধান (@ নিল বর্ণিত অ্যালগরিদমের ভিত্তিতে):

c={('A'..'Z').to_a=>""}
while l=gets
d=c.clone
c.map{|k,v|j=k-l.upcase.chars
w=v+" "+l.strip
d[j]=w if !c[j]||c[j].size<w.size}
c=d
end
x=c[[]]
p x[1..-1] if x

পুরাতন পুনরাবৃত্ত সমাধান:

W=[]
while l=gets
W<<l.strip
end
I=W.join(" ")+"!!"
C={[]=>""}
def o(r)if C[r]
C[r]
else
b=I
W.map{|x|s=r-x.upcase.chars
if s!=r
c=x+" "+o(s)
b=c if c.size<b.size
end}
C[r]=b
end
end
r=o ('A'..'Z').to_a
p r[0..-2] if r!=I

বাইট পরিমাপটি ফাইলে চূড়ান্ত নিউলাইন ছেড়ে যাওয়ার উপর ভিত্তি করে তৈরি হয়, এতে কিছু আসে যায় না ruby 2.3.1p112। একটি ছোট বাগ ঠিক করার পরে বাইট গণনাটি ফিরে এসেছিল (যোগ করা হচ্ছে).downcase .upcase সমস্যা বিবৃতি দ্বারা প্রয়োজন হিসাবে কেস-সংবেদনশীলতা জন্য)।

শনাক্তকরণ শনাক্তকারী এবং এর আগে পূর্ববর্তী সংস্করণ এখানে:

#!/usr/bin/env ruby

$words = [];

while (line=gets)
  $words << line[0..-2];
end

$impossible = $words.join(" ")+"!!";

$cache = {};

def optimize(remaining)
  return $cache[remaining] if ($cache[remaining]);
  return "" if (remaining == []);

  best = $impossible;

  $words.each{|word|
    remaining2 = remaining - word.chars;
    if (remaining2 != remaining)
      curr = word + " " + optimize(remaining2);
      best = curr if (curr.length < best.length);
    end
  };

  $stderr.puts("optimize(#{remaining.inspect})=#{best.inspect}");

  return $cache[remaining] = best;
end

result = optimize(('a'..'z').to_a);

puts(result[0..-1]);

এটা কিভাবে কাজ করে? এটি মূলত কভার করার জন্য অক্ষরগুলির একটি সেট বজায় রাখে এবং কেবল কোনও শব্দে পুনরাবৃত্তি করে যদি এটি অনাবৃত সেট হ্রাস করে। অধিকন্তু, পুনরাবৃত্তির ফলাফলগুলি স্মৃতিচারণ করা হয়। 2 ^ 26 এর প্রতিটি উপসেট একটি স্মৃতিচারণ টেবিল এন্ট্রির অনুরূপ। এই জাতীয় প্রতিটি এন্ট্রি ইনপুট ফাইলের আকারের সমানুপাতিক সময়ে গণনা করা হয়। সুতরাং পুরো জিনিসটি হল O(N)( Nইনপুট ফাইলের আকারটি কোথায় ) তবে একটি বিশাল ধ্রুবক সহ।


1

জাভাস্ক্রিপ্ট (ES6), 249 248 বাইট, সম্ভবত প্রতিযোগিতা

a=>a.map(w=>w.replace(/[a-z]/gi,c=>b|=1<<parseInt(c,36)-9,b=0,l=w.length)&&(m.get(b)||[])[0]<l||m.set(b,[l,w]),m=new Map)&&[...m].map(([b,[l,w]])=>m.forEach(([t,s],e)=>(m.get(e|=b)||[])[0]<=t+l||m.set(e,[t+l+1,s+' '+w])))&&(m.get(-2^-1<<27)||[])[1]

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


মজাদার. এটি কীভাবে কাজ করে এবং যদি পাওয়া যায়, অবহেলাবিহীন কোডটি কীভাবে পোস্ট করতে পারেন তবে আপনি কী আরও ব্যাখ্যা করতে পারবেন?
ডিপ্রেশনডানিয়েল

1
এটি একটি বৈধ / প্রতিযোগিতামূলক এন্ট্রি হওয়া উচিত। আমি মনে করি এটি আসলে ও ( এন লগ এন ) এ চলে! (মানচিত্রে 2²⁶ টি প্রবেশের সীমাবদ্ধতা রয়েছে, এবং জটিলতায় এটি প্রদর্শিত হয় না; সুতরাং কেবল সময় ব্যয় করা সময়টি ইনপুট পড়ার সময় হয়))

আমি কেবল বিবরণটি পুনরায় পড়ি এবং এখন এটি কীভাবে কাজ করে তা আমি পেয়েছি। ঝরঝরে। +1 ... হুম, জোড় জোড় বিবেচনা করে মানচিত্রটি বাড়ানোর চেষ্টা বন্ধ করার সিদ্ধান্ত কখন নেয়? কোনও অবকাশ সম্ভব না হওয়া পর্যন্ত এটি চালিয়ে যাওয়া উচিত should
হতাশাডানিয়েল

@ ডিপ্রেসডডানিয়েল মূল শব্দ তালিকা থেকে প্রাপ্ত প্রতিটি বিটমাস্কের জন্য, এটি এখন পর্যন্ত পাওয়া সমস্ত আংশিক পেংগ্রামগুলি পরীক্ষা করে এবং শব্দটি যুক্ত করে একটি পেংগ্রাম তৈরি করে যা বর্তমানে এটি সম্মিলিত বিটমাস্কের জন্য জানে তার চেয়ে কম।
নীল

@ ais523 বড় ইনপুটগুলির জন্য (> 1000 শব্দ), বেশিরভাগ সময় অদলবদল করতে ব্যয় করা হয় বলে মনে হয়। আমি একটি মানচিত্র থেকে একটি অ্যারেতে স্যুইচ করার চেষ্টা করেছি এবং এটি আরও ধীর হয়ে গেছে!
নীল

-1

পাইথন 3, 98 , 94 , 92 বাইট

print([s for s in input().split()if sum([1 for c in range(65,91)if chr(c)in s.upper()])>25])

বর্ণমালার ASCII উপস্থাপনার মাধ্যমে আইট্রেট করে এবং অক্ষরে স্ট্রিংয়ের সন্ধান পাওয়া গেলে একটি তালিকায় একটি 1 যুক্ত করে। যদি তালিকাটির যোগফল 25 টিরও বেশি হয় তবে এতে বর্ণমালার সমস্ত অক্ষর রয়েছে এবং মুদ্রিত হবে।


আমি মনে করি আপনি (' ')এবং এর মধ্যে একটি স্থান সরাতে পারেন if। আপনি পরিবর্তন ord(i) in range(65,91)করতে পারেন 91>x>=65। এছাড়াও, জটিলতা কি?
নন ইনি এখানে

1
এই সমাধানের জটিলতা কী? এটা তোলে হয় প্রয়োজনীয় উত্তর বহুপদী জটিলতা হতে জন্য, অন্যথায় এটি অ প্রতিদ্বন্দ্বী হয়।
নন ইনি এখানে

দুঃখিত, আমি মনে করি এটি ও (এন), কারণ ইনপুট তালিকা দৈর্ঘ্যে পরিবর্তিত হতে পারে তবে
এরিচ

দুঃখিত, আমি মনে করি এটি ও (এন), কারণ ইনপুট তালিকা দৈর্ঘ্যে পরিবর্তিত হতে পারে তবে দ্বিতীয় লুপটি সর্বদা 65 থেকে 90 পর্যন্ত চলে যায় But তবে আমি এটি পরীক্ষা করে দেখিনি।
এরিচ

নিশ্চিত না যে এটি সন্তুষ্ট "এই বৈশিষ্ট্যগুলির সাথে সমস্ত স্ট্রিংয়ের মধ্যে প্রতিটি আউটপুট স্ট্রিং অবশ্যই সংক্ষিপ্ত বা সংক্ষিপ্ততার জন্য আবদ্ধ হওয়া উচিত।"
ডিপ্রেশনডানিয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.