Trình thu thập dữ liệu 2D


9

Chương trình của bạn phải có một chuỗi nhiều dòng, như thế này:

#############
#           #
#     p     #
#           #
#############

plà người chơi và #là một khối.

Bây giờ dưới đó trong thiết bị đầu cuối nên là một dòng đầu vào nói:

How do you want to move?

Nếu người chơi loại lanh ta phải đi bên trái khi không có khối, thì người khác, khi có khối, anh ta không thể đi qua và dĩ nhiên không di chuyển, bây giờ đầu ra trong thiết bị đầu cuối phải được cập nhật ( và đầu ra trước đó bị xóa / ghi đè):

#############
#           #
#    p      #
#           #
#############

Anh ta có thể gõ lcho trái, rphải, ulên và dxuống.

Đầu vào sẽ luôn là đa dòng, nhưng sẽ không luôn được đệm với các khoảng trắng thành một hình chữ nhật hoàn hảo. Ngoài ra, các giá trị băm có thể ở bất kỳ đâu trong chuỗi và sẽ không luôn được kết nối với nhau. Ví dụ:

##  ##
#  #
## p
     #

là một ngục tối hợp lệ. (lưu ý thiếu dấu cách trên mỗi dòng)

Nếu người chơi đi ra ngoài chuỗi, anh ta sẽ không phải hiển thị. Nhưng nếu anh ta quay lại sau, anh ta phải được hiển thị lại.

Và ranh giới của "bên ngoài" chuỗi là length(longest_line)bằng number_of_lineshình chữ nhật, vì vậy ngay cả khi một dòng không đệm với các không gian bên phải, vị trí đó không được xem là nằm ngoài giới hạn. Ví dụ sử dụng dungeon trước đó:

##  ##
#  #p
##  
     #

Dòng thứ hai không có không gian nơi p hiện tại, nhưng điều đó không thành vấn đề.

Cuối cùng, chương trình của bạn phải lặp đi lặp lại mãi mãi.

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

Trường hợp thử nghiệm 1:

####
# p#
#
####

How do you want to move?
d

####
#  #
# p
####

Trường hợp thử nghiệm 2:

####
  p#
   #
####

How do you want to move?
l

####
 p #
   #
####

How do you want to move?
d

####
   #
 p #
####

How do you want to move?
l

####
   #
p  #
####

How do you want to move?
l

####
   #
   #
####

How do you want to move?
r

####
   #
p  #
####

Tất nhiên, những điều này không hoàn thành. Mã của bạn sẽ lặp mãi mãi và xóa màn hình giữa mỗi đầu ra .

Đầu ra của bạn được phép nhắc nhở đầu vào là How do you want to move?\n<input>hoặc How do you want to move?<input>(tức là bạn không cần đầu vào trên một dòng trống) và bạn không cần một dòng trống giữa dòng cuối cùng của ngục tối và dấu nhắc. (tuy nhiên họ không thể ở trên cùng một dòng)

Sơ hở tiêu chuẩn là không được phép! Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


2
Có thể chấp nhận nếu đầu vào là một chữ cái theo sau là enter? Ngoài ra, tôi khuyên bạn nên loại bỏ việc phải in chuỗi đó, dường như không thêm bất cứ điều gì vào thử thách
Luis Mendo

2
Tôi nghĩ rằng đây là tái có thể mở ra, nhưng đề nghị của tôi là đầu vào nhanh chóng (ví l, r, u, hoặc d) có thể là bất cứ điều gì, không chỉ là "Làm thế nào để bạn muốn di chuyển"? Nó không thực sự ảnh hưởng đến các câu trả lời ngoại trừ tính golf.
Rɪᴋᴇʀ

@EasterlyIrk: Tôi sẽ không đồng ý. Bởi vì trong trường hợp này, người chơi golf sẽ phải suy nghĩ về cách nén chuỗi để tiết kiệm byte.
LMD

2
@ user7185318 Hãy ghi nhớ điều này , về cơ bản, hãy kiên trì với 1 vấn đề cho mỗi thử thách. Nén chuỗi là một vấn đề hoàn toàn riêng biệt sau đó tạo một trình thu thập dungeon, và do đó có lẽ không nên giải quyết thách thức đó.
Rɪᴋᴇʀ

1
Có thể chấp nhận được nếu người chơi được hiển thị khi họ ở ngoài giới hạn, hoặc họ cần phải biến mất?
MattWH

Câu trả lời:


1

MATLAB, 268 247 246 byte

Có lẽ không cạnh tranh, nhưng đó là niềm vui. Phiên bản chơi gôn:

function f(s);d=char(split(s,'\n'));[y,x]=ind2sub(size(d),find(d=='p'));while 1;d
c=uint8(input('How do you want to move?','s'))-100;v=y+~c-(c==17);w=x+(c==14)-(c==8);try;d(y,x)=' ';end;try;if'#'==d(v,w);v=y;w=x;end;d(v,w)='p';end;y=v;x=w;clc;end

Phiên bản dễ đọc:

function f(s)
% Split the string on newlines and convert to a padded char array
d = char(split(s,'\n'));

% Get the initial indices of p
[y,x] = ind2sub(size(d),find(d=='p'));

% Loop forever
while 1
    % Implicitly display the dungeon
    d

    % Get the ASCII of the user input, minus 100 (saves a few bytes in
    % the comparisons)
    c=uint8(input('How do you want to move?','s'))-100;

    % Get the new y from the ASCII
    v = y+~c-(c==17);

    % Get the new x from the ASCII
    w = x+(c==14)-(c==8);

    % Clear the player from the dungeon if they are in it
    try
        d(y,x)=' ';
    end

    % Check if new position is a #, and revert to old position if so
    try
        if '#'==d(v,w)
            v=y;w=x;
        end
        d(v,w)='p';
    end
    % Update x and y
    y=v;
    x=w;

    % Clear the screen
    clc;
end

Các trykhối là để ngăn chặn chức năng khỏi sự cố trong giới hạn. Tôi chắc chắn rằng hai trong số họ là quá mức cần thiết, nhưng tôi không thể đánh golf nó tốt hơn thế.

Điều đáng chú ý là MATLAB sẽ mở rộng mảng xuống dưới và sang phải, nhưng người chơi sẽ biến mất khi di chuyển đến khu vực 'chưa được khám phá' lần đầu tiên. Ví dụ: nếu bạn di chuyển bên ngoài ranh giới hiện tại của ngục tối sang phải bởi một khoảng trắng, bạn sẽ biến mất, nhưng lượt tiếp theo MATLAB sẽ mở rộng mảng để bao gồm cột mới (hoặc hàng, nếu bạn đang di chuyển xuống dưới). '#'==d(y,x)tiết kiệm một byte so với d(y,x)=='#', vì bạn không cần khoảng trắng giữa if'#'


Câu trả lời tốt đẹp! Tôi hy vọng lần này không phải là một thứ gì đó rất ngắn, ở đây, các ngôn ngữ phổ biến cũng nên có cơ hội, bởi vì thử thách càng lớn, java càng tốt, v.v. :)
LMD

1

Tập lệnh cà phê: 580 byte

Tôi đã vắt kiệt mọi thứ có thể từ thuật toán đặc biệt này và bộ não mệt mỏi của tôi. Tôi cần một kỳ nghỉ.

C=console
e='length'
N=null
f=(S)->
    x=y=X=Y=N
    q=(c,v)->
        X=[x+c,N][+(-1<x+c<w)]
        Y=[y+v,N][+(-1<y+v<h)]
        try L[y+v][x+c]!='#'catch
            1
    r=(s)->
        if (X||Y)
            return
        L[y]=((t=L[y].split '')[x]=s)
        L[y]=t.join ''
    while 1
        L=S.split '\n'
        [h,w]=[L[e],L[0][e]]
        x=[X,x][+(x?)]
        y=[Y,y][+(y?)]
        for k in[0..h*w-1]
            if L[k//h][k%w]=='p'
                x=k%w
                y=k//h
        C.clear()
        C.log S
        r(' ')
        switch prompt("How do you want to move?")
            when'l'
                q(-1,0)&&x--
            when'r'
                q(1,0)&&x++
            when'u'
                q(0,-1)&&y--
            when'd'
                q(0,1)&&y++
        r('p')
        S=L.join '\n'

Giải pháp hay, Lord Ratte
LMD
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.