একটি শব্দের গ্রাফের ব্যাস খুঁজুন


13

ভূমিকা

একটি জনপ্রিয় শব্দ ধাঁধা হ'ল এক শব্দকে অন্য এক ধরণের পদক্ষেপের মাধ্যমে রূপান্তর করা যা কেবলমাত্র একটি অক্ষর প্রতিস্থাপন করে এবং যার ফলে সর্বদা একটি বৈধ শব্দের ফলাফল হয়। উদাহরণস্বরূপ, ব্যাগ পাঁচটি ধাপের পথ দিয়ে ডিওজে রূপান্তর করতে পারে:

ব্যাগ -> বিট -> বিড়াল -> কোট -> সিওজি -> ডগ

এই ক্ষেত্রে ছোট পথগুলিও বিদ্যমান; উদাহরণ স্বরূপ:

ব্যাগ -> বিওজি -> ডগ

যদি কোনও গ্রাফ আঁকেন যার অক্ষকে শব্দের দ্বারা লেবেলযুক্ত একটি অক্ষর দ্বারা পৃথক যে কোনও জোড় শব্দের মধ্যে একটি প্রান্ত থাকে, তবে "বিএজি" থেকে "ডিওজি" পর্যন্ত সংক্ষিপ্ততম পথটি দুটি কিনারা নিয়ে গঠিত।

চ্যালেঞ্জ

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

  • এই দুটি শব্দের মধ্যে আর কোনও পথের চেয়ে বেশি নয়;

  • অন্ততপক্ষে তালিকার অন্য কোনও জোড় শব্দের মধ্যে সংক্ষিপ্ততম পথ হিসাবে।

উপরে বর্ণিত গ্রাফের প্রসঙ্গে, এই জাতীয় পথের দৈর্ঘ্য হ'ল গ্রাফের ব্যাস

অধঃপতনের ক্ষেত্রে যেখানে ইনপুট শব্দের কোনওটিই অন্যের মধ্যে রূপান্তরিত করা যায় না, দৈর্ঘ্যের শূন্যের কমপক্ষে একটি পথ আউটপুট আউট, অর্থাৎ একক শব্দ।

উদাহরণ

  • ইনপুট ["ব্যাগ", "ব্যাট", "বিড়াল", "খাট", "বিন্দু", "কুকুর"] এই ক্রমে সমস্ত ছয়টি শব্দের (বা বিপরীত ক্রম) অতিক্রম করে একটি পথ অর্জন করা উচিত, যেহেতু " এই অভিধানের মধ্যে ব্যাগ "থেকে" কুকুর "দীর্ঘতম অর্জনযোগ্য, পাঁচটি পদক্ষেপ।

  • ইনপুট ["ব্যাগ", "ব্যাট", "বট", "বিড়াল", "খাট", "ডট", "কুকুর"] "ব্যাগ, ব্যাট, বট, ডট, কুকুর" এবং / অথবা তার উলটাপালটা।

  • ইনপুট ["কোড", "গল্ফ", "পুরুষ", "বাজ", "তিল", "ভূমিকা", "ছাঁচ", "ঠান্ডা", "সোনার", "মোড"] "কোডের মধ্যে একটি পথ অর্জন করবে" এবং "গল্ফ"

  • ইনপুট ["এক", "দুটি", "ছয়", "দশ"] কোন প্রান্তের সাথে কোনও গ্রাফের সাথে সামঞ্জস্য করে, সুতরাং এক বা একাধিক একক-শব্দের (শূন্য দৈর্ঘ্য) পাথ আউটপুট দেয়।

  • যদি ইনপুটটিতে অসম দৈর্ঘ্যের কোনও দুটি শব্দ থাকে তবে আউটপুট নির্ধারিত হয়।

বিধি

  • স্ট্যান্ডার্ড কোড গল্ফ বিধি প্রযোজ্য
  • একাধিক "সংক্ষিপ্ত" পাথ থাকবে। আপনাকে অবশ্যই কমপক্ষে একটি আউটপুট দিতে হবে তবে আপনি যতটা ইচ্ছা আউটপুট মুক্ত।
  • আপনার প্রোগ্রামে ইনপুট অভিধানটি কীভাবে পাস হবে তা আপনি নির্দ্বিধায়।
  • বাইটস মধ্যে সংক্ষিপ্ত কোড।

3
আরও কিছু পরীক্ষার মামলা যুক্ত করার মন?
জোনা

সম্পন্ন. গ্রাফের কোনও প্রান্ত নেই এমন ক্ষেত্রেও আলোচনা যুক্ত করা হয়েছে।
jnfnt


আমাদের কি খালি ইনপুট গ্রহণ করতে হবে (উত্তরটি হবে []বা [[]])?
এরিক আউটগল্ফার

আচরণটি খালি ইনপুটগুলিতে অপরিজ্ঞাত হওয়ার জন্য আমি খুশি।
jnfnt

উত্তর:



3

এপিএল (ডায়ালগ ক্লাসিক) , 84 80 77 76 74 66 61 বাইট

{⍵⌷⍨{⍵,⍨⊃⍋(1a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/⊃⍸a=d←⌈/512|,a←⌊.+⍨⍣≡9*⍨2⌊⍵+.≠⍉⍵}

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

ইনপুট এবং আউটপুট হল অক্ষর ম্যাট্রিক্স ric

⍵+.≠⍉⍵ শব্দের মধ্যে হাতুড়ির মতো দূরত্বের ম্যাট্রিক্স

9*⍨2⌊0 এবং 1 গুলি অক্ষত রেখে 2+ কে কিছু বড় সংখ্যায় পরিণত করুন (512 = 2 9 , "∞" হিসাবে ব্যবহৃত)

⌊.+⍨⍣≡ ফ্লয়েড এবং ওয়ারশাল'র সংক্ষিপ্ততম পথ অ্যালগরিদম

  • ⌊.+ম্যাট্রিক্স গুণনের মতো তবে min( ) ব্যবহার করে এবং যথাক্রমে এবং এর +পরিবর্তে+×

  • বাম এবং ডানদিকে একই ম্যাট্রিক্স ব্যবহার করুন

  • ⍣≡ একীকরণ পর্যন্ত পুনরাবৃত্তি

d←⌈/512|, নির্ধারিত দীর্ঘতম ("∞" নয়) পথের দৈর্ঘ্য d

⊃⍸a=কোন দুটি নোড এটি সংযুক্ত করে, আসুন আমি তাদেরকে i এবং j বলি

{⍵,⍨⊃⍋(1≠a⌷⍨⊃⍵),⍪⍺⌷a}⍣d/ পথ পুনর্গঠন

  • { }⍣d/{ }ফাংশন dসময় মূল্যায়ন । বাম দিকটি সর্বদা i । অধিকার ARG হিসাবে আরম্ভ করা হয় এবং ধীরে ধীরে পথ অভ্যন্তরীণ নোড accumulates

  • (1≠a⌷⍨⊃⍵),⍪⍺⌷a এই দুটি ভেক্টরের একটি 2-কলামের ম্যাট্রিক্স তৈরি করুন:

    • 1≠a⌷⍨⊃⍵ বুলিয়ানস (0 বা 1) নির্দেশ করে যে কোন নোডের প্রথমটির 1 থেকে দূরত্ব রয়েছে

    • ⍺⌷a সমস্ত গ্রাফ নোডের দূরত্ব

  • ⊃⍋ অভিধানের ক্ষুদ্রতম সারির সূচি

  • ⍵,⍨ preend to

⍵⌷⍨ মূল শব্দটিকে পথের সাথে সূচক করুন


2

পাইথন 3 , 225 বাইট

from itertools import*
def f(a):b=[((p[0],p[-1]),(len(p),p))for i in range(len(a))for p in permutations(a,i+1)if all(sum(q!=r for q,r in zip(*x))<2for x in zip(p,p[1:]))];return max(min(r for q,r in b if x==q)for x,y in b)[1]

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

মূলত, সমস্ত সম্ভাব্য পাথ গ্রহণ করুন, কেবলমাত্র বৈধ যেগুলি রাখুন, তারপরে প্রতিটি সূচনা-সমাপ্তির সংমিশ্রণে যান, সর্বনিম্ন পথের দূরত্বটি সন্ধান করুন এবং এর সর্বাধিক সন্ধান করুন।



1

জাভাস্ক্রিপ্ট (ES6),  195  194 বাইট

রিটার্নস [optimal_length, [optimal_path]]

f=(a,p=[],w=o=[],l=0)=>Object.values(o,o[k=[w,p[0]]]=(o[k]||0)[0]<l?o[k]:[l,p],a.map((v,i)=>w+w&&[...v].map((c,i)=>s-=c!=w[i],s=1)|s||f(a.filter(_=>i--),[...p,v],v,l+1))).sort(([a],[b])=>b-a)[0]

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

কিভাবে?

fow0w1[l,p]pw0w1l

plwpo

o[k = [w, p[0]]] = (o[k] || 0)[0] < l ? o[k] : [l, p]

o

Object.values(o).sort(([a], [b]) => b - a)[0]

(এই কোডটি প্রতিটি পুনরাবৃত্তির গভীরতায় কার্যকর করা হয় তবে কেবলমাত্র মূল স্তরটিই গুরুত্বপূর্ণ

vw

[...v].map((c, i) => s -= c != w[i], s = 1) | s

v

f(                    //
  a.filter(_ => i--), // remove the i-th word from a[]
  [...p, v],          // append v to p[]
  v,                  // pass v as the last word
  l + 1               // increment the length of the path
)                     //


0

পাইথন 3, 228 বাইট।

def G(w):
    D={A+B:[A,B]if sum(a!=b for a,b in zip(A,B))<2else[0,0]*len(w)for A in w for B in w}
    for k in w:
        for i in w:
            for j in w:
                p=D[i+k]+D[k+j][1:]
                if len(p)<len(D[i+j]):D[i+j]=p
    return max(D.values(),key=len)

সমস্ত জোড়ের সংক্ষিপ্ততম পাথগুলির জন্য ফ্লয়েড-ওয়ারশাল অ্যালগরিদমকে কার্যকর করে, তারপরে সন্ধানকারী পাথগুলিতে সর্বাধিক লাগে।

এই প্রয়োগের 16 টি চরিত্র হ'ল ট্যাব, যা দুর্ভাগ্যজনক :(


2
কোনও ঘটনা প্রান্তের একটি শীর্ষবিন্দু উপস্থিত থাকলে এটি ভাঙ্গা মনে হয়, যেমন, "মুদ্রণ জি (['ব্যাগ', 'ব্যাট', 'খাট'])"
jnfnt

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

1
@ পিটারটেলর ভাল টিপ, তবে কেবল পাইথন ২ এর জন্য কাজ করে Py পাইথন 3 টি ফাঁকা জায়গাগুলির সাথে ট্যাবগুলিকে মিশ্রিত করতে দেয় না।
ওব্লান্স

1
আহ, ভাল ধরা @jnfnt। এখন যেহেতু আমি এটি সম্পর্কে চিন্তা করি, কেবল গ্রাফটি সংযুক্ত থাকলে এটি কাজ করে।
রিখভশাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.