Folge dem Pfad


17

Die Herausforderung besteht darin, dem Pfad zu folgen (zu zeichnen):

  • ^n - um n Zeilen nach oben
  • vn - um n Zeilen nach unten
  • >n - Rechts von n Zeichenpositionen
  • <n - links von n Zeichenpositionen

  • nist eine ganze Zahl, größer als Null (dh Sie können keinen Befehl wie erhalten >-2).
  • Es gibt keine Trennzeichen zwischen den Befehlen. Die wohlgeformte Eingabe sieht folgendermaßen aus: Es >5v8<10^3ist keine andere Form der Eingabe zulässig.
  • Die Anzahl der Befehle ist unbegrenzt.
  • Es dürfen sich keine Zeichen mehr in die Eingabe einschleichen.

Beispiele.

  1. Eingabe ist eine leere Zeichenfolge, Ausgabe:

    *
    
  2. Die Eingabe ist entweder >3oder <3: Beachten Sie, dass dies für die Ausgabe keinen Unterschied macht:

    ****
    
  3. Ähnlich für ^3und v3:

    *
    *
    *
    *
    
  4. Eingang: >1v2Ausgang:

    **
     *
     *
    
  5. Eingang: ^4>3v2<1Ausgang:

    ****
    *  *
    * **
    *
    *
    
  6. Wenn Sie zurückgehen und denselben Pfad verwenden, zeichnen Sie nichts Neues. Z.B>5<5

    ******
    
  7. ... obwohl du nichts neues zeichnest, änderst du offensichtlich die Position. Wenn Ihre Eingabe also so aussieht: >4<2v3lautet die Ausgabe:

    *****
      *
      *
      *
    
  8. Dies ist ein komplexeres Beispiel: 1) Der Pfad kann sich selbst kreuzen. 2) Beachten Sie, dass die letzten drei Schritte des letzten Befehls den gesamten Pfad nach rechts verschieben. Eingang: v6>4^3<7Ausgang:

       *
       *
       *
    ********
       *   *
       *   *
       *****
    
  9. Eingabe :

    ^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
    

    Ausgabe:

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

6
Wie Sie diese Herausforderung heute geschrieben haben, ich denke , das ein richtiger Testfall sein wird: ^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

Könnten Sie möglicherweise eine Referenzimplementierung bereitstellen?
LegionMammal978

Ist das nicht wirklich ein Trottel? Bitte entscheiden Sie: D
nicael 31.12.15

@nicael: Ich würde sagen, es ist nicht so. Das I / O ist anders und es scheint, dass sich die Pfade in den anderen nicht kreuzen können. Ich denke, dies ist einfacher in einer Weise, die unterschiedliche Golfstrategien ermöglichen könnte. Ich war mir jedoch nicht bewusst, dass ich diese plötzlich alleine wieder öffnen konnte. Ich dachte, ich würde nur eine Stimme abgeben.
Marinus

@marinus Ok dann. Also verwandt: Yarr! Eine Karte zum verborgenen Schatz! .
Nicoleel

Antworten:


2

MATL , 71 Bytes

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

Verwendet die aktuelle Version (6.0.0) der Sprache / des Compilers. Arbeitet in Matlab und in Octave.

BEARBEITEN (21. Juni 2016): Aufgrund von Änderungen in der Sprache sind für die Ausführung des Codes in der aktuellen Version (16.0.0) einige Änderungen erforderlich. Sie können es online mit den erforderlichen Änderungen ausprobieren .

Beispiele

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

Erläuterung

Das Programm besteht aus vier Hauptschritten:

  1. Lesen Sie die Eingabezeichenfolge und teilen Sie sie in ihre Komponenten auf.
  2. Erstellen Sie eine 2-Spalten-Matrix, in der jede Zeile eine Einheitsverschiebung in die entsprechende Richtung beschreibt. Zeigt zum Beispiel [0 -1]einen Schritt nach links an. Die erste Reihe ist der Ursprung des Pfades,[1 1]
  3. Berechnen Sie die kumulative Summe dieser Matrix entlang der ersten Dimension. Nun beschreibt jede Zeile die Koordinaten von a *. Auf minimalen Wert normalisieren1
  4. Erstellen Sie eine neue Matrix, die 1an den von der Matrix aus Schritt 3 angegebenen Koordinaten enthält 0. Dies wird dann in eine Zeichenmatrix umgewandelt.

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

Funktioniert es für das letzte Beispiel?
Nicoleel

Wie schön! Ja tut es. Ich habe meine Antwort bearbeitet, um sie
Luis Mendo

8

JavaScript (ES6), 204 211 210

Edit 1 Bugfix - Ausgabe '*' für ungültige Eingabe
Edit 2 Einfachere Decodierung der Richtung in x- und y-Diff

Hier ist meine Antwort auf Die Schatzkarte , überarbeitet, um die Spezifikationen zu erfüllen.

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

Weniger golfen und mehr oder weniger erklärt

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
}

Prüfung

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>


Scheint perfekt zu funktionieren.
Nicoleel

Mit einer einzigen Ausnahme: Wenn die Eingabe leer ist, muss geschrieben werden *.
nicael

Für diejenigen, deren Browser Probleme mit der Interpretation von ES6 haben: jsfiddle.net/2vrrd1wt .
nicael

@nicael danke fürs mitbekommen.
Behoben

1

Perl, 174 Bytes

@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

Erwartet Eingabe als Befehlszeilenargument. Achten Sie darauf, das Argument zu zitieren!
Beispiel:perl 177.pl "<1^2>3v4<5^6>7v8<9^10>11"

Etwas lesbar:

@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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.