MarGolf se encuentra con el hormiguero de Langton

9
This is Markov.
Markov's golf ball rolls around randomly.
Markov's ball will hole however he strikes it.
Markov is smart.
Be like Markov.

Y esto:
ingrese la descripción de la imagen aquí es un hormiguero en el patio trasero de Langton.
El hormiguero es lo suficientemente grande como para sostener la pelota de golf de Markov, MarGolf. Sin embargo, el hormiguero se mueve y cambia de dirección dependiendo del terreno circundante.

La tarea

Tome una entrada de un campo 10x20:

  • * MarGolf
  • O Hormiguero de Lanton
  • , El hormiguero gira 90 grados en sentido horario
  • . El hormiguero gira 90 grados en sentido antihorario
  • 0 MarGolf en el hormiguero de Langton

Un campo se ve así:

,...,.,,..,...,.,,..
..,.,,,..,...,..,.,.
.,,*.,....,.,,,.,,,.
,.,,.,...,,.,.,,,,,.
.,..,....,,.....,,.,
,.,.,...,..,.,,,,..,
....,,,,,,,,,.......
........,,.,...,...,
,,,,,,,,,,,,....,O.,
,.,.,.,.....,,.,,,,,

Reglas del juego:
La configuración del campo de entrada se llama tick 0. Su programa necesita evaluar e imprimir la configuración del siguiente tick, en el que tanto MarGolf como Langton's Anthill se moverán a otra celda. El elemento en la celda actual se convertirá en el elemento actualmente en la celda objetivo. Si tanto MarGolf como el hormiguero se mueven a la misma celda en el siguiente tic, el juego termina.

Reglas de movimiento:

  • MarGolf se mueve al azar. Las nueve celdas en el área 3x3 alrededor de MarGolf tienen la misma posibilidad de ser seleccionadas. Esto se convierte en una elección entre 6 celdas en un borde del campo y 4 celdas en una esquina.
  • El hormiguero de Langton necesita recordar su dirección de movimiento de arriba, abajo, izquierda o derecha (NSEW o su equivalente). Mueve una celda en su dirección cada tic, y el contenido original de la celda cambia su dirección en sentido horario o antihorario, como se especifica anteriormente. La dirección inicial en la marca 0 es aleatoria, cada dirección tiene la misma probabilidad de ser la inicial.

Notas

  • El programa necesita imprimir la configuración de cada tic hasta que finalice el juego.
  • El número de tick precede a la configuración de campo de cada tick.
  • Puede suponer que la entrada siempre es válida.
  • El programa más corto es bytes gana.

Actualización: olvidé mencionar que el hormiguero invierte la dirección antes de moverse si de lo contrario saldría del campo. Crédito al usuario 81655 por recordar.

busukxuan
fuente
Podría punto cualquiera en el que el "ser como <insertar nombre aquí> meme se originó?
haskeller orgullo
@proudhaskeller Supongo que desde la página de Facebook de Be Like Bill, hay un artículo en Wikipedia que tal vez quieras leer. en.wikipedia.org/wiki/Be_like_Bill
busukxuan
2
@Doorknob Si entiendo el desafío correctamente, no hay ningún mosaico debajo de ellos. Cuando mueves uno de ellos, se intercambia con el mosaico al que se mueven, y ese mosaico determina la Odirección s para el siguiente paso.
Martin Ender
1
@MartinButtner sí, eso es principalmente correcto. Evité el término "intercambio" para un caso de esquina, pero el término es por lo demás verdadero.
busukxuan

Respuestas:

3

Java 10, 611 609 607 593 591 bytes

m->{int x=0,y=0,X=0,Y=0,r=10,c,d=4,e;for(d*=Math.random();r-->0;)for(c=20;c-->0;){if(m[r][c]<43){x=r;y=c;}if(m[r][c]>48){X=r;Y=c;}}for(;;d=m[r][c]<45?d<2?d+2:d<3?1:0:d>1?d-2:d>0?2:3){p(m);for(e=4;e==4;e*=Math.random())e=9;m[r=x][c=y]=m[x+=e/3<1?x>0?-1:1:e/3>1?x<9?1:-1:0][y+=e%3<1?y>0?-1:1:e%3>1?y<19?1:-1:0];if(m[x][y]>48){m[x][y]=48;m[r][c]=0;p(m);e/=0;}m[x][y]=42;m[r=X][c=Y]=m[X+=d<1?X<9?1:-1:d==1?X>0?-1:1:0][Y+=d==2?Y<19?1:-1:d>2?Y>0?-1:1:0];if(m[X][Y]<43){m[r][c]=48;m[X][Y]=0;p(m);e/=0;}m[X][Y]=79;}}void p(char[][]m){var p="";for(var a:m)p+=p.valueOf(a)+"\n";System.out.println(p);}

-4 bytes gracias a @ceilingcat .

Asume el intercambio final de *y Ovaciará la celda de donde *viene.

Explicación:

Pruébalo en línea.

m->{                        // Method with character-matrix parameter and no return-type
  int x=0,y=0,              //  [x,y] coordinates of MarGolf
      X=0,Y=0,              //  [X,Y] coordinates of Langton's Anthill
      r=10,c,               //  Temp [x,y] coordinates
      d=4,                  //  Direction Langton's Anthill
      e;                    //  Direction MarGolf
  for(d*=Math.random();     //  Set the direction Langton's Anthill randomly [0,3]
      r-->0;)               //  Loop over the rows:
    for(c=20;c-->0;){       //   Inner loop over the columns:
      if(m[r][c]<43){       //    If '*' is found:
        x=r;y=c;}           //     Set MarGolf's [x,y] coordinates
      if(m[r][c]>48){       //    If 'O' is found:
        X=r;Y=c;}}          //     Set Langton's Anthill's [X,Y] coordinates
  for(;                     //  Loop indefinitely:
       ;                    //    After every iteration:
        d=                  //     Change the direction of Langton's Anthill:
          m[r][c]<45?       //      If the swapped cell contained a comma:
           d<2?d+2:d<3?1:0  //       Change the direction clockwise
          :                 //      Else (the swapped cell contained a dot):
           d>1?d-2:d>0?2:3){//       Change the direction counterclockwise
  p(m);                     //  Pretty-print the matrix
  for(e=4;e==4;e*=Math.random())e=9;
                            //  Change direction MarGolf randomly [0-9] (excluding 4)
  m[r=x][c=y]               //  Save the current MarGolf coordinates
   =m[x+=e/3<1?x>0?-1:1:e/3>1?x<9?1:-1:0]
     [y+=e%3<1?y>0?-1:1:e%3>1?y<19?1:-1:0];
                            //  And change that cell to the content in direction `e`
                            //  0 to 9 (excl. 4) is NW,N,NE,W,n/a,E,SW,S,SE respectively
                            //  If `e` would go out of bounds, it moves opposite instead
  if(m[x][y]>48){           //  If MarGolf reached Langton's Anthill:
    m[x][y]=48;             //   Set that cell to '0'
    m[r][c]=0;              //   And empty the swapped cell
    p(m);                   //   Print the final status of the matrix
    e/=0;}                  //   And stop the loop with an error to exit the program
  m[x][y]=42;               //  Change the cell in the new coordinate to '*'
  m[r=X][c=Y]               //  Save the current Langton's Anthill coordinates
   =m[X+=d<1?X<9?1:-1:d==1?X>0?-1:1:0]
      [Y+=d==2?Y<19?1:-1:d>2?Y>0?-1:1:0];
                            //  And change that cell to the content in direction `d`
                            //  0 to 3 is E,W,S,N respectively
                            //  If `d` would be out of bounds, it moves opposite instead
  if(m[X][Y]<43){           //  If MarGolf reached Langton's Anthill:
    m[r][c]=48;             //   Set that cell to '0'
    m[X][Y]=0;              //   And empty the swapped cell
    p(m);                   //   Print the final status of the matrix
    e/=0;}                  //   And stop the loop with an error to exit the method
  m[X][Y]=79;}}             //  Change the cell in the new coordinate to 'O'

void p(char[][]m){          // Separated method to print the given matrix
  var p="";                 //  String to print, starting empty
  for(var a:m){             //  Loop over the rows:
    p+=p.valueOf(a)         //   Convert the character-array to a String line and append,
                     +"\n"; //   including a trailing newline
  System.out.println(p);}   //  Print the String with trailing newline as separator
Kevin Cruijssen
fuente