MarGolf Bertemu dengan Anthill 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.

Dan ini:
masukkan deskripsi gambar di sini adalah sarang semut di halaman belakang Langton.
Bukit itu cukup besar untuk menampung bola golf Markov, MarGolf. Namun, sarang semut bergerak dan berubah arah tergantung pada medan di sekitarnya.

Tugas

Ambil input bidang 10x20:

  • * MarGolf
  • O Anthill Lanton
  • , Semut berubah 90 derajat searah jarum jam
  • . Semut berubah 90 derajat berlawanan arah jarum jam
  • 0 MarGolf di Langton's Anthill

Bidang tampak seperti ini:

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

Aturan permainan:
Konfigurasi bidang input disebut centang 0. Program Anda perlu mengevaluasi dan mencetak konfigurasi centang berikutnya, di mana MarGolf dan Langton's Anthill akan pindah ke sel lain. Item di sel saat ini akan menjadi item saat ini di sel target. Jika MarGolf dan sarang semut pindah ke sel yang sama pada tik berikutnya, permainan berakhir.

Aturan pergerakan:

  • MarGolf bergerak secara acak. Kesembilan sel di area 3x3 di sekitar MarGolf memiliki peluang yang sama untuk dipilih. Ini menjadi pilihan di antara 6 sel di tepi lapangan, dan 4 sel di sudut.
  • Langton's Anthill perlu mengingat arah gerakannya baik ke atas, bawah, kiri, atau kanan (NSEW atau apa pun yang setara). Ini bergerak satu sel dalam arahnya masing-masing centang, dan konten asli sel berubah arah searah atau berlawanan arah jarum jam, seperti ditentukan di atas. Arah awal pada tick 0 adalah acak, setiap arah memiliki peluang yang sama untuk menjadi yang awal.

Catatan

  • Program perlu mencetak konfigurasi setiap centang, hingga permainan berakhir.
  • Nomor kutu mendahului konfigurasi bidang setiap kutu.
  • Anda dapat menganggap input selalu valid.
  • Program terpendek adalah byte yang menang.

Pembaruan: lupa menyebutkan arah berbalik arah sebelum bergerak jika tidak akan keluar dari lapangan. Kredit untuk pengguna81655 untuk mengingatkan.

busukxuan
sumber
Adakah yang bisa menunjukkan dari mana meme "menjadi seperti <masukkan nama di sini>?
bangga haskeller
@proudhaskeller Saya kira dari halaman facebook Be Like Bill, ada artikel di Wikipedia yang mungkin ingin Anda baca. en.wikipedia.org/wiki/Be_like_Bill
busukxuan
2
@ Doorknob Jika saya memahami tantangan dengan benar, tidak ada ubin di bawahnya. Bila Anda memindahkan salah satu dari mereka swap dengan ubin mereka pindah ke, dan bahwa genteng menentukan Os arah untuk selanjutnya langkah.
Martin Ender
1
@ MartinButtner ya itu sebagian besar benar. Saya menghindari istilah "swap" untuk satu kasus sudut, tetapi istilah itu sebaliknya.
busukxuan

Jawaban:

3

Java 10, 611 609 607 593 591 byte

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 byte terima kasih kepada @ceilingcat .

Mengasumsikan swap terakhir *dan Oakan mengosongkan sel dari mana *berasal.

Penjelasan:

Cobalah online.

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
sumber