Segui il percorso


18

La sfida è seguire (disegnare) il percorso:

  • ^n - su di n righe
  • vn - giù di n righe
  • >n - a destra per n posizioni di carattere
  • <n - lasciato da n posizioni di caratteri

  • nè un numero intero, maggiore di zero (ovvero non è possibile ricevere un comando simile >-2).
  • Non ci sono separatori tra i comandi, l'input ben formato è simile al seguente: >5v8<10^3non sono consentite altre forme di input.
  • Il numero di comandi è illimitato.
  • Non si suppone che più personaggi si insinuino nell'input.

Esempi.

  1. L'input è una stringa vuota, output:

    *
    
  2. L'input è o >3o <3: nota che questo non fa alcuna differenza per l'output:

    ****
    
  3. Simile per ^3e v3:

    *
    *
    *
    *
    
  4. Ingresso:, >1v2uscita:

    **
     *
     *
    
  5. Ingresso:, ^4>3v2<1uscita:

    ****
    *  *
    * **
    *
    *
    
  6. Se torni indietro e usi lo stesso percorso, non disegnare nulla di nuovo. Per esempio>5<5

    ******
    
  7. ... anche se non disegni nulla di nuovo, ovviamente cambi la posizione. Quindi, se il tuo input è simile >4<2v3al seguente:, l'output è:

    *****
      *
      *
      *
    
  8. Questo è un esempio più complesso: 1) il percorso può incrociarsi 2) nota che gli ultimi tre passi dell'ultimo comando spostano l'intero percorso verso destra. Ingresso:, v6>4^3<7uscita:

       *
       *
       *
    ********
       *   *
       *   *
       *****
    
  9. Input :

    ^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
    

    Produzione:

    *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
    *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
    *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
    *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **
    *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
    *******************************************************************************************
    

6
Come avete pubblicato questa sfida oggi, credo che questo sarà un banco di prova adeguata: ^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.
inserire nomeutentequi

Potresti fornire un'implementazione di riferimento?
LegionMammal978,

Non è in realtà un inganno però? Decidi: D
nicael, il

@nicael: direi che non lo è; l'I / O è diverso e sembra che i percorsi non possano incrociarsi nell'altro. Penso che questo sia più semplice in modi che potrebbero consentire diverse strategie di golf. Tuttavia, non ero consapevole di essere stato in grado di riaprirli improvvisamente da solo, ho pensato che stavo semplicemente esprimendo un voto.
Marin

@marinus Ok allora. Quindi, correlati: Yarr! Una mappa per il tesoro nascosto! .
nicael

Risposte:


2

MATL , 71 byte

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

Utilizza la versione corrente (6.0.0) della lingua / compilatore. Funziona in Matlab e in Octave.

EDIT (21 giugno 2016): a causa di cambiamenti nella lingua, il codice richiede alcune modifiche per essere eseguito nella versione corrente (16.0.0). Puoi provarlo online comprese le modifiche necessarie.

Esempi

>> 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
  *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
  *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
  *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
  *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **   
  *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
  ******************************************************************************************* 

Spiegazione

Il programma prevede quattro passaggi principali:

  1. Leggi la stringa di input e divida nei suoi componenti.
  2. Costruisci una matrice a 2 colonne in cui ogni riga descrive uno spostamento di unità nella direzione appropriata. Ad esempio, [0 -1]indica un passaggio a sinistra. La prima riga è l'origine del percorso,[1 1]
  3. Calcola la somma cumulativa di quella matrice lungo la prima dimensione. Ora ogni riga descrive le coordinate di a *. Normalizza al valore minimo1
  4. Creare una nuova matrice che contiene 1alle coordinate indicate dalla matrice dal passaggio 3 e in 0altro modo. Questo viene quindi trasformato in una matrice di caratteri.

Codice:

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

Funziona per l'ultimo esempio?
nicael

Che carino! Sì, lo fa. Ho modificato la mia risposta per includerla
Luis Mendo

8

JavaScript (ES6), 204 211 210

Modifica 1 Bug fix - output '*' per input vuoto
Modifica 2 Decodifica più semplice della direzione in xey diff

Ecco la mia risposta a La mappa del tesoro , rivista per soddisfare le specifiche.

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

Meno golf e spiegato più o meno

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
}

Test

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>


Sembra funzionare perfettamente.
nicael

Con una sola eccezione: quando l'input è vuoto, il requisito è scrivere *.
nicael

A chi ha i browser ha problemi con l'interpretazione di ES6: jsfiddle.net/2vrrd1wt .
nicael

@nicael grazie per avermelo notato. Risolto per 1 byte
edc65

1

Perl, 174 byte

@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

Prevede input come argomento della riga di comando. Assicurati di citare l'argomento!
Esempio:perl 177.pl "<1^2>3v4<5^6>7v8<9^10>11"

Leggibile:

@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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.