আইস গল্ফ চ্যালেঞ্জ


24

এই চ্যালেঞ্জের লক্ষ্য হ'ল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা প্রদত্ত কোর্সটি সম্পন্ন করতে সর্বনিম্ন পরিমাণ স্ট্রাইকের প্রয়োজন হয়।

ইনপুট

  • কোর্সের লেআউটটি আপনার পছন্দের কোনও উপযুক্ত উপায়ে এবং ফর্ম্যাটে উত্তীর্ণ হতে পারে। (কনসোল থেকে পড়া, ইনপুট প্যারামিটার হিসাবে পাস করা, কোনও ফাইল বা অন্য কোনও, মাল্টলাইন-স্ট্রিং, স্ট্রিং অ্যারে, দ্বি-মাত্রিক অক্ষর / বাইট অ্যারে থেকে পড়া)।
  • বল এবং গর্তের প্রারম্ভিক অবস্থানটি ইনপুট হিসাবেও পাস করা যায়, এটি ইনপুট থেকে পার্স করতে হবে না। পরীক্ষার ক্ষেত্রে এগুলি অবশ্যই কোর্সে অন্তর্ভুক্ত করা হয় তা নিশ্চিত করার জন্য যে আসল অবস্থান সম্পর্কে কোনও বিভ্রান্তি নেই।
  • আপনি ইনপুট অক্ষরগুলিকে অন্য কোনও কিছুর সাথে পুনর্নির্মাণ করতে পারবেন, যতক্ষণ না তারা স্বতন্ত্র অক্ষর হিসাবে চিহ্নিত (যেমন মুদ্রণযোগ্য ASCII অক্ষর)।

আউটপুট

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

উদাহরণ:

এই উদাহরণে পজিশনগুলিকে 0-ভিত্তিক, এক্স / ওয়াই, বাম থেকে ডান, শীর্ষ-নীচে চিহ্নিত করা হয় - তবে ফলাফল যেভাবেই হোক পুরোপুরি বিন্যাস-স্বাধীন তাই আপনি নিজের পছন্দ মতো যে কোনও বিন্যাস ব্যবহার করতে পারেন।

ইনপুট:

###########
#     ....# 
#      ...# 
#  ~    . # 
# ~~~   . # 
# ~~~~    # 
# ~~~~    # 
# ~~~~  o # 
# ~~~~    # 
#@~~~~    # 
###########

Ball (Start-Position): 1/9
Hole (End-Position):   8/7

আউটপুট:

8

উদাহরণ কোর্স

বিধি এবং ক্ষেত্র

কোর্সে নিম্নলিখিত ক্ষেত্রগুলি সমন্বিত থাকতে পারে:

  • '@' বল - কোর্সের শুরু
  • 'o' ছিদ্র - অবশ্যই লক্ষ্য
  • '#' ওয়াল - বলটি যখন কোনও প্রাচীরকে আঘাত করবে তখন থামবে
  • '~' জল - এড়াতে হবে
  • '.' বালির - বল বালির উপর অবিলম্বে বন্ধ করবে
  • ' ' বরফ - বল কিছুটা আঘাত না করা অবধি স্লাইড হতে থাকবে

গেমের প্রাথমিক নিয়ম এবং বিধিনিষেধ:

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

লুফোলস এবং জয়ের শর্ত

  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ
  • প্রোগ্রাম অবশ্যই শেষ করতে হবে
  • আপনি অতিরিক্ত নিয়মগুলি তৈরি করতে পারবেন না (বলটিকে এত শক্তভাবে আঘাত করা যে এটি পানির উপর দিয়ে যায় a
  • এটি , তাই কমপক্ষে অক্ষরের সাথে সমাধানটি জয়ী হয়।
  • সমাধানগুলি অবশ্যই প্রদত্ত সমস্ত পরীক্ষার কেসগুলি পরিচালনা করতে সক্ষম হতে পারে, যদি ব্যবহৃত ভাষার সীমাবদ্ধতার কারণে এটি যদি অসম্ভব হয় তবে দয়া করে আপনার উত্তরে এটি উল্লেখ করুন।

পরীক্ষার মামলা

কোর্স # 1 (২ টি স্ট্রাইক)

####
# @#
#o~#
####

কোর্স # 2 (সম্ভব নয়)

#####
#@  #
# o #
#   #
#####

কোর্স # 3 (3 টি স্ট্রাইক)

~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~

কোর্স # 4 (২ টি স্ট্রাইক)

#########
#~~~~~~~#
#~~~@~~~#
##  .  ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########

কোর্স # 5 (সম্ভব নয়)

~~~~~~~
~...  ~
~.@.~.~
~...  ~
~ ~ ~.~
~ . .o~
~~~~~~~

আরও পরীক্ষার কেস:

https://pastebin.com/Azdyym00


1
সম্পর্কিত: এক , দুই
অ্যাডমবর্কবার্ক

আমরা যদি ইনপুট হিসাবে দ্বি-মাত্রিক বাইট অ্যারে ব্যবহার করি, তবে কি আমাদের প্রতীকগুলির জন্য একটি কাস্টম ম্যাপিং ব্যবহার করার অনুমতি দেওয়া হচ্ছে?
আর্নল্ড

@ আর্নল্ড এখানে যে বিষয়ে সাধারণ sensক্যমত্য আছে তা নিশ্চিত নন তবে আমি যতক্ষণ ইনপুটটি সনাক্তযোগ্য হবে ততক্ষণ পর্যন্ত এটি ঠিক আছে। আমি ইনপুট বিভাগ আপডেট করেছি ।
ম্যানফ্রেড র‌্যাডলুইমার

যদি সরাসরি গন্তব্যকে ইনপুট করে, আমরা কি গন্তব্য স্থানটি 'বালির' প্রতীক হতে পারি?
l4m2

@ l4m2 অবশ্যই, অন্যান্য উপায়ের সাথে এটি নিয়মিত থাকবে।
ম্যানফ্রেড র‌্যাডলউইমার 21

উত্তর:


6

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

কার্লিং কারিটিং সিনট্যাক্সে ইনপুট নেয় ([x, y])(a), যেখানে x এবং y প্রারম্ভিক অবস্থানের 0-সূচিযুক্ত স্থানাঙ্ক এবং [[]0 = বরফ, 1= প্রাচীর, 2= বালি সহ পূর্ণসংখ্যার একটি ম্যাট্রিক্স হয় where3 = গর্ত এবং 4= জল

0কোনও সমাধান না হলে ফিরে আসে ।

p=>a=>(r=F=([x,y],n,R=a[y],c=R[x])=>R[c&(R[x]=4)|n>=r||[-1,0,1,2].map(d=>(g=_=>(k=a[v=Y,Y+=d%2][h=X,X+=~-d%2])||g())(X=x,Y=y)>3?0:k>2?r=-~n:F(k>1?[X,Y]:[h,v],-~n)),x]=c)(p)|r

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

মন্তব্য

p => a => (                       // given the starting position p[] and the matrix a[]
  r =                             // r = best result, initialized to a non-numeric value
  F = (                           // F = recursive function taking:
    [x, y],                       //   (x, y) = current position
    n,                            //   n = number of shots, initially undefined
    R = a[y],                     //   R = current row in the matrix
    c = R[x]                      //   c = value of the current cell
  ) =>                            //
    R[                            // this will update R[x] once the inner code is executed
      c & (R[x] = 4) |            //   set the current cell to 4 (water); abort if it was
      n >= r ||                   //   already set to 4 or n is greater than or equal to r
      [-1, 0, 1, 2].map(d =>      //   otherwise, for each direction d:
        (g = _ => (               //     g = recursive function performing the shot by
          k = a[                  //         saving a backup (h, v) of (X, Y)
            v = Y, Y += d % 2][   //         and updating (X, Y) until we reach a cell
            h = X, X += ~-d % 2]) //         whose value k is not 0 (ice)
          || g()                  //   
        )(X = x, Y = y)           //     initial call to g() with (X, Y) = (x, y)
        > 3 ?                     //     if k = 4 (water -> fail):
          0                       //       abort immediately
        :                         //     else:
          k > 2 ?                 //       if k = 3 (hole -> success):
            r = -~n               //         set r to n + 1
          :                       //       else:
            F(                    //         do a recursive call to F():
              k > 1 ?             //           if k = 2 (sand):
                [X, Y]            //             start the next shots from the last cell
              :                   //           else (wall):
                [h, v],           //             start from the last ice cell
              -~n                 //           increment the number of shots
            )                     //         end of recursive call
      ), x                        //   end of map(); x = actual index used to access R[]
    ] = c                         // restore the value of the current cell to c
)(p) | r                          // initial call to F() at the starting position; return r

5

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

def p(g,c,d,k=0):
	while 1>k:c+=d;k=g.get(c,9)
	return-(k==2)or c-d*(k==3)
def f(g):
	c={q for q in g if g.get(q,9)>4};I=0;s=[c]
	while all(g.get(q,9)-4for q in c):
		c={k for k in{p(g,k,1j**q)for k in c for q in range(4)}if-~k}
		if c in s:return-1
		s+=[c];I+=1
	return I

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

-১৪ বাইটস ওভসকে ধন্যবাদ
-১ বাইট জোনাথন ফ্রেচের জন্য ধন্যবাদ


if k+1হতে পারে না if-~k?
জোনাথন ফ্রেচ


2

সি #, 461 418 বাইট

এই চ্যালেঞ্জটি পুনঃজীবিত করার জন্য এটি কেবল একটি অপ্রতিযোগিতামূলক রেফারেন্স বাস্তবায়ন:

কেভিন ক্রুইজসেন গল্ফ করেছেন

int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}

Ungolfed

int IceGolf(string[] course)
{
    // Width of the course
    int w = course[0].Length;

    // Course as single string
    var c = string.Join("", course);

    // Array of hits per field
    var hits = new int[c.Length];

    // Fields to continue from
    var nextRound = new List<int>();

    // Initialize hits
    for (int i = 0; i < hits.Length; i++)
    {
        if (c[i] != '@')
            // All fields start with a high value
            hits[i] = Int32.MaxValue;
        else
        {
            // Puck field starts with 0
            hits[i] = 0;
            nextRound.Add(i);
        }
    }

    for (int s = 1; ; s++)
    {
        // clear the fields that will be used in the next iteration
        var thisRound = nextRound;
        nextRound = new List<int>();

        foreach (int i in thisRound)
        {
            // test all 4 directions
            foreach (int d in new[] { -1, 1, -w, w })
            {
                int j = i+d;

                // ICE - slide along
                while (c[j] == ' ')
                    j += d;

                // WALL - stop on previous field
                if (c[j] == '#' && hits[j-d] > s)
                {
                    hits[j-d] = s;
                    nextRound.Add(j-d);
                }

                // SAND - stop
                if (c[j] == '.' && hits[j] > s)
                {
                    hits[j] = s;
                    nextRound.Add(j);
                }

                // HOLE return strikes
                if (c[j] == 'o')
                    return s;
            }
        }

        // No possible path found
        if (nextRound.Count == 0)
            return -1;
    }
}

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


1
আরও কিছুটা গল্ফ করেছে: int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}(418 বাইট) এছাড়াও, আপনি সম্ভবত পরীক্ষার কোডের সাথে একটি টিআইও-লিঙ্ক যুক্ত করতে পারেন ?
কেভিন ক্রুইজসেন

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