Où est la flèche pointée?

32

Où est la flèche pointée?

Dans ce défi, votre objectif est de suivre une flèche et de sortir le personnage vers lequel il pointe.

Exemples

Contribution:

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

Sortie: a


Contribution:

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

Sortie: b

La flèche ne pointe pas ccar elle est divisée par le a, ce qui signifie que ce chemin ne mène jamais à une tête de flèche.


Contribution:

a S      s
  |      |
  V      V
  b      c

Sortie: b


Contribution:

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

Sortie: Q

Ce chemin commence au S, descend, à droite, monte, à droite, puis pointe vers le Q. Notez que le chemin ne va pas directement de Sà +.


Contribution:

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

Sortie: A


Contribution:

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

Sortie: B

Parce que la ligne valide ne mènera jamais à un espace blanc. La seule ligne qui ne mène pas à un espace blanc mène à unB

Défi

L'entrée sera une chaîne de plusieurs lignes dans laquelle vous devez trouver le caractère pointé par la flèche. Il n'y aura qu'une seule flèche valide. La flèche valide pointera uniquement vers les caractères alphanumériques à l'exclusion S. Une ligne ne se chevauchera jamais. par exemple-|-

  • S (majuscule) représente le point de départ de la flèche.
  • - représente une ligne horizontale
  • +représente un éventuel changement d'axe. Une flèche valide ne commencera jamais par un +.
  • | représente une ligne verticale
  • > < V ^l'un d'eux représente la tête de flèche. Ceux-ci ne se connecteront jamais à un +.

Il n'y en aura qu'un Sdans la chaîne. L'entrée sera également complétée pour être un rectangle (pas nécessairement un carré).

Downgoat
la source
1
"Cela n'apparaîtra jamais à côté d'un S ." Devrait probablement être reformulé comme suit: «Ce ne sera jamais le premier caractère de la flèche». (Parce que l' Qexemple a un +adjacent à un S.) " +Représente un changement d'axe." pourrait être mieux " +représente un changement possible d'axe." (Parce que l' Bexemple montre que vous pouvez vous déplacer +sans changer de direction.) Sinon, beau défi. :)
Martin Ender
J'ai apporté une modification à l'un de vos cas de test. Je pense que cela va rendre plus difficile aux programmes d'écriture qui ne se produisent pour obtenir la bonne réponse, comme le mien a fait tout d' abord.
El'endia Starman
La tête de flèche peut-elle changer de direction, c'est ---^-à- dire ? En d'autres termes, si dans l'exemple B, le B pourrait-il rester dans la première rangée?
edc65
@ edc65 voulez-vous dire comme dans l'exemple Q?
Downgoat
1
Une tête de flèche ne sera pas connectée à '+'. Mais pourrait-il être connecté à «S»? Est S>avalide?
edc65

Réponses:

9

JavaScript (ES6), 195 245 231 242 246 250

Edit4 Maintenant, une seule fonction récursive. On ne peut probablement plus jouer au golf

Edit3 Test de ligne droite et test de pointe de flèche fusionnée dans la fonction T, les fonctions S et H supprimées.

Edit2 révisé et plus :( après cette cette clarification

Modifier de petites améliorations, couper des caractères ici et là, en attendant que CJammers intervienne

Testez l'exécution de l'extrait ci-dessous dans un navigateur compatible EcmaScript 6. (fonctionne sur Firefox. Chrome manque toujours l'opérateur de propagation ...)

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
la source
5

JavaScript 2016, 264 263 249 240 235 234 octets

Exécutez-le dans Firefox:

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

Dispersé dans certaines de mes notes:

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
la source
Vous pouvez enregistrer quelques bits en faisant o = 'indexOf'puis en faisant q[o](e)quand vous voulez l'utiliser.
Pas que Charles
De plus, dans le golf de code, les for(;;)boucles sont généralement les plus efficaces. Peut-être tort dans ce cas, mais essayez-le.
Pas que Charles le
1
cas de test a<-+S->bJe pense que cela devrait donner bseulement, car une flèche valide ne commencera jamais par un +
edc65
A corrigé cela et a transformé f en une ligne. Au fait, j'ai beaucoup aimé votre approche de ce problème.
bopjesvla
Remarque: j'aime vraiment la compréhension des tableaux, mais ce n'est plus dans aucune version du standard EcmaScript. Je suggère de vous tagger anser JavaScript 2016(stiil une réponse valide et bonne, pas de problème avec elle)
edc65
3

VBA Excel 2007, 894 octets

Eh bien, cela a commencé beaucoup mieux que ça s'est terminé. J'ai le sentiment que ma logique est défectueuse et j'aurais pu économiser une tonne d'octets si j'avais réorganisé une partie de ma logique, mais trop de temps a déjà été coulé dans cela = P

L'entrée pour cela est la colonne A de la feuille sur laquelle vous vous trouvez. Cette méthode utilise le fait qu'Excel a cette belle grille et décompose tout pour que vous puissiez voir ce qu'elle fait plus clairement.

Sub m()prend simplement la copie des données collées de la colonne A et les décompose par le caractère. Si nous autorisons une entrée modifiée, si vous préformatez le labyrinthe en 1 caractère par cellule, vous pouvez économiser quelques octets en supprimantsub m()

Collez un labyrinthe dans Excel n'importe quelle taille jusqu'à 99 lignes par 27 caractères. Si vous voulez des labyrinthes plus grands, ses 2 octets supplémentaires seulement pour augmenter la portée à 999 lignes et colonnes ZZ

Peut également avoir besoin d'un appel des juges pour savoir si une feuille Excel est une «entrée standard» valide pour une réponse VBA. Sinon, il est quasiment impossible de donner à VBA Multi-line input VIA la fenêtre Immédiat

Pour exécuter ce code, collez-le simplement dans un module Excel, collez un labyrinthe dans A1 et exécutez 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
la source
2

Python 3, 349 octets

Ugh, tant d'octets.

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

Essentiellement une recherche étendue. Bonus: cela se termine en fait gracieusement au lieu d'utiliser exit(), ce qui est de toute façon plus long.

El'endia Starman
la source
Cela n'implémente pas environ la moitié des contraintes de recherche, mec. ideone.com/OzoWRX
bopjesvla
@bopjesvla: Drat, vous avez raison. Bon endroit!
El'endia Starman
Comment pouvez-vous utiliser une chaîne multiligne avec input()? C'est problématique pour moi.
The_Basset_Hound
@The_Basset_Hound: Vous ne pouvez pas entrer manuellement les nouvelles lignes; vous devez copier-coller le tout en une seule fois.
El'endia Starman
@ El'endiaStarman Je suis en train de copier / coller et il ne lit toujours que la première ligne.
The_Basset_Hound
2

Perl 5

La solution s'est avérée plus longue que les autres solutions.
Même après l'avoir joué au golf. Voici donc la version non golfée.
Il imprime la carte afin que vous puissiez suivre le curseur.

Comment ça marche? À chaque étape, il place des coups possibles sur la pile. Et il continue de fonctionner jusqu'à ce qu'il ne reste plus rien sur la pile ou qu'une solution ne soit trouvée.
Il peut être facilement modifié pour trouver toutes les solutions et choisir la plus proche -> 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;
}

Tester

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

$ perl arrows.pl < test_arrows6.txt
.-----+
.     +-^
......XB
    .....
B
LukStorms
la source
2
J'ai vu le titre et j'ai pensé "Perl" et "fait en 5 octets". crise cardiaque
Conor O'Brien
2

Version PHP (les commentaires sont en français, désolé)

<?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
la source
1

Haskell, 268 octets

Félicitations aux Javascripters! A renoncé à la prime, mais voici ce que j'ai. Peut / pourrait ne pas fonctionner dans tous les cas, mais gère en fait les flèches commençant par et les pointes de flèches se connectant à +es, pour autant que je sache. N'a même pas inclus la recherche de S, c'est (0,0)pour l'instant.

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
la source
0

Je souhaite voir une version APL dans l'esprit de https://www.youtube.com/watch?v=a9xAKttWgP4

Pour commencer, une solution de Julia vectorisée qui, je pense, peut être traduite 1: 0,3 en APL ou J. Elle prend une chaîne R représentant un flèche L x K. Il traduit d'abord la matrice de symboles en une matrice de petites matrices 3x3 dont les motifs sont les extensions binaires des lettres de la chaîne "\ 0 \ x18 \ fH \ t]] \ x1cI". Par exemple, '+' est codé comme remodeler ([0, chiffres (int (']'), 2,8)], 3,3)

  0 2 0
  2 2 2
  0 2 0

Dans cette représentation, le chemin se compose de 2 et est inondé de 3 à partir du point de départ.

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

Tester,

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

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


   include("arrow.jl")

a

Soit dit en passant, je pense que la clause "Un autre + peut être adjacent, mais la flèche devrait donner la priorité à un - ou | premier". défavorise une approche vectorielle. Quoi qu'il en soit, je l'ai simplement ignoré.

mschauer
la source