লেজারের গন্তব্যগুলি মেলাতে একটি আয়না কনফিগারেশন সন্ধান করুন


13

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

মিররগুলির একটি বাক্সে লেজারের সন্ধানের জন্য পিপিসিজিতে বেশ কয়েকটি ধাঁধা হয়েছে। এই ধাঁধাতে, আপনাকে বেশিরভাগ লেজার গন্তব্যগুলির সাথে মিলে যাওয়ার জন্য আয়নাগুলির একটি বাক্স তৈরি করতে হবে ।

আপনাকে একটি বাক্স এবং একটি স্পেসিফিকেশন দেওয়া হবে যেখানে লেজারগুলি প্রবেশ করতে এবং প্রস্থান করতে হবে। আপনার প্রোগ্রামটির নির্দিষ্টকরণের জন্য বাক্সে ঠিক এন ডাবল-পার্শ্বযুক্ত আয়না রাখা দরকার। আয়নাগুলি অবশ্যই 45 ডিগ্রি এঙ্গেল হওয়া উচিত তবে এগিয়ে opালু বা পিছনে opালু হতে পারে।

ইনপুট

আপনার প্রোগ্রামটি নিম্নলিখিত ফর্ম্যাট উদাহরণগুলিতে STDIN, কমান্ড লাইন আর্গুমেন্ট বা ফাইলের মাধ্যমে একটি বক্স গ্রিড গ্রহণ করবে:

+--G--+     +abcde+
G     |     f/////d
|    /|     a//   c
+-----+     f     |
            +-b-e-+

অক্ষর জোড়া ([a-zA-Z] ব্যবহৃত হতে পারে) 52 লেজার পর্যন্ত ইনপুট / আউটপুট নির্দেশ করে। বাক্সের ভিতরে এন /মিরর থাকবে। বাক্সের মাত্রা 3 <= W, H <= 200 হবে। বাক্সটি +|-অক্ষর দিয়ে তৈরি । শূন্য সহ বাক্সে যে কোনও সংখ্যক আয়না থাকতে পারে।

আউটপুট

আউটপুটটি ইনপুটটির সাথে মিলে যাবে, /অক্ষরগুলি সরানো এবং / অথবা \অক্ষরে পরিবর্তিত হতে পারে । আপনার প্রোগ্রামটি একটি সঠিক আয়না বাক্স স্ট্রিং STDOUT বা একটি ফাইলে প্রেরণ করা উচিত, নতুন লাইনের alচ্ছিকভাবে অনুসরণ করা। আয়নাগুলির কোনও স্থান যদি ইনপুট স্পেসিফিকেশন, আউটপুট পূরণ করতে না পারে Impossible\n। সম্ভাব্য সমাধানগুলির উদাহরণ:

+--G--+     +abcde+
G  /  |     f \ \ d
|     |     a/ \  c
+-----+     f / //|
            +-b-e-+

পরীক্ষার উদাহরণ

ইনপুট:

+abcdefghijklmnopqrstuvwxyA-+
|///////////////            |
|///////////////            |
|                           |
+-Abcdefghijklmnopqrstuvwxya+

উদাহরণ আউটপুট:

+abcdefghijklmnopqrstuvwxyA-+
|\                         \|
|/                        / |
|\\\\\\\\\\\\\\\\\\\\\\\\\\ |
+-Abcdefghijklmnopqrstuvwxya+

স্কোরিং (আপডেট)

এটি বোনাস সহ কোড গল্ফ। আপনার প্রোগ্রামটি কতগুলি আয়না সমাধান করতে পারে তার উত্তর দিয়ে আপনার মনোনীত করা উচিত (এন)। আপনার স্কোরটি এন দ্বারা বিভক্ত বাইটগুলিতে আপনার প্রোগ্রামের দৈর্ঘ্য This এটি লোকেদের একটি সাধারণ প্রোগ্রাম সহ প্রবেশ করতে দেয়, তবে আরও উচ্চাকাঙ্ক্ষী প্রোগ্রামারদের একটি বোনাস দিয়ে পুরষ্কার দেয়।

স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।


3
গল্ফিং নির্বিশেষে এটিকে শক্ত সমস্যার মতো মনে হচ্ছে।
orlp

2
ইঙ্গিত: বক্ষ শক্তি একটি বিকল্প নয় ; বৃহত্তর উদাহরণের জন্য আপনাকে প্রতি সেকেন্ডে 10 কে বিকল্পে 3 মহাবিশ্বের যুগের সময় লাগবে।
সানচিইস

@ সানচাইজস আমি মনে করি এটি অনেক বেশি সময় নেবে, যেহেতু কোনও আয়না উল্টানো যায়, তাই আমার মনে হয় * 2^30
আপনারও

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

উত্তর:


2

সি # - 897 862 বাইট

এটি এমন জায়গাগুলিতে আয়না লাগিয়ে একটি গুরুতর ত্রুটি পেয়েছিল যা তারা হতে পারে না। এখন এটি কাজ করে, আশা করি! কিছুটা হালকা গল্ফিং করেছে, কিছুক্ষণ লুপটি সেখানে leaveুকতে পারে না ... লজ্জাজনক।

সম্পূর্ণ প্রোগ্রাম, STDIN থেকে ইনপুট নেয়, STDOUT এ আউটপুট নেয়।

এটি অনেক মজার ছিল, এটি 7 বাই 5 সমস্যার সমাধান করে (এবং যখন আপনি একটি আয়না অপসারণ করেন, এটি অসম্ভব করে তোলে) 30 কে 5 এর সমাধান করতে প্রায় 1 ঘন্টা সময় নিয়েছিল।

using Q=System.Console;class P{static int w,L;static string S(char[]M,int t,int r,int i,int d,int[]B){var s="";if(r<0)return s;M=(char[])M.Clone();B=(int[])B.Clone();B[i]=1;for(i+=d;M[t]<48|t==i;i=t+(d=t<w?w:t>L-w?-w:t%w<1?1:-1))if(++t>=L){for(i=0;++i<L&r>0;)if(B[i]<1&M[i]<33){M[i]='.';r--;}return r<1?new string(M):s;}int c=M[i];if(c>32)s=c>47|c<46?s=c==M[t]?S(M,t,r,t,0,B):s:S(M,t,r,i,c<47?w/d:-w/d,B);else if((s=S(M,t,r,i,d,B))==""&B[i]<1){M[i]='.';s=S(M,t,r-1,i,w/d,B);if(s==""){M[i]='/';s=S(M,t,r-1,i,-w/d,B);}}return s;}static void Main(){string a,A="",R=A;for(;(a=Q.ReadLine())!=null;A+=a)L+=(w=a.Length);var G=A.ToCharArray();int r=0,i=L;for(;i>0;G[i]=G[i]=='|'?',':G[i])if(G[--i]==47|G[i]==92){r++;G[i]=' ';}a=S(G,0,r,1,w,new int[L]);if(a=="")R="Impossible\n";else for(;i<L;i+=w)R+=a.Substring(i,w)+"\n";Q.Write(R.Replace(".","\\").Replace(",","|"));}}

5 দ্বারা 7 উদাহরণ:

+abcde+
f/////d
a//   c
f     |
+-b-e-+

+abcde+
f   \ d
a/  //c
f/ \ /|
+-b-e-+

অসম্ভব সংস্করণ:

+abcde+
f ////d
a//   c
f     |
+-b-e-+

Impossible

কিছু অন্যরকম (প্রোগ্রামটি মূল আয়না বিন্যাসটিকে দেখায় না):

+a----+
|//// |
|/////|
|/////|
+----a+

+a----+
| /\\\|
|\\\\\|
|\\/\\|
+----a+

30 দ্বারা 5 সমাধান:

+abcdefghijklmnopqrstuvwxyA-+
| \\\\\\\\\\\\\\\\\\\\\\\\ \|
| /                       //|
|\                         \|
+-Abcdefghijklmnopqrstuvwxya+

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

এটি যখন রুটগুলি তৈরি করে, এটি একটি আয়না tingোকানোর চেয়ে "এগিয়ে" যাওয়ার পক্ষে এবং এটি যখন হয় তখন এটি একটি "\" আয়নাটিকে সমর্থন করে - এটি উপরের "আলাদা কিছু" উদাহরণে সর্বাধিক দেখা যায়, যেখানে এটি নীচের প্রথম কক্ষটি এড়িয়ে যায় সর্বাধিক সর্বাধিক 'এ', তারপরে ক্রমাগত একটি "\" পূরণ করে যদি এটির সাথে কোনও সমাধান খুঁজে পাওয়া যায়, অন্যথায় একটি "/" (স্বাভাবিকভাবেই, যদি প্রথম কক্ষটি এড়িয়ে যাওয়ার ফলে এটি সমাধান খুঁজে পেতে অক্ষম হয়, তবে এটি হবে) পিছনে ট্র্যাক করুন এবং পরিবর্তে সেখানে একটি আয়না রাখার চেষ্টা করুন)।

using Q=System.Console;

class P
{
    static int w,L;

    // M is cur grid
    // t is target edge thing (0->L)
    // r is mirrors remaining
    // i is pos
    // d is dir
    static string S(char[]M,int t,int r,int i,int d,int[]B)
    {
        var s="";

        if(r<0) // no mirrors left
            return s;

        // clone everything
        M=(char[])M.Clone();
        B=(int[])B.Clone();

        B[i]=1; // can't write to this

        for(i+=d; // move i
            M[t]<48|t==i; // only if target is something sensible (increment if i==t)
            i=t+(d=t<w?w:t>L-w?-w:t%w<1?1:-1)) // reflect, should be fine for w=3
            if(++t>=L) // run off the end
            {
                for(i=0;++i<L&r>0;) // don't need I any more (count through everything)
                    if(B[i]<1&M[i]<33) // not been here & it's open space
                    {
                        M[i]='.'; // doesn't matter
                        r--;
                    }
                return r<1?new string(M):s; // none remaining ? victory : defeat
            }

        int c=M[i];
        if(c>32) // not boring
            s=c>47|c<46? // hit edge
                s=c==M[t]? // hit the correct thing
                    S(M,t,r,t,0,B): // i+0=t, tells it to increment t
                    s
            :S(M,t,r,i,c<47?w/d:-w/d,B); // mirror
        else // boring
            if((s=S(M,t,r,i,d,B))==""&B[i]<1) // fwd
            {
                M[i]='.'; // use . instead of \
                s=S(M,t,r-1,i,w/d,B); // \
                if(s=="")
                {
                    M[i]='/';
                    s=S(M,t,r-1,i,-w/d,B); // /
                }
            }

        return s;
    }

    static void Main()
    {
        string a,A="",R=A; // R is free
        for(;(a=Q.ReadLine())!=null;A+=a) // read input
            L+=(w=a.Length); // note width, accumulate length

        var G=A.ToCharArray();

        int r=0,i=L; // count mirrors (I refuse to make these static)
        for(;i>0; // end on i=0
            G[i]=G[i]=='|'?',':G[i]) // replace | with ,
            if(G[--i]==47|G[i]==92) // remove and count mirrors
            {
                r++;
                G[i]=' '; // storing G[i] doesn't seem to save anything
            }

        // search
        a=S(G,0,r,1,w,new int[L]);

        if(a=="") // defeat
            R="Impossible\n";
        else // victory
            for(;i<L;i+=w) // for each line
                R+=a.Substring(i,w)+"\n";

        Q.Write(R.Replace(".","\\").Replace(",","|")); // swap back | and \
    }
}

সুন্দর সমাধান। নতুন স্কোরিং সিস্টেম অনুসারে আপনি কমপক্ষে 917/7 = 131 স্কোর করেন
লজিক নাইট

2

পাইথন, 671 654 বাইট

সমাধান নয়, একটি প্রচেষ্টা, নীচে পড়ুন।

import random as R
def V(F):
 for S,_x,_y in (F[0],0,1),(F[-1],0,-1),([L[0] for L in F],1,0),([L[-1] for L in F],-1,0):
  for i,C in enumerate(S):
   if not C in '+-|':
    x=_x;y=_y
    if not x: X=i;Y=y
    elif not y: Y=i;X=x
    while F[Y][X] != C:
     if F[Y][X]=='\\':x,y=y,x
     if F[Y][X]=='/':a=x+y;x,y=x-a,y-a
     X+=x;Y+=y
     try:
      if F[Y][X] in '+-|':return False
     except:
      return False
 return True
F=open(input()).read().split('\n')
while 1:
 _=[F[0]]+['\n'.join([L[0]+''.join([R.choice(' \\/')for i in range(len(F[0])-2)])+L[-1] for L in F[1:-1]])]+[F[-1]]
 if V(_):
  for l in _: print l
  break

আমি সমাধানটি থেকে সন্তুষ্ট না হওয়ায় আমি সর্বোচ্চটি গল্ফ করিনি। সাইডলাইনটিতে পাওয়া প্রতিটি চরিত্রের জন্য Vক্ষেত্রটি হাঁটার মাধ্যমে প্রদত্ত সমাধানটিকে বৈধতা দেয়। সমাধান এলোমেলোভাবে উত্পাদিত হয়। এটি কুরুচিপূর্ণ, এটি এন্ট্রি 1 এর জন্য কাজ করে, তবে অন্যান্য এন্ট্রিগুলির জন্য প্রচুর সময় নেয়। যেহেতু এটি এলোমেলোভাবে সমাধানগুলির চেষ্টা করে, তাই আমি এটিকে প্রদত্ত সমস্যার প্রকৃত সমাধান হিসাবে বিবেচনা করি না; তবে এটি অন্যকে সাহায্য করতে পারে।FC

চালান: echo "entry1.txt" | python script.py


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