Ếch chết đi bộ


17

Giới thiệu

Jonny muốn chơi Frogger. Tuy nhiên, anh ấy không tốt lắm. Trên thực tế, anh ta sẽ chỉ cố gắng tiến về phía trước, và chỉ sau khi các nền tảng đã di chuyển.

Tìm hiểu xem con ếch của Jonny có thể đi đến cuối con đường hay nó chết trên đường đi.

Thử thách

Chương trình sẽ được nhận dưới dạng đầu vào lưới Frogger được tạo bởi 0s và 1s, với định dạng sau:

  • Lưới sẽ có chiều rộng và chiều dài ngẫu nhiên, và ít nhất 3x3
  • 1 đại diện cho nền tảng
  • 0 đại diện cho nước
  • F đại diện cho vị trí bắt đầu của ếch
  • Mỗi dòng đầu tiên và cuối cùng của lưới sẽ chỉ được tạo bởi 1s, và sẽ không di chuyển, và con ếch Fsẽ được đặt ngẫu nhiên trên dòng cuối cùng
  • Mỗi lớp trung gian sẽ luôn luôn chuyển động và sẽ có một <hoặc >ở cuối mỗi dòng cho biết nếu nó di chuyển sang trái hay phải

Việc thay thế các biểu tượng này bằng biểu tượng của riêng bạn được cho phép, miễn là chúng hoàn toàn khác biệt và bạn chỉ định các thay thế trong câu trả lời của mình.

Đầu vào có thể ở bất kỳ định dạng tương thích nào (chuỗi có ngắt dòng, mảng chuỗi, mảng ký tự, ...).

Quy tắc thử thách

  • Mỗi lượt, tất cả các nền tảng sẽ di chuyển một hình vuông, dựa trên hướng được chỉ định bởi <hoặc >dấu hiệu
  • Các nền tảng xuất hiện lại ở phía bên kia của lưới nếu chúng bị đẩy ra khỏi "màn hình"
  • Nếu con ếch ở trên một nền tảng di chuyển, nó sẽ di chuyển cùng với nó
  • Sau đó, con ếch sẽ nhảy một hình vuông về phía hàng trên cùng. Con ếch sẽ di chuyển mỗi lượt.
  • Con ếch chết nếu nó nhảy trong nước ( 0) hoặc nó chạm vào mặt bên của lưới cùng với một nền tảng di chuyển

Chương trình của bạn phải xuất ra một giá trị trung thực nếu con ếch sống sót và giá trị giả khác.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng. Tiêu chuẩn áp dụng.

Ví dụ

ví dụ 1

Đầu vào

11111
00111>
00101<
1F111

Đầu ra

1

Chấp hành

Biến 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Biến 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

Biến 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

Ví dụ 2

Đầu vào

11111
00100<
00100<
1F111

Đầu ra

0

Chấp hành

Biến 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Biến 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

Biến 3:

11111
00001
00001
11111

Các đường trung gian sẽ luôn luôn di chuyển? Chúng ta có thể lấy một danh sách các dòng làm đầu vào không? Nếu một dòng không di chuyển, chúng ta có thể giả sử nó kết thúc bằng một ký tự khác <hoặc >vì vậy chúng ta có thể lấy các mảng hình chữ nhật làm đầu vào không? Nhân tiện, thử thách tốt đẹp!
dyl Nam

@dylnan Tôi đã làm rõ nó trong văn bản thách thức. Các lớp trung gian sẽ luôn luôn chuyển động và sẽ luôn có một <hoặc >ở cuối.
BgrWorker

Con ếch có di chuyển về phía trước mỗi lượt ngay cả khi có một con 0ở phía trước nó, hay nó sẽ đợi con tiếp theo 1? Nếu nó có thể chờ đợi, nó sẽ tiếp tục 1, hay nó có thể chờ đợi một cách thông minh? Tức là với trường hợp thử nghiệm 11111 00001< 00011< 11F11, nó sẽ là chim ưng vì nó nhảy trong nước ( pastebin của các bước ); nó sẽ là falsey vì nó di chuyển ra khỏi khung hình ( pastebin của các bước ); hoặc nó sẽ là sự thật bởi vì nó chờ đợi thông minh cho nền tảng thứ hai trước khi nhảy về phía trước ( pastebin của các bước )?
Kevin Cruijssen

@KevinCruijssen nó di chuyển mỗi lượt và sẽ vui vẻ tự sát (như tôi đã nói, Jonny không phải là người chơi giỏi)
BgrWorker

@BgrWorker Ok, điều đó làm cho thử thách thực sự dễ thực hiện hơn. :) Có thể chỉnh sửa nó trong phần mô tả thử thách, rằng con ếch sẽ tiến về phía trước mỗi lượt, ngay cả khi nó sẽ nhảy vào 0.
Kevin Cruijssen

Câu trả lời:


4

Python 2 , 168 165 152 145 137 129 byte

s=input();x=s[-1].find('F');L=len(s[0]);i=k=1
for l in s[-2:0:-1]:d=('<'in l)%-2|1;k*=l[(x-d*i)%L]>'0'>-1<x+d<L;x+=d;i+=1
print k

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

Định dạng đầu vào là một danh sách các chuỗi; các ký tự có ý nghĩa như được đưa ra trong báo cáo vấn đề.

Giải trình:

ilà số lần lượt (bắt đầu bằng Turn 1); xlà vị trí của frogger khi bắt đầu lượt đó.

Hàng frogger sắp bước lên là chuỗi l(lưu ý rằng thông qua việc cắt lát, chúng đi theo thứ tự từ dưới lên trên). d=('<'in l)%-2|1sản lượng -1hoặc 1tùy thuộc vào hướng hàng đang di chuyển.

Vì đây là ilượt thứ năm, hàng đó sẽ thay đổi từ vị trí ban đầu theo ibyte; và do đó nhân vật của Frogger sắp nhảy lên là l[(x-d*i)%L]nơi Llà chiều rộng của hàng, vì vậy chúng tôi muốn nhân vật mà là bằng '1'; ví dụ >'0'.

Ngoài ra, chúng tôi muốn kiểm tra xem frogger sẽ không bị dịch chuyển khỏi rìa vào đầu lượt tiếp theo ; đó là chức năng của biểu thức -1<x+d<L.

Những điều kiện này được xâu chuỗi (vì '0'>-1luôn luôn True); và nếu bất cứ lúc nào biểu thức kết quả là sai, ksẽ trở thành (và sau đó ở lại) 0.

Trong mọi trường hợp, chúng tôi cập nhật vị trí của frogger x+=dvà tăng số hàng; sau đó rửa, rửa, lặp lại.


1

Con trăn 2 , 246 245 244 242 byte

-3 byte nhờ ông Xcoder
-1 byte nhờ Jonathan Frech

m=input()
exec"""for i,r in enumerate(m):
 d=-int(min('1',r[-1]));q=r[d*2]
 if m[i+1:]:r=sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]
 if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j])
 m[i]=r
"""*~-len(m)
print'F'in m[0]

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

Giải trình

  • d là hướng mỗi lớp sẽ di chuyển
  • q là nhân vật sẽ được bao bọc xung quanh
    • [q,' '][q<'L'] sẽ thả con ếch ra khỏi màn hình
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:] sẽ xóa ký tự cuối cùng (hướng), sau đó xóa ký tự đầu tiên và nối thêm hoặc xóa ký tự thứ hai cuối cùng và thêm vào ký tự đó (dựa trên d ) và nối hướng ngược lại, di chuyển toàn bộ hàng sang trái / phải một cách hiệu quả.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) sẽ làm cho ếch nhảy về phía trước
  • min('F',m[i-1][j]) sẽ làm cho ếch rơi xuống nước
  • Việc so sánh các ký tự ( min<) theo thứ tự' ' < '0' < '1' < 'F' < 'L'

Đầu vào sẽ là một danh sách các danh sách các ký tự:
' '- nước
'F'- ếch
'L'- plataform
'0'- di chuyển lớp sang trái
'1'- di chuyển lớp sang phải


if i<len(m)-1có thể có thể if~-len(m)>i.
Jonathan Frech

0

Java 8, 293 277 byte

a->{for(int l=a.length-1,x=a[l].indexOf('F'),y=l,i,t=a[0].length()-1,b;y>0;y--){for(i=l;i-->1;a[i]=a[i].endsWith("<")?a[i].substring(1,t+1)+a[i].charAt(0*(x-=b))+"<":a[i].charAt(t)+a[i].substring(0*(x+=b),t)+">")b=i==y?1:0;if(x<0|x>t||a[y].charAt(x)<49)return 0>1;}return 1>0;}

Sử dụng các ký tự mặc định như được chỉ định trong mô tả thử thách (01F<> ).

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

Giải trình:

a->{                         // Method with String-array parameter & boolean return-type
  for(int l=a.length-1,      //  Amount of rows minus 1
       x=a[l].indexOf('F'),  //  Start x-position of the frog
       y=l,                  //  Start y-position of the frog
       i,                    //  Index-integer
       t=a[0].length()-1,    //  Length of the rows minus 1
       b;                    //  Temp integer
       y>0;                  //  Loop as long as the frog hasn't reached the other side
       y--){                 //    Jump forward once after every turn
    for(i=l;l-->1;           //   Inner loop over all the moving rows
        ;a[i]=               //     After every iteration: Change the moving row to:
         a[i].endsWith("<")? //      If the current platform moves to the left:
          a[i].substring(1,t+1)
                             //       Last part of the platform
                             //        i.e. "00101<" → "0101"
          +a[i].charAt(0     //       Appended with the first character
                             //        i.e. "00101<" → '0'
            *(x-=b))         //       We are moving left, so subtract `b` from `x`      
          +"<"               //       And append the direction "<" again
                             //        so "00101<" becomes "01010<"
         :                   //      Else (the platform moves to the right):
          a[i].charAt(t)     //       Take the last character
                             //        i.e. "00111>" → '1'
          +a[i].substring(0  //       And append the first part of the platform
                             //        i.e. "00111>" → "0011"
            *(x+=b),t)       //       We are moving right, so add `b` to `x`
          +">")              //       And append the direction "<" again
                             //        so "00111>" becomes "10011>"
      b=i==y?                //    If the frog is on the current row:
         1                   //     Set `b` to 1
        :                    //    Else:
         0;                  //     Set `b` to 0
    if(x<0|x>t               //   If the Frog is out of bounds
       ||a[y].charAt(x)<49)  //   Or jumped into the water
      return 0>1;}           //    Return false
  return 1>0;}               //  If the loop ended the frog made it to the other side,
                             //  so return true
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.