Wo zeigt der Pfeil?

32

Wo zeigt der Pfeil?

In dieser Herausforderung musst du einem Pfeil folgen und den Charakter ausgeben, auf den er zeigt.

Beispiele

Eingang:

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

Ausgabe: a


Eingang:

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

Ausgabe: b

Der Pfeil zeigt nicht auf, cweil er durch geteilt ist a, was bedeutet, dass dieser Pfad niemals zu einer Pfeilspitze führt.


Eingang:

a S      s
  |      |
  V      V
  b      c

Ausgabe: b


Eingang:

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

Ausgabe: Q

Dieser Pfad beginnt am S, geht nach rechts runter, geht nach rechts rauf und zeigt dann nach unten auf das Q. Beachten Sie, dass der Pfad nicht direkt von Snach verläuft +.


Eingang:

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

Ausgabe: A


Eingang:

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

Ausgabe: B

Weil die gültige Zeile niemals zu einem Leerzeichen führt. Die einzige Zeile, die nicht zu einem Leerzeichen führt, führt zu aB

Herausforderung

Die Eingabe ist eine mehrzeilige Zeichenfolge, in der Sie das Zeichen finden müssen, auf das der Pfeil zeigt. Es wird nur einen gültigen Pfeil geben. Der gültige Pfeil wird nur Punkt auf alphanumerische Zeichen ohne S. Eine Linie wird sich niemals überlappen. z.B-|-

  • S (groß) stellt dar, wo der Pfeil beginnt.
  • - repräsentiert eine horizontale Linie
  • +repräsentiert eine mögliche Änderung der Achse. Ein gültiger Pfeil beginnt niemals mit einem+ .
  • | repräsentiert eine vertikale Linie
  • > < V ^Jede davon repräsentiert die Pfeilspitze. Diese werden sich niemals mit einem verbinden +.

Es wird nur einen Sin der Zeichenfolge geben. Die Eingabe wird auch als Rechteck (nicht unbedingt als Quadrat) aufgefüllt.

Downgoat
quelle
1
Msgstr "Dies wird niemals neben a erscheinen S." Sollte wahrscheinlich mit "Dies wird niemals das erste Zeichen des Pfeils sein" umformuliert werden. (Da im QBeispiel ein +neben einem steht S.) " +Stellt eine Änderung der Achse dar." könnte besser sein " +repräsentiert eine mögliche Änderung der Achse." (Weil das BBeispiel zeigt, dass man sich +ohne Richtungswechsel durch eine bewegen kann .) Ansonsten nette Herausforderung. :)
Martin Ender
Ich habe einen Ihrer Testfälle geändert. Ich denke, das wird es schwieriger machen, Programme zu schreiben, die nur zufällig die richtige Antwort erhalten, wie es meine zuerst getan haben.
El'endia Starman
Kann die Pfeilspitze die Richtung ändern ---^? Mit anderen Worten, wenn in Beispiel B, könnte das B in der ersten Reihe bleiben?
Edc65
@ edc65 meinst du wie im Q Beispiel?
Downgoat
1
Eine Pfeilspitze wird nicht mit '+' verbunden. Aber könnte es mit 'S' verbunden sein? Ist S>agültig?
EDC65

Antworten:

9

JavaScript (ES6), 195 245 231 242 246 250

Edit4 Nun eine einzige rekursive Funktion. Mehr kann man wohl nicht spielen

Edit3 Test für gerade Linie und Test für Pfeilspitze in T-Funktion zusammengeführt, S- und H-Funktionen entfernt.

Edit2 überarbeitete und mehr :( nach dieser dieser Klarstellung

Bearbeiten Kleine Verbesserungen, einige Zeichen hier und da schneiden, warten auf CJammers Schritt in

Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser. (Funktioniert mit Firefox. In Chrome fehlt immer noch der Spread-Operator. ...)

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>

edc65
quelle
5

JavaScript 2016, 264 263 249 240 235 234 Bytes

Führen Sie es in Firefox aus:

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<----+`)

In einigen meiner Notizen verstreut:

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
bopjesvla
quelle
Sie können einige Bits speichern, indem Sie tun o = 'indexOf'und dann tun, q[o](e)wann Sie es verwenden möchten.
Nicht dass Charles
Auch beim Code-Golf sind for(;;)Loops normalerweise am effizientesten. Könnte in diesem Fall falsch sein, aber probieren Sie es aus.
Nicht dass Charles
1
Testfall a<-+S->bdenke ich , es geben sollte bnur als ein gültiger Pfeil wird nie mit + beginnen
edc65
Das wurde behoben und f wurde zu einem Einzeiler. Ihre Herangehensweise an dieses Problem hat mir übrigens sehr gut gefallen.
Bopjesvla
Eine Randnotiz: Ich mag das Array-Verständnis sehr, aber es ist in keiner Version des EcmaScript-Standards mehr enthalten. Ich schlage vor, Sie anser tag JavaScript 2016(immer eine gültige und gute Antwort, kein Problem damit)
edc65
3

VBA Excel 2007, 894 Byte

Nun, das fing viel besser an als es endete. Ich habe das Gefühl, dass meine Logik fehlerhaft ist und ich hätte eine Tonne Bytes einsparen können, wenn ich einen Teil meiner Logik neu angeordnet hätte

Die Eingabe hierfür ist die Spalte A des Blattes, auf dem Sie sich befinden. Diese Methode nutzt die Tatsache, dass Excel dieses schöne Raster hat und bricht alles auf, damit Sie besser sehen können, was es tut.

Sub m()nimmt einfach die kopierten eingefügten Daten aus Spalte A und bricht sie mit char auf. Wenn wir eine geänderte Eingabe zulassen, können Sie durch Entfernen ein paar Bytes sparen, wenn Sie das Labyrinth in 1 Zeichen pro Zelle vorformatierensub m()

Fügen Sie ein Labyrinth in Excel mit einer Größe von bis zu 99 Zeilen und 27 Zeichen ein. Wenn Sie größere Labyrinthe möchten, können Sie mit nur 2 zusätzlichen Bytes den Umfang auf 999 Zeilen und ZZ-Spalten erhöhen

Möglicherweise muss auch ein Richter anrufen, ob eine Excel-Tabelle eine gültige "Standardeingabe" für eine VBA-Antwort ist. Wenn nicht, ist es so gut wie unmöglich, VBA-Mehrzeileneingaben über das Direktfenster zuzuweisen

Um diesen Code auszuführen, fügen Sie diesen Code einfach in ein Excel-Modul ein, fügen Sie ein Labyrinth in A1 ein und führen Sie es aus 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
JimmyJazzx
quelle
2

Python 3, 349 Bytes

Ach, so viele Bytes.

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

Im Wesentlichen eine Breitensuche. Bonus: Dieser wird tatsächlich elegant beendet, anstatt ihn zu verwenden exit(), was ohnehin länger dauert.

El'endia Starman
quelle
Dies implementiert nicht etwa die Hälfte der Sucheinschränkungen, Mann. ideone.com/OzoWRX
bopjesvla
@bopjesvla: Drat, du hast recht. Gute Stelle!
El'endia Starman
Wie können Sie eine mehrzeilige Zeichenfolge mit verwenden input()? Das ist problematisch für mich.
The_Basset_Hound
@The_Basset_Hound: Sie können die Zeilenumbrüche nicht manuell eingeben. Sie müssen das Ganze auf einmal kopieren und einfügen.
El'endia Starman
@ El'endiaStarman Ich kopiere / füge ein und lese immer noch nur die erste Zeile, wie es scheint.
The_Basset_Hound
2

Perl 5

Die Lösung fiel länger aus als andere Lösungen.
Auch nach dem Golfen. Das ist also die ungolfed Version.
Es wird die Karte gedruckt, sodass Sie dem Cursor folgen können.

Wie funktioniert es? Bei jedem Schritt werden mögliche Züge auf den Stapel gelegt. Und es läuft weiter, bis nichts mehr auf dem Stapel ist oder eine Lösung gefunden wurde.
Es kann leicht modifiziert werden, um alle Lösungen zu finden und die nächste zu wählen -> while (@_) {...

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;
}

Prüfung

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

$ perl arrows.pl < test_arrows6.txt
.-----+
.     +-^
......XB
    .....
B
LukStorms
quelle
2
Ich sah den Titel und dachte "Perl" und "in 5 Bytes erledigt". Herzinfarkt
Conor O'Brien
2

PHP-Version (Kommentare sind französisch, sorry)

<?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;
}
gnieark
quelle
1

Haskell, 268 Bytes

Glückwunsch an die Javascripter! Hab das Kopfgeld aufgegeben, aber hier ist, was ich bekommen habe. Kann / Könnte nicht in allen Fällen funktionieren, kann aber tatsächlich mit Pfeilen umgehen, die in beginnen, und mit Pfeilspitzen, die mit +es verbunden sind, soweit ich weiß. Hab noch nicht mal nach dem gesucht S, ist erstmal (0,0)so weit.

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
Leif Willerts
quelle
0

Ich möchte eine APL-Version im Geiste von https://www.youtube.com/watch?v=a9xAKttWgP4 sehen

Zunächst kann eine vektorisierte Julia-Lösung, von der ich denke, dass sie 1: 0,3 in APL oder J übersetzt werden kann, mit einer Zeichenfolge R versehen werden, die ein L x K-Pfeilgramm darstellt. Zunächst wird die Symbolmatrix in eine Matrix aus kleinen 3x3-Matrizen übersetzt, deren Muster die binären Erweiterungen der Buchstaben der Zeichenfolge "\ 0 \ x18 \ fH \ t]] \ x1cI" sind. Zum Beispiel wird '+' als Umformung codiert ([0, Ziffern (int (']'), 2,8)], 3,3)

  0 2 0
  2 2 2
  0 2 0

In dieser Darstellung besteht der Pfad aus 2en und wird ab dem Startpunkt von 3en überflutet.

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

Zu testen,

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

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


   include("arrow.jl")

a

Übrigens denke ich, dass die Klausel "Ein weiteres + kann nebeneinander stehen, aber der Pfeil sollte priorisieren, wenn er auf ein - oder | zuerst geht." benachteiligt einen Vektoransatz. Wie auch immer, ich habe es einfach ignoriert.

mschauer
quelle