Trò chơi mũi tên cuộc sống


26

Lý lịch

Thử thách này là để vinh danh những người chơi apsillers , người đã chiến thắng hạng mục Không đơn giản như vẻ ngoài của Best of PPCG 2016 với thử thách của họ Hộp nhạc 4 nốt của tôi có thể phát bài hát đó không? Xin chúc mừng!

Trên trang "Giới thiệu về tôi" của họ, người dùng này có một trình giả lập thực sự gọn gàng cho thiết bị tự động di động Game of Life . (Nghiêm túc, đi kiểm tra xem.) Mặt khác, từ aspillera là tiếng Tây Ban Nha có nghĩa là "mũi tên sáng". Trước những sự thật này, thử thách này là về những mũi tên trong Trò chơi cuộc sống.

Trò chơi mũi tên cuộc sống

Trong GoL, chúng ta sẽ biểu thị một mũi tên bằng tàu lượn và một bức tường bằng một chuỗi các khối . Một tàu lượn duy nhất tiếp cận bức tường từ trên cao và cố gắng bay qua một khoảng trống trên tường (mũi tên sáng). Nhiệm vụ của bạn là kiểm tra xem tàu ​​lượn có đi qua mũi tên sáng hay đâm vào tường không.

Đầu vào

Đầu vào của bạn là một lưới các bit, đại diện cho cấu hình GoL. Bạn có thể lấy nó ở bất kỳ định dạng hợp lý nào (chuỗi nhiều dòng của bất kỳ hai ký tự ASCII có thể in được, danh sách các chuỗi, mảng số nguyên 2D, mảng booleans 2D, v.v.). Để rõ ràng, tôi sẽ sử dụng các chuỗi nhiều dòng của các ký tự .#sau đây.

Đầu vào được đảm bảo có một số thuộc tính. Đầu tiên, chiều cao của nó là 2N đối với một số N 6 và chiều rộng của nó ít nhất là 2N + 2 . Đầu vào sẽ là tất cả .s, ngoại trừ một nơi nào đó trên ba hàng trên cùng là tàu lượn và trên hai hàng giữa có một bức tường khối. Tàu lượn sẽ hướng về phía tây nam hoặc đông nam, và vị trí của nó là nếu các bức tường được gỡ bỏ, nó sẽ không đi qua một cạnh bên trước khi đến cạnh dưới cùng (nhưng nó có thể chạm tới một góc của lưới). Tàu lượn ban đầu được tách ra khỏi các cạnh trái và phải ít nhất một bước của .s. Nó có thể trong bất kỳ giai đoạn.

Bức tường bao gồm các khối, được ngăn cách bởi một cột của .s, ngoại trừ ở một nơi, nơi chúng sẽ được ngăn cách bởi ít nhất hai cột của .s. Giống như tàu lượn, các khối ngoài cùng bên phải và bên phải cũng được tách ra khỏi các cạnh bằng một bước của .s. Sẽ luôn có ít nhất một khối ở cạnh trái và một khối ở cạnh phải.

Dưới đây là một ví dụ về lưới đầu vào hợp lệ:

....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................

Đầu ra

Như đã nêu, nhiệm vụ của bạn là xác định xem tàu ​​lượn có đâm vào tường hay đi qua rìa phía nam hay không. Đối với mục đích của thử thách này, một sự cố xảy ra nếu cấu hình không còn bao gồm một tàu lượn và tường khối, bất kể điều gì xảy ra sau đó trong mô phỏng. Các sơ đồ sau đây cho thấy những khoảng trống nhỏ nhất mà tàu lượn phía đông nam có thể đi qua mà không bị rơi trong hai giai đoạn riêng biệt (điều kiện cho tàu lượn phía tây nam là đối xứng).

...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##

...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##

Nếu tàu lượn bay qua tường, bạn sẽ xuất ra một giá trị trung thực và nếu không thì là giá trị giả. Đối với ví dụ trên, đầu ra chính xác là sai, vì tàu lượn sẽ đâm vào phần bên trái của bức tường.

Đối với mục đích của thử thách này, bạn có thể giả sử rằng nếu bạn mô phỏng GoL trên đầu vào cho các bước 2 * (chiều cao - 3) , tàu lượn nằm ở hàng dưới cùng ở vị trí mong đợi và tường vẫn còn nguyên, thì đầu ra là đúng .

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng.

Các trường hợp thử nghiệm

Tôi đã thu thập các trường hợp thử nghiệm vào kho lưu trữ GitHub , vì chúng khá lớn. Dưới đây là các liên kết đến các tệp riêng lẻ:


Có bất kỳ lý do cho việc bao gồm các hàng trống bên dưới bức tường trong đầu vào?
Martin Ender

@MartinEnder Họ làm cho các giải pháp mà bạn thực sự mô phỏng GoL trên đầu vào khả thi hơn (ít nhất là tôi hy vọng vậy).
Zgarb

Tàu lượn sẽ luôn bắt đầu ở hàng trên cùng?
Rod

@Rod Có, nó sẽ ở hàng trên cùng hướng về phía tây nam hoặc đông nam.
Zgarb

Một trò chơi khác của cuộc sống: P
Christopher

Câu trả lời:


15

Python 2 , 142 136 135 byte

-6 byte nhờ vào ElPedro
-1 byte nhờ TuukkaX

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp kiểm tra

Kiểm tra hướng (đông / tây):

Tây đông
Sử dụng z=p[2].index(1)để có được hình vuông đầu tiên trên hàng thứ 3 (được biểu thị bằng hình vuông màu đỏ) và sau đó m=(p[1][z]-p[1][z+1]<1)*2-1trừ đi giá trị bên phải (màu xanh lá cây) từ hình bên trái (màu xanh), theo cách này, tất cả 4 trạng thái tàu lượn sẽ kết quả phía tây nam 1(hàng trên cùng trong hình ảnh), trong khi những người đi về phía đông nam kết quả là 0hoặc -1.
Sau đó chuyển đổi: 1 -> -10,-1 -> 1được sử dụng trên tham số để đảo ngược danh sách khi giao dịch với những người phương tây. Bằng cách này, tàu lượn đi về phía tây nam bị đe dọa giống như người đi về phía đông nam.

Chuyển động tàu lượn

lướt
Đây là chuyển động mà tàu lượn đi về phía đông nam, nó có kiểu "bậc thang" và khối ngoài cùng bên trái trên dòng thứ 3 là không đổi đối với mọi mẫu. Sử dụng nó làm điểm bắt đầu, 3 khối xung quanh bên trái và bên phải và 4 khối ở giữa được kiểm tra sự hiện diện của 1s (đó sẽ là bức tường).
mũi tên
Mũi tên_path


Tôi nghĩ rằng bạn có thể mất 4 byte bằng cách thiết lập một biến iđể 0bên ngoài forvòng lặp sau đó thêm từ 1 tới nó nó từng vượt qua và để thoát khỏi enumerate. Có vẻ như hoạt động khi tôi đã thử nó với TIO của bạn. +1 cho câu trả lời tuyệt vời cho dù tôi đúng hay sai.
ElPedro

Tốt đẹp! Bạn có thể lưu một byte bằng cách xóa khoảng trắng khỏi 1 in. +1.
Yytsi

2
+1 cho "lễ"
JungHwan Min

4

Octave, 123 122 108 byte

Nhờ @LuisMendo lưu được 2 byte

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

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

Hoặc là

Xác nhận tất cả các trường hợp kiểm tra

Nhờ Rod chuẩn bị các trường hợp thử nghiệm.

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

Câu trả lời trước:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

Đầu tiên trích xuất mô hình tường như biến B.
Thực hiện mô phỏng GoL cho đến khi mẫu tường và mẫu mô phỏng có nhiều hơn / ít hơn 5 ô khác nhau.
Nếu tàu lượn đã nhận được hàng cuối cùng, hàm sẽ trả về true.


1
cho đến khi mẫu tường và mẫu mô phỏng có nhiều hơn / ít hơn 5 ô khác nhau. Thật khéo léo!
Luis Mendo

@LuisMendo Cảm ơn, đã lưu một byted
rahnema1

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.