শব্দ অনুসন্ধান ধাঁধা প্রজন্ম


13

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

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

সুতরাং, ইনপুটটি কেবল শব্দের একটি তালিকা। উদাহরণস্বরূপ: CAT, TRAIN, CUBE, BICYCLE। একটি সম্ভাব্য সমাধান হ'ল:

B N * * * * *
* I * * C A T
* A C * * * *
* R * Y * * C
* T * * C * U
* * * * * L B
* * * * * * E

আমি কেবল স্বচ্ছতার জন্য অ্যারিস্কের সাথে চিঠিগুলি পূরণ করেছি। পছন্দসই আউটপুটটিতে র্যান্ডম ফিলিং লেটার অন্তর্ভুক্ত থাকতে হবে।


প্রতিটি শব্দকে একটি মাত্র পজিশনে পাওয়া উচিত (আদর্শ শব্দ অনুসন্ধানের মতো)? উদাহরণস্বরূপ, চিঠি বাম ACআপনার উদাহরণ আরেকটি হবে মধ্যে CATযদি এটা T
জিওবিটস

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

হ্যাঁ, এটি কেবল একটি পজিশনে পাওয়া উচিত।
মিগু

1
আসলেই না, না। উত্তরটি এলোমেলোভাবে নমুনা হওয়া উচিত এমন স্থানটি কী, বা সেই জায়গার উপাদানগুলির ওজনে কতটা নমনীয়তা অনুমোদিত তা আমি এখনও পরিষ্কার করতে পারি না।
পিটার টেলর

1
এখন পর্যন্ত, প্রশ্নের এমন ইনপুট রয়েছে যা সমাধান করা যায় না, তবে কীভাবে আপনার এটি মোকাবেলা করার কথা তা উল্লেখ করা যায়নি। উদাহরণস্বরূপ সেটটির A B C D E F G H I J K L M N O P Q R S T U V W X Y Zকোনও সমাধান নেই।
orlp

উত্তর:


6

জাভাস্ক্রিপ্ট (ES6), 595 628 680

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

এডিট 2 আরও গল্ফিং, এলোমেলো ফিলগুলি সংক্ষিপ্ত, বাইরের লুপটি সংশোধিত ... আরও পঠনযোগ্য কিছুটির জন্য ইতিহাস দেখুন

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

শব্দগুলি পুনরাবৃত্তি করা এড়িয়ে যাওয়ার সীমাবদ্ধতা খুব শক্ত। গ্রিডে শব্দ যুক্ত করে প্রতিটি পদক্ষেপে আমাকে পুনরাবৃত্তি করতে হবে এবং প্রতিটি এলোমেলো চরিত্রের অক্ষর দেখতে হবে।

প্রধান উপশক্তি:

  • পি (ডাব্লু) সত্য যদি প্যালিনড্রোম শব্দ হয়। বারবার শব্দের জন্য পরীক্ষা করার সময় একটি প্যালিনড্রোম শব্দটি দু'বার পাওয়া যাবে।

  • আর (গুলি) গ্রিডে পুনরাবৃত্তি শব্দ পরীক্ষা করুন check

  • প্রশ্ন (গুলি) এলোমেলো অক্ষর দিয়ে গ্রিড পূরণ করুন - শব্দটি পুনরাবৃত্তি করার ক্ষেত্রে এটি পুনরাবৃত্ত এবং ব্যাকট্র্যাক - এবং ব্যর্থ হতে পারে।

  • ডাব্লু () পুনরাবৃত্ত, যদি সম্ভব হয় তবে প্রদত্ত আকারের গ্রিডটি পূরণ করার চেষ্টা করুন।

মূল ফাংশন ডাব্লু () ব্যবহার করে আউটপুট গ্রিডটি সন্ধান করে, দীর্ঘতম শব্দের আকার থেকে সমস্ত শব্দের দৈর্ঘ্যের যোগফল পর্যন্ত চেষ্টা করে।

F=l=>{
  for(z=Math.max(...l.map(w=>(w=w.length,x+=w,w),x=0));
      ++z<=x;
      (W=(k,s,m,w=l[k])=>w?s.some((a,p)=>!!a&&
            D.some((d,j,_,r=[...s],q=p-d)=>
              [...w].every(c=>r[q+=d]==c?c:r[q]==1?r[q]=c:0)
              &&R(r)&&W(k+1,r,m|1<<(j/2))
            )
          )
        :m>12&&Q(s)&&(console.log(''+s),z=x) 
      )(0,[...Array(z*z-z)+99].map((c,i)=>i%z?1:'\n'))
    )
    D=[~z,-~z,1-z,z-1,z,-z,1,-1]
    ,R=u=>!l.some(w=>u.map((a,p)=>a==w[0]&&D.map(d=>n+=[...w].every(c=>u[q+=d]==c,q=p-d)),
      n=~([...w]+''==[...w].reverse()))&&n>0)
    ,Q=(u,p=u.indexOf(1),r=[...'ABCDEFGHIJHLMNOPQRSTUVWXYZ'])=>
      ~p?r.some((v,c)=>(r[u[p]=r[j=0|c+Math.random()*(26-c)],j]=v,R(u)&&Q(u)))||(u[p]=1):1
    //,Q=u=>u.map((c,i,u)=>u[i]=c!=1?c:' ') // uncomment to avoid random fill
}

Ungolfed এবং ব্যাখ্যা (অসম্পূর্ণ, দুঃখিত বলছি এটা কাজ অনেক)

F=l=>
{
  var x, z, s, q, D, R, Q, W;
  // length of longest word in z
  z = Math.max( ... l.map(w => w.length))
  // sum of all words length in x
  x = 0;
  l.forEach(w => x += w.length);

  for(; ++z <= x; ) // test square size from z to x
  {
    // grid in s[], each row of len z + 1 newline as separator, plus leading and trailing newline
    // given z==offset between rows, total length of s is z*(z-1)+1
    // gridsize: 2, z:3, s.length: 7 
    // gridsize: 3, z:4, s.length: 13
    // ...
    // All empty, nonseparator cells, filled with 1, so
    // - valid cells have a truthy value (1 or string)
    // - invalid cells have falsy value ('\n' or undefined)
    s = Array(z*z-z+1).fill(1) 
    s = s.map((v,i) => i % z != 0 ? 1 : '\n');

    // offset for 8 directions 
    D = [z+1, -z-1, 1-z, z-1, z, -z, 1, -1]; // 4 diags, then 2 vertical, then 2 horizontal 

    // Function to check repeating words
    R = u => // return true if no repetition
      ! l.some( w => // for each word (exit early when true)
      {
          n = -1 -([...w]+''==[...w].reverse()); // counter starts at -1 or -2 if palindrome word
          u.forEach( (a, p) => // for each cell if grid 
          {
            if (a == [0]) // do check if cell == first letter of word, else next word
               D.forEach( d => // check all directions 
                 n += // word counter
                   [...w].every( c => // for each char in word, exit early if not equal
                     u[q += d] == c, // if word char == cell, continue to next cell using current offset
                     q = p-d  // starting position for cell
                   )
               ) // end for each direction
          } ) // end for each cell
          return n > 0 // if n>0 the word was found more than once
      } ) // end for each word

    // Recursive function to fill empty space with random chars
    // each call add a single char
    Q = 
    ( u, 
      p = u.indexOf(1), // position of first remaining empty cell 
      r = [...'ABCDEFGHIJHLMNOPQRSTUVWXYZ'] // char array to be random shuffled
    ) => {
      if (~p) // proceed if p >= 0
        return r.some((v,c)=>(r[u[p]=r[j=0|c+Math.random()*(26-c)],j]=v,R(u)&&Q(u)))||(u[p]=1)
      else 
        return 1; // when p < 0, no more empty cells, return 1 as true
    }
    // Main working function, recursive fill of grid          
    W = 
    ( k, // current word position in list
      s, // grid
      m, // bitmask with all directions used so far (8 H, 4V, 2 or 1 diag)
      w = l[k] // get current word
    ) => {
      var res = false
      if (w) { // if current word exists
        res = s.some((a,p)=>!!a&&
            D.some((d,j,_,r=[...s],q=p-d)=>
              [...w].every(c=>r[q+=d]==c?c:r[q]==1?r[q]=c:0)
              &&R(r)&&W(k+1,r,m|1<<(j/2))
            )
          )
      } 
      else 
      { // word list completed, check additional constraints
        if (m > 12 // m == 13, 14 or 15, means all directions used
            && Q(s) ) // try to fill with random, proceed if ok
        { // solution found !!
          console.log(''+s) // output grid
          z = x // z = x to stop outer loop
          res = x//return value non zero to stop recursion
        }
      }
      return res
    };
    W(0,s)
  }    
}

টেস্ট ফায়ারফক্স / Firebug কনসোলে

এফ (['ট্রেন', 'কিউব', 'বক্স', 'বাইসাইকেল'])

,T,C,B,O,X,B,H,  
,H,R,U,H,L,I,H,  
,Y,A,A,B,E,C,B,  
,D,H,S,I,E,Y,I,  
,H,E,R,L,N,C,T,  
,G,S,T,Y,F,L,U,  
,H,U,Y,F,O,E,H,  

ভরা না

,T,C,B,O,X,B, ,
, ,R,U, , ,I, ,
, , ,A,B, ,C, ,
, , , ,I,E,Y, ,
, , , , ,N,C, ,
, , , , , ,L, ,
, , , , , ,E, ,

এফ (['ট্রেন', 'আর্টস', 'র্যাট', 'কিউব', 'বক্স', 'বাইসাইকেল', 'ঝড়', 'ব্রেন', 'ডিপথ', 'মাউথ', 'স্ল্যাব'])

,T,A,R,C,S,T,H,
,S,R,R,L,U,D,T,
,T,B,A,T,N,B,P,
,O,B,O,I,S,A,E,
,R,B,A,X,N,H,D,
,M,R,M,O,U,T,H,
,B,I,C,Y,C,L,E,

এফ ([ 'হবে AA', 'এবি', 'এসি', 'খ্রি', 'ই', 'এফ', 'এজি'])

,A,U,B,C,
,T,A,E,Z,
,C,D,O,F,
,Q,C,G,A,

এফ ([ 'হবে AA', 'এবি', 'এসি', 'খ্রি', 'ই', 'এফ'])

আউটপুট পূরণ করা হয়নি - @ নাথান: এখন আপনি পুনরাবৃত্তি ছাড়া অন্য একটি এক্স যোগ করতে পারবেন না । আপনার আরও বড় গ্রিড লাগবে।

,A, ,C,
, ,A,F,
,D,E,B,

আপনার শেষ পরীক্ষার ক্ষেত্রে, 3x3 গ্রিডে এটি কি সম্ভব নয়?
নাথন মেরিল

@ নাথানমিরিল নং উত্তরের পাঠ্যের আরও বিশদ
edc65

পুরোপুরি অপঠনযোগ্য কোড :) তবে চমৎকার এটি বাইট / পয়েন্ট "অ্যাওয়ার্ড" এর মানববন্ধন হবেন না
ফায়ারফিল

1
@ ফায়ারফিল একটি ব্যাখ্যা যুক্ত করার চেষ্টা করছে, এটি সহজ নয় ...
এডসি 65

1

সি শার্প

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

class Tile
{
    public char C;
    public int X, Y;
}

class Grid
{
    List<Tile> tiles;

    public Grid()
    {
        tiles = new List<Tile>();
    }
    public int MaxX()
    {
        return tiles.Max(x => x.X);
    }
    public int MaxY()
    {
        return tiles.Max(x => x.Y);
    }
    public void AddWords(List<string> list)
    {
        int n = list.Count;
        for (int i = 0; i < n; i++)
        {
            string s = list[i];
            if(i==0)
            {
                Vert(s, 0, 0);
            }
            else if(i==n-1)
            {
                int my = MaxY();
                Diag(s, 0, my+1);
            }
            else
            {
                Horiz(s, 0, i);
            }
        }

    }
    private void Vert(string s, int x, int y)
    {
        for (int i = 0; i < s.Length; i++)
        {
            Tile t = new Tile();
            t.C = s[i];
            t.X = x+i;
            t.Y = y;
            tiles.Add(t);
        }
    }
    private void Horiz(string s, int x, int y)
    {
        for (int i = 0; i < s.Length; i++)
        {
            Tile t = new Tile();
            t.C = s[i];
            t.X = x+i;
            t.Y = y;
            tiles.Add(t);
        }
    }
    private void Diag(string s, int x, int y)
    {
        for (int i = 0; i < s.Length; i++)
        {
            Tile t = new Tile();
            t.C = s[i];
            t.X = x++;
            t.Y = y++;
            tiles.Add(t);
        }
    }
    public void Print()
    {
        int mx = this.MaxX();
        int my = this.MaxY();
        int S = Math.Max(mx, my) + 1;
        char[,] grid = new char[S, S];
        Random r = new Random(DateTime.Now.Millisecond);
        //fill random chars
        for (int i = 0; i < S; i++)
        {
            for (int j = 0; j < S; j++)
            {
                grid[i, j] = (char)(r.Next() % 26 + 'A');
            }
        }
        //fill words
        tiles.ForEach(t => grid[t.X, t.Y] = t.C);
        //print
        for (int i = 0; i < S; i++)
        {
            for (int j = 0; j < S; j++)
            {
                Console.Write("{0} ", grid[i,j]);
            }
            Console.WriteLine();
        }
    }
}

class WordSearch
{
    public static void Generate(List<string>list)
    {
        list.Sort((x, y) =>
        { int s = 0; if (x.Length < y.Length)s = -1; else if (y.Length < x.Length)s = 1; return s; });
        list.Reverse();
        Grid g = new Grid();
        g.AddWords(list);
        g.Print();
    }

}

পরীক্ষা

class Program
{
    static void Main(string[] args)
    {
        string words = "CAT, TRAIN, CUBE, BICYCLE";
        string comma=",";
        List<string> w = words.Split(comma.ToArray()).ToList();
        List<string> t = new List<string>();
        foreach(string s in w)
        {
           t.Add(s.Trim());
        }
        WordSearch.Generate(t);

        Console.ReadKey();
    }
}

এটি কাজ করে তবে এটি সর্বোত্তম নয়: নমুনা স্ট্রিং শব্দগুলি = "বিড়াল, ডিওজি, এইচআর, আরএন, সিএমডি";
ফায়ারফিল

এলোমেলো ভরাট অক্ষরগুলি গ্রিডে কোনও শব্দের পুনরাবৃত্তি ঘটায় কিনা তা আপনি পরীক্ষা করেন?
edc65

-1 চেষ্টা করেছেন। চশমা অনুসরণ করে না at least one word in each direction (horizontal, vertical and diagonal)। পরীক্ষা প্রোগ্রাম চলমান, কোনও অনুভূমিক শব্দ নেই (3 উল্লম্ব, 1 ডায়াগ)
edc65

3
এই প্রশ্নটি কোড-গল্ফ , সুতরাং আপনার শিরোনামে কতগুলি বাইট পোস্ট করা উচিত এবং সম্ভবত আপনার প্রোগ্রামটি একগুচ্ছ ছোট করা উচিত। ধন্যবাদ।
mbomb007

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