লজিকাল ডট আকার


12

খেলাাটি

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

এখন এখানে তিনটি প্রধান বিষয় লক্ষ্য করা যায়।

  1. গেম বোর্ড (কেন্দ্রের স্কোয়ারগুলির 4x4 গ্রিড)
  2. প্রয়োজনীয় আকারগুলি (শীর্ষ থেকে দ্বিতীয় বারের সাথে সংযুক্ত বিন্দুগুলি, স্কোর এবং মেনু এর নীচে, ইত্যাদি), যা সমস্ত লাইন, বা a1 টি আয়তক্ষেত্র দ্বারা
  3. সারি এবং কলামগুলির উপরে সংখ্যাগুলি, যা সমাধানের জন্য কলামে কতগুলি বিন্দু হওয়া দরকার তা বোঝায়

গেমের উদ্দেশ্য হ'ল গ্রিডের মধ্যে প্রয়োজনীয় আকারগুলি ফিট করা। আপনি আকারগুলি ঘোরান, তবে সেগুলি তির্যকভাবে যেতে পারে না।

সমাধানে লক্ষ্য করুন যে সমস্ত আকারগুলি একবারে তৈরি করা হয়েছে (কারণ সেগুলি কেবল একবার প্রয়োজনীয় আকারে থাকে) এবং এক্ষেত্রে সেগুলি সমস্ত অনুভূমিক তবে সেগুলি উল্লম্বও হতে পারে। স্কোয়ারগুলিতে ভরা গোলাপী ব্যবহার করা হয়নি এমন স্কোয়ারকে বোঝায়।

এখানে একটি বৃহত্তর এবং কিছুটা জটিল জটিল গ্রিড রয়েছে:

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

স্বরলিপি

এই পোস্টের বাকী অংশগুলির জন্য, আমি নিম্নলিখিত চিহ্নগুলি ব্যবহার করে বোর্ডটি উল্লেখ করব:

  • <,>, ^, ভি - বিন্দুর দিকে প্রসারিত একটি লেজযুক্ত একটি পূর্ব-স্থাপনিত বিন্দুটিকে চিহ্নিত করে
  • * - একটি বিন্দু বোঝায় যদি অমীমাংসিত গ্রিডে দেওয়া হয় (ইনপুট), এটি একটি স্বতন্ত্র আকার। যদি আউটপুটে থাকে, তবে এটি তার চারপাশের বিন্দুর সাথে সংযুক্ত is
  • # - একটি অবরুদ্ধ গ্রিড বর্গক্ষেত্রকে চিহ্নিত করে (যেখানে আপনি কোনও বিন্দু রাখতে পারবেন না)
  • -, | (হাইফেন এবং বার) - ডান এবং বাম লেজের সাথে একটি বিন্দু এবং যথাক্রমে উপরে এবং নীচে লেজের সাথে একটি বিন্দুটি চিহ্নিত করুন
  • ** (স্থানের অক্ষর) - ** একটি খালি স্থানকে বোঝায়

এই চিহ্নগুলি ব্যবহার করে, পরবর্তী উদাহরণগুলি (অমীমাংসিত) কে নিম্নরূপে উপস্থাপন করা যেতে পারে:

 <    



    # 
 ^ #

এবং সমাধান হিসাবে প্রতিনিধিত্ব করা যেতে পারে:

*< * *
   *  
     *
 *   *
 * *#*
 ^ # *

নোট করুন যে কোনও দুটি আকার অনুভূমিকভাবে, উল্লম্ব বা ত্রিভুজভাবে স্পর্শ করতে পারে না , সুতরাং নিম্নলিখিত ক্ষেত্রেটি বৈধ নয়:

 *** 
**   
  ** 

চ্যালেঞ্জ

আপনার চ্যালেঞ্জটি 4x4 থেকে 9x9 সহ অন্তর্ভুক্ত কোনও লজিক ডট ধাঁধা সমাধান করা। আপনি চারটি লাইন ইনপুট পাবেন, তারপরে গেম বোর্ড। লাইনগুলি নিম্নরূপ হবে:

  • প্রথম লাইন, আকার - সন্ধান করার জন্য আকারগুলি প্রতিটি ফর্মটিতে দেওয়া হয় sizexquantity(উদাহরণস্বরূপ 3x2, তিন দৈর্ঘ্যের দুটি আকারের জন্য) এবং একটি স্পেস দ্বারা পৃথক করা হয়। উদাহরণ লাইন:3x1 2x1 1x1
  • ২ য় লাইন, কলাম - প্রতিটি কলামের জন্য প্রয়োজনীয় বিন্দু গণনার একটি স্থান পৃথকীকরণ তালিকা। উদাহরণ লাইন:1 1 2 2
  • তৃতীয় লাইন, সারি- প্রতিটি সারির জন্য প্রয়োজনীয় বিন্দু গণনার একটি স্থান পৃথকীকরণ তালিকা। উদাহরণ লাইন:3 0 3 0
  • ৪ র্থ লাইন, বোর্ডের আকার - একটি একক পূর্ণসংখ্যা, বোর্ডের আকার, B

তারপরে বোর্ডটি দেওয়া হয় এবং এটি Bউল্লিখিত স্বরলিপিটি ব্যবহার করে বোর্ডের প্রতিনিধিত্বকারী ইনপুটগুলির লাইন। উদাহরণস্বরূপ, পরবর্তী উদাহরণের ক্ষেত্রে সম্পূর্ণ ইনপুটটি নিম্নরূপ:

4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
 <    



    # 
 ^ #  

আপনার প্রোগ্রামটি তখন একই স্বরলিপিতে সমাধান বোর্ডকে আউটপুট দেবে। উপরের ইনপুটটির সাথে মিলে যাওয়া আউটপুট নিম্নরূপ:

** * *
   *  
     *
 *   *
 * *#*
 * # *

মনে রাখবেন যে একটি গেম বোর্ডের একাধিক সমাধান থাকতে পারে। এই ক্ষেত্রে, কেবলমাত্র একটি বৈধ সমাধান আউটপুট করুন। এছাড়াও, আপনার প্রোগ্রামটিকে একটি জটিল 10x10 গ্রিডের জন্য একটি যুক্তিসঙ্গত ডেস্কটপ কম্পিউটারে 10 সেকেন্ডের মধ্যে একটি সঠিক সমাধান আউটপুট করতে হবে।

এটি কোড গল্ফ, তাই কমপক্ষে বাইটস জেতা।


পরীক্ষার কেস

ইনপুট ঘ

3x2 1x4
2 2 3 1 2
4 0 3 0 3
5


    #
  #  
    *

আউটপুট 1

*** *

 ***#
  #  
* * *

ইনপুট 2

3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*    


   # 

আউটপুট 2

* * *
  *  
  * *
*  # 
  * *

ইনপুট 3

5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#     
  -   


 #    
   <  

আউটপুট 3

#     
 *****

 **** 
 #    
* ** *

হ্যাঁ, এটি সঠিক @ ফ্লোয়ার
বিশ্বব্যাপী

@ ফ্লোয়ার t no two shapes can touch horizontally, vertically or diagonally(এটি শুরুতে হওয়া উচিত, প্রায় শেষের কাছে হারিয়ে যায়নি তবে যাইহোক ...)
এডসি 65

@globby প্রতিটি খালি জায়গাটিকে # দিয়ে প্রতিস্থাপন করা হবে না, আমি মনে করি # আপনি যখন খেলায় একটি ফাঁকা স্থান একক ট্যাপ করেন। আপনি যখন একটি স্তর শেষ করেন এটি সমস্ত খালি ঘরগুলি পূরণ করে।
তেউন প্রোঙ্ক 13

@ টিউনপ্রংক নং # হ'ল ফাঁকা জায়গা যা পূর্বনির্ধারিত যে আপনি দ্বিতীয় উদাহরণে ধূসর স্কোয়ারের মতো স্তরে বিন্দু রাখতে পারবেন না।
গ্লোবাই

2
অনুদান দেওয়ার চেয়ে ভাল, আপনার আরও টেস্ট কেস যুক্ত করা উচিত এবং আপনার প্রশ্নের ত্রুটিগুলি ঠিক করা উচিত। উদাহরণস্বরূপ, বর্তমান পরীক্ষার
কেসগুলির

উত্তর:


3

পাইথন 2: 766 739 696 663 633 বাইট

def f(B,S,o=0):
 if[]==S:print'\n'.join(B);exit()
 s=S[0]
 for i in r:
  for j in R(Z-s+1):
   if(B[i][j]in' '+'>v'[o])*(B[i][j+s-1]in' '+'<^'[o])*({' ','-|'[o]}>=set(B[i][j+1:j+s-1]))*all(B[x][y]in'# 'for x,y in [(x,y)for y in R(j-1,j+s+1)for x in i-1,i+1]+[(i,j-1),(i,j+s)]if 0<=x<Z>y>=0):q=B[:];q[i]=q[i][:j]+'*'*s+q[i][j+s:];q=(q,t(q))[o];any((t(q)+q)[k].count('*')>m[k]for k in R(Z+Z))or f(q,S[1:])
 o or f(t(B),S,1)
y=raw_input;S=[];s=str.split
for i in s(y()):u,v=map(int,s(i,'x'));S+=[u]*v
m=map(int,s(y())+s(y()));Z=input();R=range;r=R(Z);B=[y()for _ in r];J=''.join;t=lambda x:map(J,zip(*x))
f(B,S[:len(S)-J(B).count('*')])

এটি অনলাইনে কাজ করা দেখুন: Ideone.com (অনলাইন সংস্করণ বড় এবং কঠিন গ্রিডগুলির জন্য খুব ধীর হতে পারে, অফলাইনে এটি ঠিক হওয়া উচিত)

ইনপুটটি স্টিডিনের মাধ্যমে রয়েছে, কেবল ওপি থেকে লাইনগুলি অনুলিপি করুন এবং কেটে দিন (তবে সাবধান হন, স্ট্যাকেক্সচেঞ্জ কখনও কখনও ফাঁকা স্থান বা লাইনগুলি মুছে দেয়)।

এই কোডটির কিছু প্রাথমিক ধারণা: এটি একটি পুনরাবৃত্তি ফাংশন ব্যবহার করে ffবোর্ডে একটি আকার রাখার চেষ্টা করে। প্রতিটি সম্ভাব্য অবস্থানের জন্য এটি পরিবর্তিত বোর্ডের সাথে নিজেকে কল করে। এটিতে 3 টি লুপ রয়েছে। oওরিয়েন্টেশন নির্ধারণ করে (2 - অনুভূমিক, 3 - উল্লম্ব)। এটি সর্বদা আকৃতিটিকে অনুভূমিকভাবে রাখবে, অতএব শেষে o=2এটি কার্যক্রমে বোর্ডটি স্থানান্তর করবে tiসারি এবং jএটি সমস্ত সম্ভাব্য আরম্ভকারী কলামগুলি। তারপরে অনেকগুলি চেক হয়, যদি আকারের প্রান্তে বৈধ অক্ষর থাকে, যদি আকারের মাঝখানে বৈধ অক্ষর থাকে এবং পার্শ্ববর্তীটি খালি থাকে।


আমি আপনার শেষ সম্পাদনাটি (-30) দেখে এবং ছেড়ে দিয়েছি যখন আমি সর্বশেষ 6 বাইট কাটতে হিমশিম
খাচ্ছিলাম

3

জাভাস্ক্রিপ্ট (ES6) 661 667 695 702 745 755 786 790 784 798

কাজ চলছে, ছোট করা যাবে। একটি জটিল গ্রিড সম্ভবত খুব ধীর। হয়তো না.

কিছুটা দীর্ঘতর সম্পাদনা করুন
সম্পাদনা 2 বাগ সংশোধন করুন, কলাম / সারি পরীক্ষা। ঘটনাচক্রে, এখন এটি আরও দ্রুত

এম ফাংশনটি প্রধান। ডাব্লু প্যারামিটার সমস্ত ইনপুট সহ একটি বহুরেখা স্ট্রিং। ফাংশনটি ইনপুটটিকে বিশ্লেষণ করে এবং একটি প্রারম্ভিক বোর্ড প্রস্তুত করে। <>^v|-*প্রারম্ভিক বোর্ডের অক্ষরগুলি প্রতিস্থাপন করা হয় ,, প্রত্যেকটির ,সাথে প্রতিস্থাপন করতে হবে* সঠিক সমাধানে হয়।

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

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

M=w=>(
  [x,c,r,z]=w=w[S='split'](n='\n'),
  (b=[...w.slice(4).join(n)])
  .map((c,p)=>~(k='*<>-*^v|'.indexOf(c))&&[(q=k>3?z:1,0),k&1&&-q,k&2&&q].map(o=>b[p+o]=0),
    c=c[S](e=' '),r=r[S](e),w=z++,f='*',s='',x[S](e).map(v=>s+=v[0].repeat(v[2]))),
  R=(s,b,x=0,y=0,n=s[0],V=i=>b[i]>'#',
    P=(p,o,q,t,g,l,d=[...b])=>{
        if(l<z-n&!V(p+o*l-o)&!V(p+o*l+o*n))
        {
          for(i=-1;v=d[p],++i<w;p+=o,t-=v==f)
            if(i>=l&i-n<l)
              for(v!=e&v!=0|[q,w,~z].some(w=>V(p+w)|V(p-w))?t=0:d[p]=f,j=o*i,u=k=0;
                  ++k<z;(u+=d[j]==f)>g[i]?t=0:j+=q);
          return t>=n&&d.join('')
        }
    })=>{
    if(b){
      if(!n)return~b.search(0)?0:b;
      for(s=s.slice(1);y<w||(y=0,++x<w);++y)
        if(h=R(s,P(y*z,1,z,r[y],c,x))||n>1&&R(s,P(x,z,1,c[x],r,y)))return h
    }
  })(s,b)

টেস্ট ফায়ারফক্স / ফায়ারবাগ কনসোলটি

;['3x2 1x4\n2 2 3 1 2\n4 0 3 0 3\n5\n     \n     \n    #\n  #  \n    *\n'
,'3x1 1x6\n2 0 4 0 3\n3 1 2 1 2\n5\n*    \n     \n     \n   # \n     \n'
,'5x1 4x1 2x1 1x2\n1 2 3 3 2 2\n0 5 0 4 0 4\n6\n#     \n  -   \n      \n      \n #    \n   <  \n'
,'4x1 3x1 2x2 1x2\n1 4 0 3 0 5\n4 1 1 2 3 2\n6\n <    \n      \n      \n      \n    # \n ^ #  \n']
.forEach(x=>console.log(x,M(x).replace(/ /g,'`'))) // space replaced with ` for clarity

আউটপুট (মোট প্রয়োগের সময় <1 সেকেন্ড)

3x2 1x4
2 2 3 1 2
4 0 3 0 3
5


    #
  #  
    *

***`*
`````
`***#
``#``
*`*`*

3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*    


   # 


*`*`*
``*``
``*`*
*``#`
``*`*

5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#     
  -   


 #    
   <  

#`````
`*****
``````
`****`
`#````
*`**`*

4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
 <    



    # 
 ^ #  

**`*`*
```*``
`````*
`*```*
`*`*#*
`*`#`*

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