সিক্রেটসগুলিকে একটি 1-মাত্রিক ল্যাবরেঞ্জারে আনলক করা


41

পটভূমি

নিজেকে একটি মাত্রিক গোলকধাঁধাতে হারিয়ে যেতে আপনি জাগ্রত! একটি রহস্যময় জিনি (বা কিছু) উপস্থিত হয় এবং ব্যাখ্যা করে যে প্রস্থানটি আপনার সামনে রয়েছে, তবে এটি আপনার এবং প্রস্থানটির মধ্যে একটি চ্যালেঞ্জের একটি সিরিজ। আপনি যখন ঘোরাফেরা করছেন আপনি বুঝতে পারবেন তথাকথিত সমস্ত চ্যালেঞ্জগুলি কেবল লক দরজা। আপনি প্রথমে টি-আকৃতির কী-গর্তযুক্ত একটি দরজা দেখতে পেয়েছেন এবং নিজের মতো কোনও চাবি নেই, নিজের পদক্ষেপগুলি আবার সরিয়ে নিয়ে, একটি Tআকৃতির একটি চাবি খুঁজছেন ।

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

এক নিচে, আরও অনেক ...

চ্যালেঞ্জ

এই চ্যালেঞ্জের লক্ষ্যটি গোলকধাঁধা থেকে বেরিয়ে আসতে আপনাকে কত পদক্ষেপ নেয় তা চিহ্নিত করা।

এই চ্যালেঞ্জটির ইনপুটটি গোলকধাঁধা: একটি স্ট্রিং যেখানে কেবলমাত্র অক্ষর থাকে [A-Za-z^$ ]। শব্দকোষ:

  • ^- শুরুর জায়গা। ইনপুট ঠিক একটি থাকতে হবে ^
  • $- প্রস্থান (স্বাধীনতা!) ইনপুট ঠিক একটি থাকতে হবে $
  • [A-Z]- মূল চিঠিগুলি দরজা বোঝায়। আপনি যদি ইতিমধ্যে প্রয়োজনীয় কীটি সংগ্রহ করেন তবে আপনি কেবলমাত্র এই দরজা দিয়ে যেতে পারবেন।
  • [a-z]- লোয়ার কেস চিঠিগুলি কীগুলি বোঝায়। আপনি যে কীটি রেখেছেন সেই স্থানটিতে হাঁটার মাধ্যমে এই কীগুলি সংগ্রহ করুন।

ইনপুটটিতে প্রতিটি মূল বর্ণের সর্বাধিক একটি থাকবে। এর অর্থ সর্বমোট দরজার সংখ্যা 0-26 এর মধ্যে থাকবে।

প্রতিটি লক দরজা [A-Z]ঠিক একটি অনুরূপ নিম্নতর চাবি থাকবে [a-z]। ইনপুটটিতে অনেকগুলি স্পেস ( ) থাকতে পারে ।

সমস্ত দরজা শুরুর ডানদিকে এবং প্রস্থানের বাম দিকে থাকবে। সুতরাং কোন অতিরিক্ত অতিরিক্ত দরজা থাকবে না। সমস্ত ইনপুট সমাধানযোগ্য হবে।

এই চ্যালেঞ্জের আউটপুট একটি সংখ্যা হবে, গোলকধাঁধা থেকে বেরিয়ে আসার জন্য যে পদক্ষেপ নিয়েছে number

অ্যালগরিদম

এই জঘন্য স্থানটি থেকে বেরিয়ে আসার জন্য আপনার পদ্ধতিগত পদ্ধতির পদ্ধতিটি নিম্নরূপ:

  • শুরুতে ( ^) শুরু করুন এবং আপনার সামনে যে কোনও কী সংগ্রহ করে (ডানদিকে) এগিয়ে যান।
  • আপনি যখন কোনও দরজাটি পেরিয়ে আসেন, আপনার যদি সঠিক কী থাকে তবে আপনি দরজার দিকে এগিয়ে যান। যদি আপনার কাছে সঠিক কী না থাকে তবে আপনি যে দরজাটি খুলতে পারছেন না তার সন্ধান না পাওয়া অবধি আপনি কীগুলি সংগ্রহ করে পিছনে (বাম দিকে) হাঁটবেন।
  • আপনি যখন বর্তমান সমস্যাযুক্ত দরজার জন্য কীটি সংগ্রহ করেন, আপনি ডানদিকে ফিরে যান এবং আরও এগিয়ে যান।
  • আপনি প্রস্থান ( $) এ যাওয়ার আগ পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করুন ।

অভিজ্ঞ গল্ফাররা বুঝতে পারবেন যে আপনার কোডটিকে এই নির্দিষ্ট অ্যালগরিদমটি প্রয়োগ করা উচিত নয় যতক্ষণ না এটি একই ফলাফলকে ছাড়িয়ে যায় যদি আপনি এই অ্যালগরিদমটি চালান।

কাউন্টিং

প্রতিবার যখন আপনি একটি বর্গ থেকে অন্য স্কোয়ারের দিকে পা রাখবেন, তখন এটি একটি পদক্ষেপ হিসাবে গণ্য হবে। 180º ঘুরিয়ে দেওয়া কোনও অতিরিক্ত পদক্ষেপ নেয় না। প্রয়োজনীয় চাবি ছাড়া আপনি কোনও দরজার দিকে এগিয়ে যেতে পারবেন না। এটি বাছাই করতে আপনাকে অবশ্যই একটি কীতে উঠতে হবে এবং জয়ের জন্য প্রস্থানের দিকে যেতে হবে। আপনার প্রথম পদক্ষেপের পরে, শুরু স্থান ( ^) অন্য নিয়মিত জায়গার মতোই আচরণ করে।

উদাহরণ

এই উদাহরণগুলিতে আমি শূন্যস্থানগুলি মানব-পঠনযোগ্যতার আন্ডারস্কোর হিসাবে রেখেছি।

ইনপুট হয় _a_^_A__$__। আউটপুট হয় 11। আপনি 1সামনের দিকে এগিয়ে যান, লক্ষ্য করুন যে Aদরজার জন্য আপনার কোনও চাবি নেই , এবং তারপরে মুখের বিষয়ে। আপনি a( 3পদক্ষেপ পিছনে, এখন 4মোট) সম্বলিত স্থান দখল না করা পর্যন্ত আপনি পিছনে হাঁটাবেন । তারপরে আপনি প্রস্থান না করে ( 7দফায় এগিয়ে, 11মোট) মোট স্থান দখল না করা পর্যন্ত আপনি এগিয়ে যান ।

ইনপুট হয় b__j^__a_AJB_$। আউটপুটটি হ'ল 41গোলকধাঁধার পিছনে দুটি পৃথক ট্রিপ করুন, একটিটি jচাবি পেতে এবং তার পরেরটি bকীটি পাওয়ার জন্য ।

ইনপুট হয় __m__t_^__x_T_MX_$____। আউটপুট হয় 44। আপনি xকীটি পেতে কোনও বাড়তি ট্রিপ করবেন না , যেমন আপনি এটি শুরু থেকে ঘরে T

ইনপুট হয় g_t_^G_T$। আউটপুট হয় 12। আপনি Gকোনও চাবি ছাড়া এবং অবিলম্বে মুখোমুখি হয়ে স্থানটিতে যেতে পারবেন না । আপনি tকীটির পথে কীটি বেছে নেওয়ার পক্ষে যথেষ্ট ভাগ্যবান gএবং এভাবে আপনার স্বাধীনতার পথে দু'টি দরজা খোলার জন্য।

ইনপুট হয় _^_____$। আউটপুট হয় 6। এটা সহজ.

I / O নির্দেশিকা এবং বিজয়ী মানদণ্ড

স্ট্যান্ডার্ড আই / ও বিধি প্রযোজ্য। এটি একটি চ্যালেঞ্জ।


17
সুন্দর চ্যালেঞ্জ ছাড়াও, আমি মন্তব্য করতে চাই যে শব্দটি এবং ব্যাখ্যাটি কতটা ভাল
লুইস মেন্ডো

4
"এভাবে কোনও অতিরিক্ত অতিরিক্ত দরজা থাকবে না।" আমি মনে করি AbA^aB$অতিরিক্ত পারেন না। ;)
মার্টিন এন্ডার

4
@ অরলপ এই অন্ধকার অ্যালগরিদমকে ঘুরে বেড়াচ্ছে কীভাবে লোকেরা গল্ফ করে তা দেখতে আমি আরও আগ্রহী। "যান সমস্ত কীগুলি তারপরে সমস্ত দরজা খুলুন" এর অনুকূল সমাধানটি করা তুচ্ছ মনে হয়।
টারবুলেন্সটো

2
@ পিটারটেলর এবং টারবুলেনসটো না এটি নয়, কে বলবেন যে সমস্ত কীগুলি বাম দিকে আছে এবং সমস্ত দরজা ডানদিকে আছে? এবং অতিরিক্ত অতিরিক্ত কীগুলি / দরজাগুলি আকর্ষণীয়ও হবে। এটি বেশ আকর্ষণীয় হবে, কারণ এটি নির্ভরতা গ্রাফ সমাধান করার অর্থ।
orlp

5
প্রতিটি দরজার চাবি থাকে। প্রতি কি একটি দরজা আছে?
ব্যবহারকারী 2357112

উত্তর:


3

সিজেম, 45

1q_'$#<'^/~\W%:A;ee{~32+A#)_T>{:T+2*+}&]0=)}/

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

ব্যাখ্যা:

1         initial step count; this 1 is actually for the last step :)
q_'$#<    read the input and only keep the part before the '$'
'^/~      split by '^' and dump the 2 pieces on the stack
\W%:A;    take the first piece, reverse it and store it in A
ee        enumerate the other piece (making [index char] pairs)
{…}/      for each [index char] pair
  ~32+    dump the index and character on the stack, and add 32 to the character;
           uppercase letters become lowercase and other chars become garbage
  A#)     find the index of this character in A and increment it (not found -> 0)
  _T>     check if this index (number of steps from '^' back to the key)
           is greater than T (which is initially 0)
  {…}&    if that's true (we need to go back), then
    :T    store that index in T (keeping track of how far we go back before '^')
    +     add to the other index (from the pair, number of steps we took after '^')
    2*    double the result (going back and forth)
    +     add it to the step count
  ]0=     keep only the first value from the bottom of the stack (step count)
           (if the condition above was false, we'd have 2 extra values)
  )       increment the step count (for the current step)

7

পাইথ, 51 বাইট

JxQ"^"K-xQ"$"JVQI&}NrG1>JxQrN0=JxQrN0=+K*2t-xQNJ;pK

"নেস্টেড" কীগুলি এবং শুরু থেকে শেষের দূরত্বটিকে উপেক্ষা করে দরজা এবং এর কীটির (দ্বিগুণ, বৃত্তাকার ভ্রমণের জন্য) মধ্যবর্তী দূরত্বের যোগফলটি করুন:

JxQ"^"                                              #Initialize the farther point with the starting position
      K-xQ"$"J                                      #Initialize the step counter with the difference between the exit and the start
              VQ                                    #iterate over the input
                I&}NrG1>JxQrN0                      #check if is upper and if the keys is father than one stored (to eliminate nested keys)
                              =JxQrN0               #update the farther key
                                     =+K*2t-xQNJ;   #update step counter with the round trip door<>key
                                                 pK #print the step counter

পাইথন 2.7 এ একই অ্যালগরিদম:

lab=raw_input()
farther_key=lab.index('^')
steps = lab.index('$') - farther_key
for i in lab:
    if i.isupper():
        if farther_key> lab.index(i.lower()):
            farther_key=lab.index(i.lower())
            steps+=((lab.index(i) - farther_key)-1)*2
print steps

5

পাইথন 2, 155 154 134 128 বাইট

সম্পাদনা: @ ব্যবহারকারী 2357112 এবং @ লভজো তাদের মন্তব্যের জন্য ধন্যবাদ যে আমাকে আমার সমাধান থেকে আরও 20 26 বাইট শেভ করতে সহায়তা করেছে !

def f(l):
 i=l.index;b=i('^');t=i('$')-b
 for d in filter(str.isupper,l):
  k=i(d.lower())
  if k<b:b=k;t+=2*(i(d)-k-1)
 print t

1
আপনি একটি বাইট সংরক্ষণ করে একটি সেমিকোলনের সাথে দ্বিতীয় এবং তৃতীয় লাইন একত্রিত করতে পারেন। এছাড়াও, আই ভ্যারিয়েবলটি লুপে অপ্রয়োজনীয় বলে মনে হয়।
লুভজো

@ লভজো ২ য় এবং ৩ য় লাইনে সম্মত হয়েছেন তবে আপনি কেন iঅপ্রয়োজনীয় বলছেন ? iদরজাটি বর্তমানে প্রক্রিয়াজাতকরণের অবস্থানটি অনুসন্ধান করে এবং এর কীটি এখনও অবধি গ্রহণ না করা হলে প্রয়োজনীয় (যেমন k- যদি - কীটির অবস্থান f- এর চেয়ে কম দূরে - আমরা চলতে চলেছি তবে অবধি) আমাদের যুক্ত করতে হবে 2*(i-k-1)আমাদের মোট পদক্ষেপ (কীটি পেতে বাম দিকে হাঁটা, এবং ডান দিকে ফিরে হাঁটা) ...?
কেন 'জোয়ে' মোশার

1
কিন্তু পারলেন না iদ্বারা প্রতিস্থাপন করা l.index(d)দ্বারা চতুর্থ দিকে সরানো পঞ্চম লাইন এবং নিয়োগ উপর?
লুভজো

পৃথক eএবং fভেরিয়েবলগুলি অপ্রয়োজনীয় দেখায়। এছাড়াও, আপনি l.indexএকটি ভেরিয়েবলে সংরক্ষণ করে একগুচ্ছ অক্ষর সংরক্ষণ করতে পারেন।
ব্যবহারকারী 2357112

@ লভজো: হ্যাঁ, আপনি ঠিক বলেছেন ... আমি প্রথমে আপনার মন্তব্যটি ভুল বুঝেছি। @ ব্যবহারকারী 2357112: একেবারে সঠিক। xঅপ্রয়োজনীয় এছাড়াও। অনুমান করুন আমার গল্ফ নুব-ইনস প্রদর্শিত হচ্ছে। :) সাহায্যের জন্য ধন্যবাদ!
কেন 'জোয়ে' মোশার

4

সি, 136 বাইট

q,x,p[300],z,c,k;main(i){for(;p[c=getchar()]=++i,c-36;z&&(k+=(x=p[c+32])&&x<q?(q=q>x?x:q,2*i-2*x-1):1))z=p[94],q||(q=z);printf("%d",k);}

4

পিএইচপি 5.3, 123 বাইট

কোড গল্ফে এটি আমার প্রথম পোস্ট, আশা করি এটি প্রথম পোস্টের জন্য যথেষ্ট গল্ফের মানের। অবশ্যই একটি মজাদার চ্যালেঞ্জ এবং একটি দুর্দান্ত প্রশ্ন!

function n($m){while('$'!=$o=$m[$i++])$o=='^'?$b=$i+$c=0:$o>'Z'||$b<=$k=stripos($m,$o))?$c++:$c+=2*$i-3-2*$b=$k;return$c;}

এই প্রোগ্রামটি সুন্দরভাবে আপত্তি জানায় যে পিএইচপি আপনার কোনও ভেরিয়েবলগুলি ব্যবহার করার আগে তাদের প্রাক-ঘোষণা করার দরকার নেই।

এটি 0 থেকে শুরু করার জন্য আমার চূড়ান্ত সমাধানে কয়েক বাইট সংক্ষিপ্ত আকারে পরিণত হয়েছিল এবং '^' থেকে শুরু না করে শুরু অক্ষরটি পাওয়া গেলে ধাপ গণনাটি পুনরায় সেট করুন।

কোনও টিপস অবশ্যই স্বাগত!


3

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

s=>(i=c=>s.indexOf(c),p=i`^`,l=i`$`-p,s.replace(/[A-Z]/g,(c,j)=>p>(t=i(c.toLowerCase()))?l+=j-(p=t)-1<<1:0),l)

@ রবের পাইথ উত্তরটির বন্দর।


2

পাইথন 2.7, 234 199 179

a=raw_input()
x=a.index
v=x('^')
b=x('$')-v
l=filter(str.islower,a[:v])[::-1]
for i in filter(str.isupper,a):
 k=i.lower()
 if k in l:b+=(x(i)-x(k)-1)*2;l=l[l.index(k)+1:]
print b

1

এডাব্লুকে, 174 বাইট

func f(xmS){x+=S
c=a[x]
if(c~/^[A-Z]/&&!k[c]){C=c
S=-S
s--}else{c=toupper(c)
k[c]=1
s++
if(c==C){S=-S;C=9}}if(c=="$"){print s}else f(x,S)}{split($0,a,"")
f(index($0,"^"),1)}

সম্ভবত একটি শক্ত অ্যালগরিদম আছে, কিন্তু আমি এটি নিয়ে এসেছি।

নোট যে আমি ব্যবহার করছি কি gawk। কিছু বাস্তবায়ন এই পথে AWKকোনও স্ট্রিং বিভক্ত নাও হতে পারে ""


1

সি #, 309 বাইট

class P{static void Main(string[]a){string m=Console.ReadLine(),k="";var f=true;char b,c=b=' ';int j=m.IndexOf('^'),t=0;for(;m[j]!='$';j+=f?1:-1){c=m[j];if(char.IsUpper(c)){if(k.IndexOf(char.ToLower(c))<0){f=!f;b=c;t--;}}if(char.IsLower(c)){k+=c;if(char.ToUpper(c)==b){f=!f;t--;}}t++;}Console.WriteLine(t);}}

অবরুদ্ধ সংস্করণ:

    class P
{
    static void Main(string[] a)
    {
        string m = Console.ReadLine(), k = "";
        var f = true;
        char b, c = b = ' ';
        int j = m.IndexOf('^'), t = 0;
        for (; m[j] != '$'; j += f ? 1 : -1)
        {
            c = m[j];
            if (char.IsUpper(c))
            {
                if (k.IndexOf(char.ToLower(c)) < 0)
                {
                    f = !f; b = c; t--;
                }
            }

            if (char.IsLower(c))
            {
                k += c;
                if (char.ToUpper(c) == b) { f = !f; t--; }
            }


            t++;
        }
        Console.WriteLine(t);
        Console.ReadKey();

    }
}

এখানে অভিনব কিছু নয়, কেবল স্ট্রিংটির মাধ্যমে পুনরাবৃত্তি করুন এবং চরিত্রের উপর ভিত্তি করে দিক পরিবর্তন করুন এবং কী কোনও কী স্ট্রিংয়ে রয়েছে কিনা তা।

মি = গোলকধাঁধা স্ট্রিং

k = কী স্ট্রিং

এফ = দিকনির্দেশ (সত্য গোলকধাঁধা সামনে

বি = ব্যাকট্র্যাকিংয়ের সময় অনুসন্ধানের কী

ঘন ব্যবহারের কারণে কিছু বাইট সংরক্ষণ করতে মি [জে] এর জন্য সি = স্থানধারক

j = স্ট্রিংয়ের চর সূচকটি দেখার জন্য

t = গণনা

এখনও গল্ফিংয়ের তুলনায় তুলনামূলকভাবে নতুন তাই আপনি যদি কোথাও দেখতে পান তবে আমি এটি স্লিম করতে পারি, আমাকে জানান!

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