Suivez le chemin

18

Le défi est de suivre (tracer) le chemin:

  • ^n - par n lignes
  • vn - en baisse de n lignes
  • >n - à droite de n positions de caractère
  • <n - laissé par n positions de caractères

  • nest un entier supérieur à zéro (c'est-à-dire que vous ne pouvez pas recevoir une commande comme >-2).
  • Il n'y a pas de séparateurs entre les commandes, l'entrée bien formée ressemble à ceci:, >5v8<10^3aucune autre forme d'entrée n'est autorisée.
  • Le nombre de commandes est illimité.
  • Plus aucun caractère n'est censé se glisser dans l'entrée.

Exemples.

  1. L'entrée est une chaîne vide, la sortie:

    *
    
  2. L'entrée est soit >3ou <3: notez que cela ne fait aucune différence pour la sortie:

    ****
    
  3. Similaire pour ^3et v3:

    *
    *
    *
    *
    
  4. Entrée:, >1v2sortie:

    **
     *
     *
    
  5. Entrée:, ^4>3v2<1sortie:

    ****
    *  *
    * **
    *
    *
    
  6. Si vous revenez en arrière et utilisez le même chemin, ne dessinez rien de nouveau. Par exemple>5<5

    ******
    
  7. ... même si vous ne dessinez rien de nouveau, vous changez évidemment de position. Par conséquent, si votre entrée ressemble à ceci >4<2v3:, la sortie est:

    *****
      *
      *
      *
    
  8. Ceci est un exemple plus complexe: 1) le chemin peut se croiser 2) notez que les trois dernières étapes de la dernière commande décalent le chemin entier vers la droite. Entrée:, v6>4^3<7sortie:

       *
       *
       *
    ********
       *   *
       *   *
       *****
    
  9. Entrée :

    ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1
    

    Production:

    *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
    *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
    *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
    *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **
    *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
    *******************************************************************************************
    
nicael
la source
6
Comme vous l' avez publié ce défi aujourd'hui, je pense que ce sera un test approprié: ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1.
insertusernamehere
Pourriez-vous éventuellement fournir une implémentation de référence?
LegionMammal978
N'est-ce pas en fait une dupe? Veuillez décider: D
nicael
@nicael: Je dirais que non; l'E / S est différente, et il semble que les chemins ne puissent pas se croiser dans l'autre. Je pense que celui-ci est plus simple de manière à permettre différentes stratégies de golf. Cependant, je ne savais pas que j'étais soudainement en mesure de les rouvrir par moi-même, je pensais simplement voter.
marinus
@marinus Ok alors. Donc, lié: Yarr! Une carte du trésor caché! .
nicael

Réponses:

2

MATL , 71 octets

1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c

Utilise la version actuelle (6.0.0) du langage / compilateur. Fonctionne en Matlab et en Octave.

EDIT (21 juin 2016): en raison des changements de langue, le code nécessite quelques modifications pour s'exécuter dans la version actuelle (16.0.0). Vous pouvez l' essayer en ligne, y compris les modifications nécessaires.

Exemples

>> matl
 > 1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c
 > 
> ^4>3v2<1
    ****
    *  *
    * **
    *   
    *  

>> matl
 > 1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c
 > 
> ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1
  *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
  *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
  *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
  *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **   
  *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
  ******************************************************************************************* 

Explication

Le programme comporte quatre étapes principales:

  1. Lisez la chaîne d'entrée et divisez-la en ses composants.
  2. Créez une matrice à 2 colonnes où chaque ligne décrit un déplacement d'unité dans la direction appropriée. Par exemple, [0 -1]indique une étape vers la gauche. La première ligne est l'origine du chemin,[1 1]
  3. Calculez la somme cumulée de cette matrice le long de la première dimension. Maintenant, chaque ligne décrit les coordonnées de a *. Normaliser à la valeur minimale1
  4. Créez une nouvelle matrice qui contient 1aux coordonnées indiquées par la matrice de l'étape 3, et 0sinon. Celui-ci est ensuite transformé en une matrice de caractères.

Code:

1th                         % row vector [1 1]. Initiallize matrix of step 2
j                           % (step 1) read input string 
'.\d+'XX                    % split into components. Creates cell array of substrings
"                           % (step 2) for each component
   @Z)XK                    % unbox to obtain substring and copy
   6L)U:                    % obtain number and build vector of that size
   "                        % repeat as many times as that number
      K1)                   % paste substring. Get first character: '^', 'v', '>', '<'
      XK118=K94=-           % vertical component of unit displacement: -1, 0 or 1
      K62=K60=-             % horizontal component of unit displacement: -1, 0 or 1
      h                     % concatenate horizontally
      v                     % append vertically to existing matrix
   ]                        % end
]                           % end
Ys                          % (step 3) cumulative sum along first dimension
tY)X<1--                    % normalize to minimum value 1
lqg                         % (step 4) build matrix with 0/1
10*32+c                     % replace 0 by space and 1 by asterisk
Luis Mendo
la source
Ça marche pour le dernier exemple?
nicael
Comme c'est gentil! Oui. J'ai modifié ma réponse pour l'inclure
Luis Mendo
8

JavaScript (ES6), 204 211 210

Édition 1 Correction de bogue - sortie '*' pour l'entrée vide
Édition 2 Décodage plus simple de la direction en diff x et y

Voici ma réponse à La carte au trésor , révisée pour répondre aux spécifications.

F=m=>(m.replace(/\D(\d+)/g,(d,z)=>{for(;z--;r=[...r],r[x]=m,p[y]=r.join``)for(d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0),r=p[y]||'';!r[x];)r+=' '},x=y=0,p=[m='*']),p.join`
`)

Moins golfé et expliqué plus ou moins

f=m=>(
  x=y=0, // starting position
  p=['*'], // output string array (initialized with minimum output)
  m.replace( /\D(\d+)/g, 
  (d,z) => // execute the following for each group direction/length. Length in z, direction in d[0]
  {
    while( z--)  // repeat for the len
    {
      // check d to change values of x and y
      // all the comparison are with > and <, not equal
      // so that they work with the whole d, not just d[0]
      d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,
      // now if x or y are < 0 then p must be adjusted  
      p = ~x 
        ? ~y
          ? p // both x and y are >= 0, p is not changed
          : [y = 0, ...p] // y < 0, shift p by on adding a 0 element and set y to 0
        : p.map(r=> ' ' + r, x = 0); // x < 0, add a space to the left for each row in p and set x to 0
      r = p[y] || ''; // get current row in r
      for( ; !r[x]; ) // if the current row is empty or too short
        r += ' '; // ... add spaces up to position x
      // set character in x position
      r = [...r], // the shorter way is converting to array ...
      r[x] = '*', // setting the element
      p[y] = r.join`` // and the back to string using join
    }
  }),
  p.join`\n` // return output array as a newline separated string
}

Tester

F=m=>(m.replace(/\D(\d+)/g,(d,z)=>{for(;z--;r=[...r],r[x]='*',p[y]=r.join``)for(d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0),r=p[y]||'';!r[x];)r+=' '},x=y=0,p=['*']),p.join`
`)

// TEST
console.log = x => O.textContent += x + '\n';

console.log(F('')+'\n')

console.log(F('v6>4^3<7')+'\n')

console.log(F('^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1'))
<pre id=O></pre>

edc65
la source
Semble fonctionner parfaitement.
nicael
À une seule exception près: lorsque l'entrée est vide, l'exigence est d'écrire *.
nicael
Pour ceux dont les navigateurs ont des problèmes avec l'interprétation d'ES6: jsfiddle.net/2vrrd1wt .
nicael
@nicael merci d'avoir remarqué. Corrigé pour 1 octet
edc65
1

Perl, 174 octets

@M=(['*']);pop=~s/(.)(\d+)/($z=ord$1)&64?($y+=$z&8?-1:1)<0&&unshift@M,[$y++]:($x+=($z&2)-1)<0?@M=map{[$x=0,@$_]}@M:0,$M[$y][$x]='*'for1..$2/gre;print map{map{$_||$"}@$_,$/}@M

Attend l'entrée comme argument de ligne de commande. N'oubliez pas de citer l'argument!
Exemple:perl 177.pl "<1^2>3v4<5^6>7v8<9^10>11"

Assez lisible:

@M=(['*']);                                 # output origin/starting position

pop=~                                       # apply regex to cmdline arg
s!(.)(\d+)!                                 # match $1=direction, $2=count

    ($z=ord$1)                              # get ASCII code for char
    &64                                     # 'v^' have this bit set, '<>' don't

        ?                                   # adjust y:
            ($y += $z&8 ? -1 : 1)           # '^' has bit set, 'v' doesn't
            < 0 &&                          # negative y?
            unshift @M, [$y++]              # prepend row; abuse [] for $y++ saving 3 bytes

        :                                   # adjust x:
            ($x+= ($z&2) -1 )               # '>' has bit set: 2-1=1, '<' hasn't: 0-1=-1
            < 0 ?                           # negative x?
                @M = map{ [$x=0,@$_] } @M   # prepend column, reset x
                :0                          # '?:0' shorter than '&&()'
        ,                                   # oh, and also:
        $M[$y][$x]='*'                      # output current position.

    for 1..$2                               # iterate count
!grex;                                      

print map{ map{$_||$"} @$_, $/ } @M         # iterate rows/cols, print '*' or space
Kenney
la source
0

05AB1E , 27 octets

">^v<"žCÍS1ú‡#¦εć)>}ø`'*s<Λ

Essayez-le en ligne! (2020 est assez proche alors pourquoi pas)

M. Xcoder
la source