2D Zindan Paletli


9

Programınızın çok çizgili bir dize alması gerekir, örneğin:

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

poyuncu ve #blok.

Şimdi terminalde bunun altında bir giriş hattı olmalı:

How do you want to move?

Eğer lbir blok olmadığında sola yürümesi gereken oyuncu türleri varsa , başka bir blok olduğunda, geçemez ve elbette hareket etmez, şimdi terminaldeki çıkış güncellenmelidir ( ve önceki çıktı silindi / üzerine yazıldı):

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

lSola, rsağa, uyukarı ve daşağı yazabilir .

Giriş her zaman çok satırlı olacaktır, ancak her zaman boşluklarla mükemmel bir dikdörtgene dönüştürülmeyecektir. Ayrıca, karmalar dizenin herhangi bir yerinde olabilir ve her zaman birbirine bağlı olmaz. Örneğin:

##  ##
#  #
## p
     #

geçerli bir zindan. (her satırda boşluk olmaması)

Oyuncu dizenin dışına çıkarsa, görüntülenmesi gerekmez. Ancak daha sonra geri gelirse tekrar gösterilmesi gerekir.

Ve "Dışarıdan" dizesi sınırları vardır length(longest_line)tarafından number_of_linesöylesine bile bir satır sağda boşluklarla takviye edilmez, dikdörtgen, o konum sınırların dışında kabul edilmez. Önceki zindanı kullanan örnek:

##  ##
#  #p
##  
     #

İkinci satırda p'nin bulunduğu bir alan yoktu, ama bu önemli değil.

Son olarak, programınız sürekli olarak girdi almak için döngüye girmelidir.

Test senaryoları

Test örneği 1:

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

How do you want to move?
d

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

Test örneği 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  #
####

Tabii ki, bunlar tamamlanmadı. Kodunuz sonsuza kadar döngü yapmalı ve her çıkış arasındaki ekranı temizlemelidir .

Çıktınızın giriş olarak How do you want to move?\n<input>veya istemine izin verilir How do you want to move?<input>(yani boş bir satırda girişe ihtiyacınız yoktur) ve zindanın son satırı ile istem arasında boş bir satıra ihtiyacınız yoktur. (ancak aynı hatta olamazlar)

Standart boşluklara izin verilmiyor! Bu kod golf, bu yüzden bayt içindeki en kısa kod kazanır!


2
Girişin bir harf ve ardından enter olması kabul edilebilir mi? Ayrıca, bu dizeyi yazdırmak zorunda kalmamayı öneriyorum, bu da zorluğa bir şey
katmıyor

2
O istemi girişi (bu yeniden açılabilir, ama benim önerim olduğunu düşünüyorum l, r, u, veya d) herhangi bir şey olabilir, sadece "Nasıl taşınmayı istiyorum"? Golfyness dışında cevapları gerçekten etkilemez.
Rɪᴋᴇʀ

@EasterlyIrk: Kabul etmiyorum. Çünkü bu durumda, golfçüler baytları kurtarmak için ipin nasıl sıkıştırılacağını düşünmek zorunda kalacaklar.
LMD

2
@ user7185318 Bunu aklınızda bulundurun , temel olarak her meydan okuma için 1 problemle devam edin . Dizeyi sıkıştırmak tamamen zindandan bir sorun haline gelir ve bu nedenle bir zindan tarayıcısı yapar ve bu nedenle muhtemelen bu meydan okumaya tahammül edilmemelidir.
Rɪᴋᴇʀ

1
Oyuncunun sınırların dışında olduğu zaman gösterilmesi kabul edilebilir mi yoksa ortadan kaybolmaları mı gerekiyor?
mwh

Yanıtlar:


1

MATLAB, 268 247 246 bayt

Muhtemelen rekabetçi değil, ama eğlenceliydi. Golf versiyonu:

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

Okunabilir sürüm:

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

tryBloklar sınırları hataların dışarı çökmesini fonksiyonunu önlemek için vardır. Eminim ki ikisi aşırıya kaçmış, ama bundan daha iyi golf oynayamam.

MATLAB'ın diziyi aşağı ve sağa doğru genişleteceğini belirtmek gerekir, ancak oyuncu ilk kez 'keşfedilmemiş' bir bölgeye taşındığında kaybolacaktır. Örneğin, zindanın mevcut sınırlarının dışına bir boşluk sağa kaydırırsanız kaybolursunuz, ancak bir sonraki dönüş MATLAB diziyi yeni sütunu (veya aşağı doğru hareket ediyorsanız satırı) içerecek şekilde genişletir. '#'==d(y,x)bir bayt ile karşılaştırıldığında kaydeder d(y,x)=='#'sen arasına boşluk gerekmez çünkü, ifve'#'


Güzel cevap! Ben :) büyük meydan çünkü daha iyi java vs vardır, ortak dilleri de bir şansı olmalı bir şey burada çok kısa kazanç, bu kez umut
LMD

1

Kahve yazısı: 580 Byte

Bu algoritmadan ve beynimden alabileceğim her şeyi sıktım. Tatile ihtiyacım var.

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'

güzel çözüm, Lord Ratte
LMD
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.