Schnee weht meine Auffahrt!

8

Vor kurzem hat es viel geschneit, und meine Auffahrt muss schneebedeckt werden. Wenn die Schneefräse über einen Bereich fährt, den sie bereits verschneit hat, wird auf diesen Bereich Schnee geblasen und muss erneut geblasen werden. Und natürlich kann die Schneefräse nicht in der Mitte der Auffahrt starten, sondern muss von meiner Garage aus starten, wo sie gelagert wird.

Formeller:

Ihr Programm verwendet eine Standardeingabe als Zeichenfolge oder mehrdimensionales Array, die wie folgt aussieht:

XXXXOOOOXXXX
X          X
X          X
XXXXXXXXXXXX

Xstellt einen Bereich dar, der nicht schneebedeckt werden kann, Ostellt einen Bereich dar, in dem die Schneefräse eingesetzt werden kann, und leere Räume stellen Bereiche dar, in denen Schnee liegt. Wenn Sie möchten, können Sie verschiedene Werte auswählen.

Ihr Programm muss Folgendes ausgeben:

XXXX*%OOXXXX
Xv<<<^<<<<<X
X>>>>>>>>>^X
XXXXXXXXXXXX

Die Schneefräse startet am *. Das zeigt *immer auf den nächsten Nicht-Garagenplatz. Die <, >, vund ^repräsentieren alle Zeiger , wo die nächste Richtung. Sie zeigen der Schneefräse, wohin sie gehen soll. Sobald ein Zeiger auf zeigt, %ist das Gebläse wieder in der Garage angekommen, und die gesamte Auffahrt sollte frei sein.

Die Schneefräse muss über die gesamte Auffahrt fahren. Der Weg der Schneefräse kann sich niemals überlappen. Unmöglicher Input darf nicht gegeben werden.

Da ich nicht länger draußen sein möchte als nötig und nicht viel Zeit mit dem Tippen verbringen muss, sollte das Programm so kurz wie möglich sein. Der kürzeste Code gewinnt!

Testfälle:

Diese Testfälle können mehrere richtige Antworten haben. Ich habe unter jedem Testfall mögliche Lösungen angegeben.

Testfall 1: Der im Beispiel angegebene.

Testfall 2:

XOOOOOX
X     X
X     X
X     XXXXXXXX
X            X
X            X
XXXXXXXXXXXXXX

X*OOO%X
Xv>>>^X
Xv^<<<X
Xv>>>^XXXXXXXX
Xv^<<<<<<<<<<X
X>>>>>>>>>>>^X
XXXXXXXXXXXXXX

Testfall 3:

XOOOOX
X    X
X    X
X  XXX
X    X
X    X
XXXXXX

XOO%*X
X>>^vX
X^v<<X
X^vXXX
X^>>vX
X^<<<X
XXXXXX

Testfall 4:

XXXXXXXXXXXXX
O           X
O    X      X
O    X      X
O           X
XXXXXXXXXXXXX

XXXXXXXXXXXXX
*>>>>>>>>>>vX
Ov<v<Xv<<<<<X
Ov^v^X>>>>>vX
%<^<^<<<<<<<X
XXXXXXXXXXXXX
Genosse SparklePony
quelle
Verwandte ;-)
Arnauld
2
Können wir annehmen, dass 1) die Oimmer in einer geraden durchgehenden Linie liegen? 2) dass das Os immer am Rand des Arrays sein wird? 3) dass es keine führenden Räume geben wird? 4) dass es keine nachgestellten Leerzeichen gibt (dh in Testfall 2 sind einige Zeilen kürzer als andere)?
PurkkaKoodari
@ Pietu1998 Ja, an alle.
Genosse SparklePony

Antworten:

4

JavaScript (ES6), 346 310 299 298 297 296 283 Byte

f=(a,y=0,x=0)=>(a[y][x]?a[y][x]=='O'&&(a[y][x]='*',(g=w=>(w=a[y])&&w[x]&&(w[x]<'!'?g(w[x]='v',y++)||g(w[x++]='>',y--)||g(w[--x]='^',y--)||g(w[x--]='<',y++)||+(w[++x]=' '):w[x]=='O'&&!/ /.test(a)?w[x]='%':0))(y++)||g(y-=2)||g(y++,x++)||g(x-=2)||+(a[y][++x]='O'))||f(a,y,x+1):f(a,y+1))
<textarea id="tests">XXXXOOOOXXXX&#10;X          X&#10;X          X&#10;XXXXXXXXXXXX&#10;&#10;XOOOOOX&#10;X     X&#10;X     X&#10;X     XXXXXXXX&#10;X            X&#10;X            X&#10;XXXXXXXXXXXXXX&#10;&#10;XOOOOX&#10;X    X&#10;X    X&#10;X  XXX&#10;X    X&#10;X    X&#10;XXXXXX&#10;&#10;XXXXXXXXXXXXX&#10;O           X&#10;O    X      X&#10;O    X      X&#10;O           X&#10;XXXXXXXXXXXXX</textarea><br><button onclick="for(test of document.getElementById('tests').value.split('\n\n')){console.log(test);arr=test.split('\n').map(line=>line.split(''));f(arr);console.log(arr.map(line=>line.join('')).join('\n'))}">Run</button>

An einigen Stellen ziemlich hackig, aber ich wollte den Code da rausbringen. Eingabe als 2D-Zeichenarray, Ausgabe durch Modifizieren des Arrays.

Ungolfed Version

Dies ist exakt der gleiche Algorithmus, außer für einige truthy / falsy Magie mit zu +' 'sein NaNfalsy zu sein (und einige mehr), einige Golfgrößen und mit ifs statt ?:, ||und &&.

f = (a, y = 0, x = 0) => {         // main function
  if (!a[y][x])                    // check for end of line
    return f(a, y + 1);            // end of line, recursively check next
  if (a[y][x] == 'O') {            // check for valid start position
    a[y][x] = '*';                 // set the start position
    function g() {                 // pathfinder function
      if (!a[y] || !a[y][x])       // check for out of bounds
        return 0;
      if (a[y][x] == ' ') {        // check for snow
        a[y][x] = 'v';             // set current cell to 'down'
        y++;                       // move position down
        if (g()) return 1;         // see if a valid route is found from there
        y--;                       // if not, reset position and try again
        a[y][x] = '>';             // repeat for other directions
        x++;
        if (g()) return 1;
        x--;
        a[y][x] = '^';
        y--;
        if (g()) return 1;
        y++;
        a[y][x] = '<';
        x++;
        if (g()) return 1;
        x++;
        a[y][x] = ' ';             // no route found, reset cell to snow
        return 0;
      }
      if (a[y][x] == 'O'           // check for valid exit
          && !/ /.test(a)) {       // and that no snow is left
        a[y][x] = '%';             // set the exit
        return 1;
      }
    }
    y++;                           // move a cell down from the start position
    if (g()) return 1;             // see if a valid route starts there
    y -= 2;                        // repeat for other directions
    if (g()) return 1;
    y++; x++;
    if (g()) return 1;
    x -= 2;
    if (g()) return 1;
    x++;
    a[y][x] = 'O';                 // no route found, continue on
  }
  return f(a, y, x + 1);           // check the next cell
}
PurkkaKoodari
quelle