MarGolf gặp Anthill của 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.

Và đây:
nhập mô tả hình ảnh ở đây là một ổ kiến ​​ở sân sau của Langton.
Con kiến ​​đủ lớn để giữ quả bóng golf của Markov, MarGolf. Tuy nhiên, con kiến ​​di chuyển và thay đổi hướng tùy thuộc vào địa hình xung quanh.

Nhiệm vụ

Lấy đầu vào của trường 10x20:

  • * MarGolf
  • O Lills của Anthill
  • , Anthill quay 90 độ theo chiều kim đồng hồ
  • . Anthill quay 90 độ ngược chiều kim đồng hồ
  • 0 MarGolf trong Langton's Anthill

Một lĩnh vực trông như thế này:

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

Quy tắc trò chơi:
Cấu hình của trường đầu vào được gọi là tick 0. Chương trình của bạn cần đánh giá và in ra cấu hình của đánh dấu tiếp theo, trong đó cả Anthill của MarGolf và Langton sẽ chuyển sang một ô khác. Mục trong ô hiện tại sẽ trở thành mục hiện tại trong ô đích. Nếu cả MarGolf và anthill di chuyển đến cùng một ô trong tích tắc tiếp theo, trò chơi sẽ kết thúc.

Quy tắc di chuyển:

  • MarGolf di chuyển ngẫu nhiên. Tất cả chín ô trong khu vực 3x3 xung quanh MarGolf đều có cơ hội được lựa chọn như nhau. Điều này trở thành một lựa chọn trong số 6 ô ở một cạnh của trường và 4 ô ở một góc.
  • Anthton của Langton cần nhớ hướng di chuyển của nó lên, xuống, trái hoặc phải (NSEW hoặc bất cứ thứ gì tương đương). Nó di chuyển một ô theo hướng của nó mỗi tích tắc và nội dung ban đầu của ô sẽ thay đổi hướng của nó theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ, như được chỉ định ở trên. Hướng ban đầu tại tick 0 là ngẫu nhiên, mỗi hướng có cơ hội bằng nhau là ban đầu.

Ghi chú

  • Chương trình cần in cấu hình của từng đánh dấu, cho đến khi trò chơi kết thúc.
  • Số đánh dấu trước cấu hình trường của mỗi đánh dấu.
  • Bạn có thể cho rằng đầu vào luôn hợp lệ.
  • Chương trình ngắn nhất là byte thắng.

Cập nhật: quên đề cập đến hướng ngược lại trước khi di chuyển nếu nó đi ra khỏi sân. Tín dụng cho người dùng81655 để nhắc nhở.


Bất cứ ai cũng có thể chỉ ra rằng "giống như <tên ở đây> meme bắt nguồn từ đâu?
tự hào

@proudhaskeller Tôi đoán từ trang facebook Be Like Bill, có một bài viết trên Wikipedia mà bạn có thể muốn đọc. vi.wikipedia.org/wiki/Be_like_Bill
busukxuan


2
@Doorknob Nếu tôi hiểu đúng thách thức, không có gạch nào dưới chúng. Khi bạn di chuyển một trong số chúng, nó hoán đổi với ô mà chúng di chuyển lên và ô đó xác định Ohướng s cho bước tiếp theo .
Martin Ender

1
@MartinButtner vâng, điều đó chủ yếu là chính xác. Tôi đã tránh thuật ngữ "hoán đổi" cho một trường hợp góc, nhưng thuật ngữ này là sự thật.
busukxuan

Câu trả lời:


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 nhờ @ceilingcat .

Giả sử sự hoán đổi cuối cùng của *Osẽ làm trống ô *đến từ đâu.

Giải trình:

Hãy thử trực tuyến.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.