Гусеничний гурток 2D


9

Ваша програма повинна приймати багаторядкові рядки, наприклад:

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

pє гравцем і #є блоком.

Тепер під цим в терміналі повинен бути рядок введення, що говорить:

How do you want to move?

Якщо типи гравців lйому належать піти ліворуч, коли блоку немає, інакше, коли є блок, він не може пройти і, звичайно, не рухається, тепер вихід у терміналі повинен бути оновлений ( і попередній вихід очищений / перезаписаний):

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

Він може набрати lліворуч, rправоруч, uвгору та dвниз.

Вхід завжди буде багаторядковим, але не завжди буде залитий пробілами у ідеальний прямокутник. Крім того, хеші можуть бути в будь-якому місці рядка і не завжди будуть з'єднані один з одним. Наприклад:

##  ##
#  #
## p
     #

є дійсним підземеллям. (зверніть увагу на відсутність пробілів у кожному рядку)

Якщо гравець виходить за межі рядка, його не потрібно відображати. Але якщо він повернеться пізніше, він повинен бути відображений знову.

І кордони «за межами» рядки є length(longest_line)по number_of_linesпрямокутнику, так що навіть якщо одна рядок не доповнюється пробілами справа, що місце не розглядається поза межами. Приклад використання попереднього підземелля:

##  ##
#  #p
##  
     #

У другому рядку не було місця, де зараз знаходиться p, але це не має значення.

Нарешті, ваша програма повинна циклічно вічно брати вклад.

Тестові справи

Тестовий випадок 1:

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

How do you want to move?
d

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

Тест 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  #
####

Звичайно, ці не завершені. Ваш код повинен залишатись циклічно назавжди та очищати екран між кожним висновком .

Ваш вихід дозволений для запиту на введення як How do you want to move?\n<input>або How do you want to move?<input>(тобто вам не потрібен вхід у порожньому рядку), і вам не потрібен порожній рядок між заключним рядком підземелля та підказкою. (однак вони не можуть бути на одній лінії)

Стандартні лазівки заборонені! Це код-гольф, тому найкоротший код у байтах виграє!


2
Чи прийнятно, якщо введенням є літера, за якою слід вводити? Також я пропоную позбутися від необхідності надрукувати той рядок, який, здається, не додасть нічого складного
Луїс Мендо

2
Я думаю , що це знову відкриваються, але моя пропозиція полягає в тому , що вхідні рядку (для l, r, u, або d) може бути що завгодно, а не тільки «Як ви хочете перемістити»? Це не дуже впливає на відповіді, за винятком шаленості.
Rɪᴋᴇʀ

@EasterlyIrk: Я б не погодився. Тому що в цьому випадку гольфістам доведеться подумати про те, як стиснути рядок, щоб зберегти байти.
ЛМД

2
@ user7185318 Майте це на увазі , в основному дотримуйтесь 1 проблеми на виклик. Стиснення струни - це зовсім окрема проблема, а потім зробити сканування підземелля, і тому, ймовірно, не слід братися за цю проблему.
Rɪᴋᴇʀ

1
Чи прийнятно, якщо гравець відображається, коли вони виходять за межі, чи потрібно зникати?
mwh

Відповіді:


1

MATLAB, 268 247 246 байт

Напевно, не конкурентоспроможний, але це було весело. Версія для гольфу:

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

Читаема версія:

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

Ці tryблоки , щоб запобігти функцію від аварії на поза межами помилок. Я впевнений, що двоє з них є надмірними, але я не можу гольфу це зробити краще.

Варто відзначити, що MATLAB розширить масив вниз і вправо, але гравець зникне при першому переміщенні в «невивчену» область. Наприклад, якщо ви переміститесь за межі поточних меж підземелля праворуч на один пробіл, ви зникнете, але наступний поворот MATLAB розширить масив, щоб включити новий стовпець (або рядок, якщо ви рухаєтесь вниз). '#'==d(y,x)економить байт порівняно з d(y,x)=='#', оскільки вам не потрібен пробіл між ifта'#'


Гарна відповідь! Я сподіваюся, що цього разу не щось дуже коротке виграє, і тут загальні мови повинні мати шанс, тому що чим більший виклик, тим краще ява і т. Д. :)
LMD

1

Сценарій кави: 580 байт

Я вичавив усе, що міг, з цього конкретного алгоритму і втомленого мозку. Мені потрібне свято.

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'

приємне рішення, лорд Ратте
LMD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.