অ্যার পয়েন্টিং কোথায়?


32

অ্যার পয়েন্টিং কোথায়?

এই চ্যালেঞ্জের মধ্যে, আপনার লক্ষ্যটি একটি তীর অনুসরণ এবং চরিত্রটিকে এটি নির্দেশ করছে আউটপুট।

উদাহরণ

ইনপুট:

d  S------+    b
          |     
          |     
   c      +--->a

আউটপুট: a


ইনপুট:

S-----+---a->c
      |       
      V       
      b       

আউটপুট: b

তীরটি নির্দেশ করছে না cকারণ এটি ভাগ করে দেওয়া হয়েছে a, এর অর্থ এই পথটি কখনও তীর মাথায় নিয়ে যায় না।


ইনপুট:

a S      s
  |      |
  V      V
  b      c

আউটপুট: b


ইনপুট:

d s<+S+--V
    |||  Q
    -++   

আউটপুট: Q

এই পাথটি শুরু হয় S, নীচে যায়, ডানদিকে যায়, ডানে উপরে যায়, তারপরে Q তে নীচে নির্দেশ করে Note নোট করুন যে পথটি সোজা থেকে অন্যদিকে যায় Sনা +


ইনপুট:

d s-+   +-S  +--+
    +-->b |  |  |
     |  | +--+  |
     +--+ A<----+

আউটপুট: A


ইনপুট:

S-----+   
|     +-^ 
+---+->B  
    +---^ 

আউটপুট: B

কারণ বৈধ লাইন কখনই কোনও সাদা বর্ণের অক্ষরে নেতৃত্ব দেয় না। একমাত্র লাইন যা একটি সাদা স্থানের অক্ষরকে নেতৃত্ব দেয় না তা এB

চ্যালেঞ্জ

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

  • S (মূলধন) প্রতিনিধিত্ব করে যেখানে তীর শুরু হয়।
  • - একটি অনুভূমিক রেখা প্রতিনিধিত্ব করে
  • +অক্ষের একটি সম্ভাব্য পরিবর্তন উপস্থাপন করে। একটি বৈধ তীর কখনই একটি দিয়ে শুরু হবে না +
  • | একটি উল্লম্ব রেখা প্রতিনিধিত্ব করে
  • > < V ^এর মধ্যে যে কোনও তীর মাথা উপস্থাপন করে। এগুলি কখনই একটিতে সংযুক্ত হবে না +

Sস্ট্রিংয়ে কেবল একটি থাকবে । ইনপুটটি একটি আয়তক্ষেত্র হিসাবে প্যাড করা হবে (অগত্যা একটি বর্গ নয়)।


1
"এটি কখনই সংলগ্ন প্রদর্শিত হবে না S।" "সম্ভবত এটি তীরের প্রথম অক্ষর হবে না" - এ অনুবাদ করা উচিত। (কারণ Qউদাহরণটির সাথে একটি +সংলগ্ন রয়েছে S)) " +অক্ষের পরিবর্তনের প্রতিনিধিত্ব করে।" ভাল হতে পারে " +অক্ষ পরিবর্তন একটি সম্ভাব্য প্রতিনিধিত্ব করে।" (কারণ Bউদাহরণটি দেখায় যে আপনি +দিক পরিবর্তন না করেই পার হয়ে যেতে পারেন )) অন্যথায়, দুর্দান্ত চ্যালেঞ্জ। :)
মার্টিন এন্ডার

আমি আপনার পরীক্ষার একটি ক্ষেত্রে পরিবর্তন করেছি made আমি মনে করি যে এটি প্রোগ্রাম লিখতে আরও শক্ত করে তোলে যা কেবলমাত্র সঠিক উত্তর পেতে ঘটবে , যেমনটি আমার প্রথম হয়েছিল।
এল'েন্ডিয়া স্টারম্যান

তীর মাথাটি কি দিক পরিবর্তন করতে পারে ---^? অন্য কথায়, বি উদাহরণে যদি বি প্রথম সারিতে থাকতে পারে?
edc65

@ edc65 আপনার কিউ উদাহরণের মত?
ডাউনওয়েট

1
একটি তীর মাথা '+' এর সাথে সংযুক্ত হবে না। তবে এটি কি 'এস' এর সাথে সংযুক্ত হতে পারে? কি S>aবৈধ?
edc65

উত্তর:


9

জাভাস্ক্রিপ্ট (ES6), 195 245 231 242 246 250

Edit4 এখন, একটি একক পুনরাবৃত্তি ফাংশন। সম্ভবত আরও গল্ফ করা যাবে না

সরলরেখার জন্য সম্পাদনা 3 পরীক্ষা এবং টি ফাংশনে মিশ্রিত তীরের জন্য পরীক্ষা, এস এবং এইচ ফাংশন সরানো হয়েছে।

Edit2 সংশোধিত এবং আর :( পর এই এই শোধন

ছোট্ট উন্নতিগুলি সম্পাদনা করুন , এখানে এবং সেখানে কিছু চর কেটে সিজেমারদের প্রবেশের অপেক্ষায়

নীচে স্নিপেট চলমান পরীক্ষা করুন একমাস্ক্রিপ্ট l অনুবর্তী ব্রাউজারে। (ফায়ারফক্সে কাজ করে Chrome ক্রোম এখনও স্প্রেড অপারেটর অনুপস্থিত ...)

f=(s,p=s[I='indexOf']`S`,w=m=[o=~s[I]`
`,1,-o,-1],q,v,r)=>m.some((d,i)=>{for(v=w,q=p;r=s[q+=d],r=='|-'[i&1];)v='+';return r=r==v?f(s,q,v):/\w/.test(r=s[q+m['^>V<'[I](r)]])&&r},s=[...s],s[p]=0)&&r


// Less golfed
// U: recursive scan function
U = (s, // input string or array
     p = s.indexOf`S`, // current position, defult to position of S into string (at first call)
     w = // char to compare looking for a '+', at first call default to garbage as you can't follow '+' near 'S'
       m = [// m, global, offset array form movements. 
         o = ~s.indexOf`\n`, // o, global, row line +1 (negated)
         1, -o, -1], // complete the values of m array
     // m and o are assigned again and again at each recursive call, but that is harmless
     // params working as local variables as the function is recursive
     q,v,r) => 
{
   s = [...s]; //convert to array, as I have to modify it while scanning
     //the conversion is done again and again at each recursive call, but that is harmless
   s[p] = 0; // make s[p] invalid to avoid bouncing back and forth
  
   m.some( // for each direction, stop if endpoint found
      (d,i ) => {
        q = p; // start at current position, then will add the offset relative to current direction
        v = w; // for each direction, assign the starting value that can be '+' or garbage at first call
        // compare char at next position with the expected char based on direction (- for horiz, | for vertical)
        // in m array, values at even positon are vertical movements, odds are horizontal
        while (s[q+=d] == '|-'[i&1]) // while straight direction, follow it until it ends
          v = '+'; // from now on '+' is allowed
        r = s[q];
        if (r == v) // check if found a '+'
          r = U(s, q, v) // recursive call to check all directions from current position
        else
        {
          r = s[q + m['^>V<'.indexOf(r)]], // pointed char in p (if arrowhead, else will return undefined)
          r = /\w/.test(r) && r // if alphanumeric, then we found our result - else r = false
        }  
        return r; // returning r to .some; if r is truthy, the .some function will stop
      }
   ) 
   return r; // result if found, else undefined or null
}

// TEST
out=x=>O.innerHTML+=x.replace(/</g,'&#60;')+'\n'

// Using explicit newlines '\n' to ensure the padding to a rectangle
;[
 ['z<+S-+->a','a'] 
,['a<-+S>b','b']
,['S-+\n  |\n  V\n  a','a']
,['a S      s\n  |      |\n  V      V\n  b      c  ','b']
,['S-----+  \n|     +-^  \n+---+->B \n    +---^','B']
,['d s<+S+--V\n    |||  Q\n    -++    ','Q']
,['d s-+   +-S  +--+\n    +-->b |  |  |\n     |  | +--+  |\n     +--+ A<----+  ','A']
,['S-----+   \n|     +-^ \n+---+->B  \n    +---^ ','B']
].forEach(t=>{
  r=f(t[0])
  k=t[1]
  out('Test '+(r==k?'OK':'Fail')+'\n'+t[0]+'\nResult: '+ r +'\nCheck: '+k+'\n')
})
<pre id=O></pre>


5

জাভাস্ক্রিপ্ট 2016, 264 263 249 240 235 234 বাইট

ফায়ারফক্সে এটি চালান:

m=l=>{o=(q,e)=>q.indexOf(e)
s=[-1,1,c=~o(l,`
`),-c]
f=i=>!o[i]&(!(r=l[i+s[o(a="<>^V",o[i]=c=l[i])]])|r<"0"|r>"z"|r=="S"||alert(s=r))&&c&&[for(j of (c!='+'?a:"")+"-|+")for(k of s)l[i+k]!=j|~o(l[i]+j,k*k>1?"-":"|")||f(i+k)]
f(o(l,'S'))}

m(`d s-+   +-S  +--+
    +-->b |  |  |
     |  | +--+  |
     +--+ A<----+`)

আমার কয়েকটি নোটে ছড়িয়ে ছিটিয়ে থাকা:

m=l=>{o=(q,e)=>q.indexOf(e) //shorthand for indexOf
s=[-1,1,c=o(l,`
`)+1,-c] // get all possible moves in 1d
w=[] // to keep track of the already-visited indexes
f=i=>{c=l[i] // current character
if(!w[i]&&c) // only continue if the index wasn't already visited and we aren't out of bounds
{r=l[i+s[o(a="<>^V",w[i]=c)]] // sets w[i] to a truthy value and maps the arrows to their corresponding moves in s. If c is an arrow, r is the character it's pointing to.
if(!r||r<"0"||r>"z"||r=="S"||alert(r)) // if r is an alphanumeric character that isn't r, show it and return. If not, continue.
for(j of (c!='+'?a:"")+"-|+") // iterate over all characters to make sure plusses are checked out last, which is necessary at the start.
for(k of s) // check out all possible moves
l[i+k]!=j|| // check if the move leads to the character we're looking for
~o(l[i]+j,k*k>1?"-":"|")|| // make sure the current nor that character goes against the direction of the move
f(i+k)}} // make the move, end of f
f(o(l,'S'))} // start at S

আপনি কিছু বিট সংরক্ষণ করতে পারেন o = 'indexOf'এবং তারপরে q[o](e)যখন আপনি এটি ব্যবহার করতে চান তখন করছেন ।
চার্লস

এছাড়াও, কোড গল্ফে, for(;;)লুপগুলি সাধারণত সর্বাধিক দক্ষ are এক্ষেত্রে ভুল হতে পারে তবে চেষ্টা করে দেখুন।
চার্লস

1
পরীক্ষার a<-+S->bb
কেসটি

এটি স্থির করে এফটিকে ওয়ান-লাইনারে পরিণত করা হয়েছে। আমি আসলেই এই সমস্যার প্রতি আপনার পদ্ধতির পছন্দ করেছি।
bopjesvla

একটি পার্শ্ব নোট: আমি সত্যিই অ্যারে বোঝাপড়া পছন্দ করি, তবে এটি ইকমাস্ক্রিপ্ট স্ট্যান্ডার্ডের কোনও সংস্করণে নেই। আমি আপনাকে JavaScript 2016অ্যান্সার ট্যাগ করার পরামর্শ দিচ্ছি (কোনও বৈধ এবং ভাল উত্তর জোর করুন, এতে সমস্যা নেই)
edc65

3

ভিবিএ এক্সেল 2007, 894 বাইট

আচ্ছা এটি অনেক ভাল শুরু হয়েছিল তখন এটি শেষ হয়েছিল। আমার অনুভূতি রয়েছে যে আমার যুক্তি ত্রুটিযুক্ত এবং আমি যদি আমার কিছু যুক্তি পুনরায় সাজাই তবে আমি এক টন বাইট সংরক্ষণ করতে পারতাম, তবে ইতিমধ্যে = পি এর মধ্যে খুব বেশি সময় ডুবে গেছে P

এর জন্য ইনপুট হ'ল আপনি যা যা শীট চালু করছেন তার কলাম ক। এই পদ্ধতিটি ব্যবহার করে যে এক্সেলের এই দুর্দান্ত গ্রিড রয়েছে এবং এটি সমস্ত কিছু ভেঙে দেয় তাই আপনি এটি আরও পরিষ্কারভাবে কী করছে তা দেখতে পারেন।

Sub m()কেবল কলাম এ থেকে অনুলিপি করা ডেটা গ্রহণ করছে এবং এটি চর দ্বারা বের করে। যদি আমরা কোনও পরিবর্তিত ইনপুটটিকে অনুমতি দিই তবে আপনি যদি প্রতি ঘরের মধ্যে কোষটিকে প্রাইমফরম্যাট করেন তবে প্রতি বেলটি মুছে ফেলে আপনি কিছু বাইট সংরক্ষণ করতে পারবেনsub m()

27 চারি জুড়ে 99 সারি পর্যন্ত যেকোন আকারের এক্সেলটিতে কোনও গোলকধাঁটি আটকান। আপনি যদি বড় ম্যাসেস চান তবে তার কেবলমাত্র 2 টি অতিরিক্ত বাইটস স্কোপটি 999 সারি এবং জেডজেড কলামে বাড়িয়ে তুলবে

ভিবিএর উত্তরের জন্য এক্সেল শিটটি বৈধ "স্ট্যান্ডার্ড ইনপুট" কিনা তা নিয়ে বিচারকদের একটি কল প্রয়োজন হতে পারে। যদি তা না হয় তবে ভিবিএ মাল্টি-লাইন ইনপুটটি উইন্ডো উইন্ডোটি দেওয়া তাত্পর্যপূর্ণভাবে অসম্ভব

এই কোডটি চালানোর জন্য এই কোডটি কেবল একটি এক্সেল মডিউলে পেস্ট করুন, A1 এ একটি গোলকধাঁটি আটকান এবং চালান sub j()

Sub m()
For k=1 To 99
u=Cells(k,1).Value
For i=1 To Len(u)
Cells(k,i+1).Value=Mid(u,i,1)
Next
Next
Columns(1).Delete
End Sub
Sub j()
m
With Range("A:Z").Find("S",,,,,,1)
h .row,.Column,0
End With
End Sub
Sub h(r,c,t)
If t<>1 Then l r-1,c,1,0,r
If t<>-1 Then l r+1,c,-1,0,r
If t<>2 Then l r,c-1,2,0,r
If t<>-2 Then l r,c+1,-2,0,r
End Sub
Sub l(r,c,y,p,i)
On Error GoTo w
q=Cells(r,c).Text
If q="V" Or q="^" Or q="<" Or q=">" Then
p=1
End If
f="[^V<>]"
If p=1 And q Like "[0-9A-UW-Za-z]" Then
MsgBox q: End
Else
If q="^" Then p=1: GoTo t
If q="V" Then p=1: GoTo g
If q="<" Then p=1: GoTo b
If q=">" Then p=1: GoTo n
Select Case y
Case 1
t:If q="|" Or q Like f Then l r-1,c,y,p,q
Case -1
g:If q="|" Or q Like f Then l r+1,c,y,p,q
Case 2
b:If q="-" Or q Like f Then l r,c-1,y,p,q
Case -2
n:If q="-" Or q Like f Then l r,c+1,y,p,q
End Select
If q="+" And i<>"S" Then h r,c,y*-1
p=0
End If
w:
End Sub

2

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

উঘ, অনেক বাইট।

S=input().split('\n')
Q=[[S[0].find('S'),0]]
D=[[1,0],[0,1],[-1,0],[0,-1]]
A='-S--++-'
B='|S||++|'
P='>V<^'
i=0
while D:
 a,b=Q[i];i+=1
 j=S[b][a]
 for x,y in D:
  try:
   c,d=a+x,b+y;k=S[d][c]
   if k in P:
    z=P.index(k);print(S[d+D[z][1]][c+D[z][0]]);D=[]
   if (j+k in A and x)+(j+k in B and y)*~([c,d]in Q):Q+=[[c,d]]
  except IndexError: pass

মূলত প্রস্থের প্রথম অনুসন্ধান। বোনাস: এটি আসলে ব্যবহারের পরিবর্তে মনোযোগ সহকারে প্রস্থান করে exit(), যা যাইহোক দীর্ঘ।


এটি অনুসন্ধানের সীমাবদ্ধতার অর্ধেকটি বাস্তবায়ন করে না। ideone.com/OzoWRX
bopjesvla

@ বুপজেভেলা: ড্র্যাট, আপনি ঠিক বলেছেন। ভাল জায়গা!
এল'েন্ডিয়া স্টারম্যান

আপনি কীভাবে একাধিক রেখা ব্যবহার করতে পারবেন input()? এটা আমার জন্য সমস্যাযুক্ত।
The_Basset_Hound

@ দ্য_বাসেট_হাউন্ড: আপনি নিজেই নতুন লাইনে প্রবেশ করতে পারবেন না; আপনাকে একবারে পুরো জিনিসটি অনুলিপি করতে হবে।
এল'েন্ডিয়া স্টারম্যান

@ এল'এন্ডিয়াস্টারম্যান আমি অনুলিপি / আটকানো করছি এবং এটি এখনও প্রথম লাইনে কেবল মনে হচ্ছে এটি পড়ছে।
The_Basset_Hound

2

পার্ল 5

সমাধান অন্যান্য সমাধানের চেয়ে দীর্ঘতর হয়ে উঠেছে।
এমনকি এটি গল্ফ পরে। সুতরাং এটি অসম্পূর্ণ সংস্করণ।
এটি মানচিত্রটি মুদ্রণ করে যাতে আপনি কার্সারটি অনুসরণ করতে পারেন।

যেভাবে এটি কাজ করে? প্রতিটি পদক্ষেপে এটি স্ট্যাকের উপর সম্ভাব্য পদক্ষেপ রাখে। এবং স্ট্যাকের মধ্যে কিছুই অবশিষ্ট নেই, বা কোনও সমাধান না পাওয়া পর্যন্ত এটি চলতে থাকে।
এটি সহজেই সমস্ত সমাধানগুলি সন্ধান করতে এবং নিকটতম -> (@_) এর সময় বেছে নিতে {...

while(<>){
  chomp;
  @R=split//;
  $j++;$i=0;
  for(@R){$nr++;$i++;$A[$i][$j]=$_;if('S'eq$_){$x=$i;$y=$j}}
  $xm=$i,if$xm<$i;$ym=$j;
}
push(@_,[($x,$y,'S',0)]);
$cr='';
while(@_&&''eq$cr){
 @C=pop@_;
 ($x,$y,$d,$n)=($C[0]->[0],$C[0]->[1],$C[0]->[2],$C[0]->[3]);
 $c=$A[$x][$y];
 $A[$x][$y]='.';
 if($c=~m/[S+]/){
    if('L'ne$d&&$A[$x+1][$y]=~m/[+-]/){push(@_,[($x+1,$y,'R',$n+1)])}
    if('D'ne$d&&$A[$x][$y-1]=~m/[+|]/){push(@_,[($x,$y-1,'U',$n+1)])}
    if('R'ne$d&&$A[$x-1][$y]=~m/[+-]/){push(@_,[($x-1,$y,'L',$n+1)])}
    if('U'ne$d&&$A[$x][$y+1]=~m/[+|]/){push(@_,[($x,$y+1,'D',$n+1)])}
 }
 if($c eq'|'){
    if($d ne'U'&&$A[$x][$y+1]=~m/[+|<>^V]/){push(@_,[($x,$y+1,'D',$n+1)])}
    if($d ne'D'&&$A[$x][$y-1]=~m/[+|<>^V]/){push(@_,[($x,$y-1,'U',$n+1)])}
 }
 if($c eq'-'){
    if($d ne'L'&&$A[$x+1][$y]=~m/[+-<>^V]/){push(@_,[($x+1,$y,'R',$n+1)])}
    if($d ne'R'&&$A[$x-1][$y]=~m/[+-<>^V]/){push(@_,[($x-1,$y,'L',$n+1)])}
 }
 if($c=~m/[<>^V]/&&$n<$nr){
    if($c eq'>'&&$A[$x+1][$y]=~m/\w/){$cr=$A[$x+1][$y];$nr=$n}
    if($c eq'<'&&$A[$x-1][$y]=~m/\w/){$cr=$A[$x-1][$y];$nr=$n}
    if($c eq'V'&&$A[$x][$y+1]=~m/\w/){$cr=$A[$x][$y+1];$nr=$n}
    if($c eq'^'&&$A[$x][$y-1]=~m/\w/){$cr=$A[$x][$y-1];$nr=$n}
 }
 print_map()
}
print "$cr\n";
sub print_map {
    print "\033[2J"; #clearscreen
    print "\033[0;0H"; #cursor at 0,0
    for$j(1..$ym){for$i(1..$xm){print (($x==$i&&$y==$j)?'X':$A[$i][$j])}print"\n"}
    sleep 1;
}

পরীক্ষা

$ cat test_arrows6.txt
S-----+
|     +-^
+---+->B
    +---^

$ perl arrows.pl < test_arrows6.txt
.-----+
.     +-^
......XB
    .....
B

2
আমি শিরোনামটি দেখেছি এবং ভেবেছিলাম "পার্ল" এবং "5 বাইটে সম্পন্ন"। হার্ট অ্যাটাক
কনর ও'ব্রায়েন

2

পিএইচপি সংস্করণ (মন্তব্য ফরাসি, দুঃখিত)

<?php
/*
* By Gnieark https://blog-du-grouik.tinad.fr oct 2015
* Anwser to "code golf" http://codegolf.stackexchange.com/questions/57952/where-is-the-arrow-pointing in PHP
*/
//ouvrir le fichier contenant la "carte et l'envoyer dans un array 2 dimmension
$mapLines=explode("\n",file_get_contents('./input.txt'));
$i=0;
foreach($mapLines as $ligne){
    $map[$i]=str_split($ligne,1);
    if((!isset($y)) && in_array('S',$map[$i])){
        //tant qu'à parcourir la carte, on cherche le "S" s'il n'a pas déjà été trouvé.
        $y=$i;
        $x=array_search('S',$map[$i]);
    }
    $i++;
}
if(!isset($y)){
    echo "Il n'y a pas de départ S dans ce parcours";
    die;
}
echo "\n".file_get_contents('./input.txt')."\nLe départ est aux positions ".$map[$y][$x]." [".$x.",".$y."]. Démarrage du script...\n";
$previousX=-1; // Contiendra l'ordonnée de la position précédente. (pour le moment, une valeur incohérente)
$previousY=-1; // Contiendra l'absycede la position précédente. (pour le moment, une valeur incohérente)
$xMax=count($map[0]) -1;
$yMax=count($map) -1;
$previousCrosses=array(); //On ne gardera en mémoire que les croisements, pas l'ensemble du chemin.
while(1==1){ // C'est un défi de codagee, pas un script qui sera en prod. j'assume.
    switch($map[$y][$x]){
        case "S":
            //même fonction que "+"
        case "+":
            //on peut aller dans les 4 directions
            $target=whereToGoAfterCross($x,$y,$previousX,$previousY);
            if($target){
          go($target[0],$target[1]);
            }else{
          goToPreviousCross();
            }
            break;
        case "s":
            goToPreviousCross();
            break;
        case "-":
        //déplacement horizontal
        if($previousX < $x){
          //vers la droite
          $targetX=$x+1;
          if(in_array($map[$y][$targetX],array('-','+','S','>','^','V'))){
        go($targetX,$y);
          }else{
        //On est dans un cul de sac
        goToPreviousCross();
          }
        }else{
          //vers la gauche
          $targetX=$x-1;
          if(in_array($map[$y][$targetX],array('-','+','S','<','^','V'))){
        go($targetX,$y);
          }else{
        //On est dans un cul de sac
        goToPreviousCross();
          }
        }
            break;
        case "|":
        //déplacement vertical
        if($previousY < $y){
          //on descend (/!\ y augmente vers le bas de la carte)
          $targetY=$y+1;
          if(in_array($map[$targetY][$x],array('|','+','S','>','<','V'))){
        go ($x,$targetY);
          }else{
        goToPreviousCross();
          }
        }else{
        //on Monte (/!\ y augmente vers le bas de la carte)
          $targetY=$y - 1;
          if(in_array($map[$targetY][$x],array('|','+','S','>','<','V'))){
        go ($x,$targetY);
          }else{
        goToPreviousCross();
          } 
        }
            break;
    case "^":
    case "V":
    case ">":
    case "<":
      wheAreOnAnArrow($map[$y][$x]);
      break;
    }
}
function wheAreOnAnArrow($arrow){
  global $x,$y,$xMax,$yMax,$map;
  switch($arrow){
    case "^":
      $targetX=$x;
      $targetY=$y -1;
      $charsOfTheLoose=array(" ","V","-","s");
      break;
    case "V":
      $targetX=$x;
      $targetY=$y + 1;
      $charsOfTheLoose=array(" ","^","-","s");
      break;
    case ">":
      $targetX=$x + 1;
      $targetY=$y;
      $charsOfTheLoose=array(" ","<","|","s");   
      break;
    case "<":
      $targetX=$x - 1;
      $targetY=$y;
      $charsOfTheLoose=array(" ",">","|","s");   
      break;
    default:     
      break;
  }
  if(($targetX <0) OR ($targetY<0) OR ($targetX>$xMax) OR ($targetY>$yMax) OR (in_array($map[$targetY][$targetX],$charsOfTheLoose))){
      //on sort du cadre ou on tombe sur un caractere inadapté
      goToPreviousCross();
  }else{
    if(preg_match("/^[a-z]$/",strtolower($map[$targetY][$targetX]))){
      //WIN
      echo "WIN: ".$map[$targetY][$targetX]."\n";
      die;
     }else{
      //on va sur la cible
      go($targetX,$targetY);
     }
  }
}
function whereToGoAfterCross($xCross,$yCross,$previousX,$previousY){

            //haut
            if(canGoAfterCross($xCross,$yCross +1 ,$xCross,$yCross,$previousX,$previousY)){
                return array($xCross,$yCross +1);
            }elseif(canGoAfterCross($xCross,$yCross -1 ,$xCross,$yCross,$previousX,$previousY)){
                //bas
                return array($xCross,$yCross -1);
            }elseif(canGoAfterCross($xCross-1,$yCross,$xCross,$yCross,$previousX,$previousY)){
                //gauche
                return array($xCross-1,$yCross);
            }elseif(canGoAfterCross($xCross+1,$yCross,$xCross,$yCross,$previousX,$previousY)){
                //droite
                return array($xCross+1,$yCross);
            }else{
          //pas de direction possible
          return false;
            }  
}
function canGoAfterCross($xTo,$yTo,$xNow,$yNow,$xPrevious,$yPrevious){
    global $previousCrosses,$xMax,$yMax,$map;
    if(($xTo < 0) OR ($yTo < 0) OR ($xTo >= $xMax) OR ($yTo >= $yMax)){return false;}// ça sort des limites de la carte
    if(
    ($map[$yTo][$xTo]==" ") // on ne va pas sur un caractere vide
    OR (($xTo==$xPrevious)&&($yTo==$yPrevious)) //on ne peut pas revenir sur nos pas (enfin, ça ne servirait à rien dans cet algo)
    OR (($xTo==$xNow)&&($map[$yTo][$xTo]=="-")) //Déplacement vertical, le caractere suivant ne peut etre "-"
    OR (($yTo==$yNow)&&($map[$yTo][$xTo]=="|")) // Déplacement horizontal, le caractère suivant ne peut être "|"
    OR ((isset($previousCrosses[$xNow."-".$yNow])) && (in_array($xTo."-".$yTo,$previousCrosses[$xNow."-".$yNow]))) //croisement, ne pas prendre une direction déjà prise
   ){    
      return false;
    }
    return true;    
}
function go($targetX,$targetY){
    global $previousX,$previousY,$x,$y,$previousCrosses,$map;
    if(($map[$y][$x]=='S')OR ($map[$y][$x]=='+')){
        //on enregistre le croisement dans lequel on renseigne la direction prise et la direction d'origine
        $previousCrosses[$x."-".$y][]=$previousX."-".$previousY;
        $previousCrosses[$x."-".$y][]=$targetX."-".$targetY; 
    }
    $previousX=$x;
    $previousY=$y;
    $x=$targetX;
    $y=$targetY;
    //debug
    echo "deplacement en ".$x.";".$y."\n";   
}
function goToPreviousCross(){
  global $x,$y,$previousX,$previousY,$xMax,$yMax,$previousCrosses;

  /*
  * On va remonter aux précédents croisements jusqu'à ce 
  * qu'un nouveau chemin soit exploitable
  */
  foreach($previousCrosses as $key => $croisement){
    list($crossX,$crossY)=explode("-",$key);
    $cross=whereToGoAfterCross($crossX,$crossY,-1,-1);
    if($cross){
      go($crossX,$crossY);
      return true;
    } 
  }
  //si on arrive là c'est qu'on est bloqués
  echo "Aucun chemin n'est possible\n";
  die;
}

1

হাস্কেল, 268 বাইট

জাভাস্ক্রিপ্টারে অভিনন্দন! অনুগ্রহ ছেড়ে দিয়েছি, কিন্তু আমি যা পেয়েছি তা এখানে। মে / মাইট সব ক্ষেত্রেই কাজ করতে পারে না, তবে প্রকৃতপক্ষে শুরু হওয়া তীরগুলি এবং এএসহেডকে সংযুক্তকারী তীরচিহ্নগুলি পরিচালনা করে +I এমনকি অনুসন্ধানটি অন্তর্ভুক্ত করেনি S, (0,0)এখনকার জন্য।

import Data.List
x%m=length m<=x||x<0
a s(x,y)z|y%s||x%(head s)=[]|0<1=b s(x,y)z$s!!y!!x
b s(x,y)z c|g c>[]=filter(>' ')$concat[a s(x+i k,y+i(3-k))k|k<-g c,k-z`mod`4/=2]|0<1=[c]
i=([0,-1,0,1]!!)
g c=findIndices(c`elem`)$words$"V|+S <-+S ^|+S >-+S"
f s=a(lines s)(0,0)0

0

আমি https://www.youtube.com/watch?v=a9xAKttWgP4 এর স্পিরিটে একটি এপিএল সংস্করণ দেখতে চাই

শুরু হিসাবে, একটি ভেক্টরাইজড জুলিয়া সমাধান যা আমি মনে করি 1: 0.3 এপিএল বা জেতে অনুবাদ করা যেতে পারে It এটি একটি স্ট্রিং আর লাগে যা একটি এল এক্স কে এরআরগ্রামকে উপস্থাপন করে। এটি প্রথমে চিহ্নগুলির ম্যাট্রিক্সকে ছোট 3x3 ম্যাট্রিক্সের ম্যাট্রিক্সে অনুবাদ করে যার প্যাটার্নগুলি "\ 0 \ x18 \ fH \ t]] \ x1cI" স্ট্রিংয়ের অক্ষরের বাইনারি সম্প্রসারণ। উদাহরণস্বরূপ '+' পুনরায় আকার হিসাবে এনকোড করা হয়েছে ([0, অঙ্কগুলি (int (']')), 2,8)], 3,3)

  0 2 0
  2 2 2
  0 2 0

এই উপস্থাপনায়, পথটি 2 টি নিয়ে গঠিত এবং প্রারম্ভিক বিন্দু থেকে 3 টি প্লাবিত হয়।

A=zeros(Int,L*3+3,K*3+3)
s(i,j=i,n=2)=A[i:end+i-n,j:end+j-n]
Q=Int['A':'Z';'a':'z']
for k=0:K-1,l=0:L-1
r=R[K*l+k+1]
q=search(b"V^><+S|-",r)
d=reverse(digits(b"\0\x18\fH\t]]\x1cI"[q+1],2,8))
A[1+3l:3l+3,1+3k:3k+3]=2*[d;0]
A[3l+2,3k+2]+=r*(r in Q&&r!='V'&&r!='^')+(1-r)*(r=='S')+3(5>q>0)
end
m=0
while sum(A)>m
m=sum(A)
for i=0:1,j=1:2,(f,t)=[(3,6),(11,15)]
A[j:end+j-2,j:end+j-2]=max(s(j),f*(s(j).*s(2-i,1+i).==t))
end
end
for i=[1,4],k=Q
any(s(1,1,5).*s(5-i,i,5).==11*k)&&println(Char(k))
end

পরীক্ষা করার জন্য,

   R=b"""
       d  S------+    b
                 |     
                 |     
          c      +--->a
       """;

   K=search(R,'\n') # dimensions
   L=div(endof(R),K)


   include("arrow.jl")

a

যাইহোক, আমি মনে করি এই ধারাটি "অন্য + সংলগ্ন হতে পারে তবে তীরটি একটি - বা | প্রথম দিকে অগ্রাধিকার দেওয়া উচিত" " কোনও অসুবিধায় ভেক্টর পদ্ধতির রাখে। যাইহোক, আমি কেবল এটি উপেক্ষা করেছি।

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