MarGolf Langton'un Karınca yuvası ile Buluşuyor


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.

Ve bu:
resim açıklamasını buraya girin Langton'ın arka bahçesinde bir karınca yuvasıdır.
Karınca yuvası Markov'un golf topu MarGolf'u tutacak kadar büyük. Bununla birlikte, karınca yuvası etrafındaki araziye bağlı olarak hareket eder ve yön değiştirir.

Görev

10x20 alanın bir girdisini alın:

  • * Margolf
  • O Lanton'un Karınca yuvası
  • , Karınca yuvası saat yönünde 90 derece döner
  • . Karınca yuvası saat yönünün tersine 90 derece döner
  • 0 Langton karınca yuvası MarGolf

Bir alan şöyle görünür:

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

Oyun kuralları:
Giriş alanının yapılandırmasına kene 0 denir. Programınızın, hem MarGolf hem de Langton'ın Karınca Yuvası'nın başka bir hücreye geçeceği bir sonraki kene yapılandırmasını değerlendirmesi ve yazdırması gerekir. Geçerli hücredeki öğe, şu anda hedef hücredeki öğe olacaktır. Hem MarGolf hem de karınca yuvası bir sonraki kene içinde aynı hücreye taşınırsa oyun sona erer.

Hareket kuralları:

  • MarGolf rastgele hareket eder. MarGolf çevresindeki 3x3 alanındaki dokuz hücrenin hepsi de aynı şekilde seçilme şansına sahiptir. Bu, alanın kenarındaki 6 hücre ve bir köşedeki 4 hücre arasında bir seçim haline gelir.
  • Langton Anthill'in hareket yönünü yukarı, aşağı, sola veya sağa (NSEW veya eşdeğeri) hatırlaması gerekir. Her bir çene yönünde bir hücre hareket eder ve hücrenin orijinal içeriği, yukarıda belirtildiği gibi yönünü saat yönünde veya saat yönünün tersine değiştirir. Kene 0'daki başlangıç ​​yönü rastgele, her yönün başlangıç ​​olma olasılığı eşittir.

notlar

  • Program oyun bitene kadar her bir işaretin yapılandırmasını yazdırmalıdır.
  • Onay numarası her onayın alan yapılandırmasından önce gelir.
  • Girişin her zaman geçerli olduğunu varsayabilirsiniz.
  • En kısa program bayt kazanır.

Güncelleme: karınca yuvası aksi takdirde tarladan çıkacaksa, hareket etmeden önce yönü tersine çevirmeyi unutmuşum. Hatırlatmak için user81655'e teşekkür ederiz.


Herkes "burada <isim girin> meme kökenli nerede işaret edebilir?
gurur haskeller

@proudhaskeller Be Be Bill facebook sayfasından sanırım Wikipedia'da okumak isteyebileceğiniz bir makale var. en.wikipedia.org/wiki/Be_like_Bill
busukxuan


2
@Doorknob Eğer meydan okumayı doğru anlarsam, altında karo yoktur. Bunlardan birini hareket ettirdiğinizde, üzerine taşıdıkları döşemeyle değiştirilir ve bu döşemenin sonraki adım Oiçin yönünü belirler .
Martin Ender

1
@MartinButtner evet bu çoğunlukla doğru. Bir köşe davası için "takas" teriminden kaçındım, ancak terim aksi doğrudur.
busukxuan

Yanıtlar:


3

Java 10, 611 609 607 593 591 bayt

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);}

@Ceilingcat sayesinde -4 bayt .

Nihai değişimin geldiği hücreyi boşaltır *ve Oboşaltır *.

Açıklama:

Çevrimiçi deneyin.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.