Duvarlara yürümeyi bırak!


16

Bazı metin tabanlı haydut beğenileri duvarlara girmenize izin vermez ve denerseniz size geri dönmenizi sağlar. Oyuncuyu en yakın geçerli yönde hareket ettirebildiğinizde neden bunu yapıyorsunuz?

Meydan okuma

Oyuncu bir adım attıktan sonra, yön ve 3'e 3 karakterlik bir ızgara verilen aynı ızgarayı veren bir işlev programı yazın.

Örneğin,

9
#..
.@#
#.#

olur

#.@
..#
#.#

Giriş

  • Yön, her biri 8 kardinal yöne karşılık gelen ve hareketsiz duran 1 ila 9 arasındaki tek bir rakamla verilir. Bu, tuş takımındaki sayıların göreli konumlarından türetilir:

    NW N NE
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    Ancak, 789, 456, 123 yerine 123, 456, 789 sayılarını da kullanabilirsiniz. Başka bir deyişle, isterseniz üst ve alt 2 satırı veya sayıyı değiştirebilirsiniz. Bunlar sadece kabul edilebilir 2 endeks kombinasyonudur.

  • 3'e 3 ızgara, yürünebilir zemini, duvarları ve oyuncuyu temsil eden 3 ayrı, yazdırılabilir ASCII karakterden oluşacaktır. (Test durumlarda, .zemin için kullanılır, #s duvar ve @oyuncu)

  • Programınızın hangi karakterleri kullanacağını seçebilirsiniz, ancak bunları cevabınızda belirtmelisiniz ve birden fazla denemede tutarlı olmalıdırlar.
  • Karakteri temsil eden karakter her zaman 3 x 3 ızgarasının ortasında ve yön her zaman 1 ile 9 arasında olacaktır (dahil)
  • Herhangi bir sırayla girdi alabilirsiniz
  • 3'e 3 ızgarası char dizisi, dize dizisi, 9 uzunluklu dize veya başka bir makul alternatif olarak girilebilir.

Çıktı

  • Bir işlevden veya çıktıdan StdOut'a veya en yakın alternatife dönme
  • Sondaki boşluklara ve yeni satırlara izin verilir
  • Girişle aynı karakter temsillerini kullanmalısınız
  • Girdiler için izin verilen biçimlerin aynısı çıktılar için de kullanılabilir

Oyuncu nasıl hareket eder

Belirtilen yön bir duvarla engellenirse (örneğin, yukarıdaki örnekte 6 yönü varsa), en yakın 2 yöne bakın:

  • Bir (ve yalnızca bir) yön serbestse, oynatıcıyı bu yönde hareket ettirin.
  • Hiçbir yön ücretsiz değilse, bir sonraki en yakın 2 yöne bakın (yön 5 hariç). Tamamen sardıysanız ve açık bir yön bulamadıysanız (oyuncu duvarlarla çevrili), oynatıcıyı hareket ettirmeyin
  • Her iki yön de açıksa, rastgele hareket etmek için birini seçin (her ne kadar aynı olmasa da).

Verilen yön 5 ise, oynatıcıyı hareket ettirmeyin

Test senaryoları

( #= duvar, .= zemin, @= oyuncu)

Giriş:

9
# ..
. @ #
#. #

Çıktı:

#. @
.. #
#. #


Giriş:

3
# ..
. @ #
#. #

Çıktı:

# ..
.. #
# @ #


Giriş:

7
##.
# @ #
.. #

Çıktı:

## @ ##.
#. # veya #. #
.. # @. #


Giriş:

5
...
. '.
...

Çıktı:

...
. '.
...


Giriş:

2
###
# @ #
###

Çıktı:

###
# @ #
###

puanlama

Bu , bu yüzden bayttaki en kısa cevap kazanır.


Kullanmıyor yuhjklbnmusunuz? HUZUR İÇİNDE YATSIN.
Rɪᴋᴇʀ

Ayrıca, "alternatif bir yön seç" kısmını pek sevmiyorum. Bu, "oyuncuyu belirli bir yönde ve çıktıda hareket ettirmek" olan meydan okumanın diğer bölümünden biraz farklı. Bu sadece kişisel tercih.
Rɪᴋᴇʀ

1
Bu bölüm kafa karıştırıcı: "Hiçbir yön ücretsiz değilse, en yakın 2 yöne bakın."
Sızdıran Rahibe

1
Her öğe için ASCII karakteri yerine bir sayı atayabilir, sonra girdiyi 2 boyutlu liste olarak alabilir miyiz? Yoksa ip mi olmak zorundalar?
Scott Milner

2
Talimatları 123;456;789yerine kullanabilir miyim 789;456;123?
Sızdıran Rahibe

Yanıtlar:


2

Pyth - 73 70 bayt

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

Dene

Girdi iki satırdan oluşur:

1. satır: hareket yönü

2. sıra: Pano (123456789, 123 en üst sırada olacak şekilde)


3

JavaScript (ES6), 192 163 bayt

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

notlar

Bu işlev özel bir giriş biçimi kullanır. İlk girdi, haritayı temsil eden bir tamsayı dizisidir ( 0için floor, 1için wallve 2için player). İkinci girdi (ters çevrilmiş) yöndedir: 1kuzey-batı, 2kuzey, 3kuzey-doğu, 4batı vb. Girişler körelme sözdizimi ( Z(a)(b)) ile verilmelidir .

Test senaryoları

Haritalar ve yönler girdi biçimime uyacak şekilde değiştirildi.

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

Piton 3, 120 104 153 176 175 bayt

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

Çevrimiçi deneyin!

Bu yöntem '.', '#' Ve '@' yönlerini ve listesini alır. Dizinler 1'den 9'a kadar başlar (listede 0'dan 8'e kadar). Yani formu var

123 
456
789 

Yöntem yeni listelerle yeni pozisyonlar döndürür.

Bu hat

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

bu tür bir liste döndürür:

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

Serbest noktalara olan mesafeleri hesaplıyor ve rastgele ekliyoruz. Çünkü ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')buna en yakın 'diyebiliriz.' n = 7 için (listedeki dizin) 8 dizinine sahiptir.

resim açıklamasını buraya girin

Misal:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1) Bu, oyuncunun hareket etmek istediği yönün dolu olduğu ve doğru pozisyonun ilk olmadığı test senaryolarında işe yaramaz ','(bu, test vakaları 2, 3 ve 5 için geçerlidir). 2) G / Ç biçiminiz, sorudakiyle aynı görünmüyor. Lütfen G / Ç biçiminizi belirtin.
Luke

Örneğiniz f(9, ...işe yaramaz - karakteri 2'ye yerleştirir, ancak 9'a en yakın konumlar 6 ve 8'dir, bu nedenle bunlardan biri rastgele seçilmelidir (kodunuzda rasgele de yoktur). Daha sonra, bir sonraki en yakın f(9,list("####@#.##"))noktayı bulmak için çevre etrafında gitmelidir, bu yüzden karakteri mümkün olan tek noktaya yerleştirmelidir (7 burada).
Jonathan Allan

Hataları işaret ettiğiniz için teşekkürler Benim için haber şu: l [4], l [l.index ('.')] = '. @' Ve l [l.index ('.')], L [4 ] = ''.' farklı
Кирилл Малышев

@JonathanAllan, ilk başta kuralları tam olarak anlamadım. Umarım kodu doğru bir şekilde düzeltebilirim.
Кирилл Малышев

Hala doğru değil, hayır. 1. örnek f(9, ...dönmelidir list("#....##@#")(çünkü 8 ücretsiz ve 9 yanında). 2. "Yönlerin her ikisi de açıksa, rastgele gitmek için birini seçin" olarak belirtildiği gibi bir şey (her zaman değil ) f(9,list("####@.#.#"))dönme şansına sahip olmalıdır . list("####..#@#")list("####.@#.#")
Jonathan Allan
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.