Перестаньте ходити в стіни!


16

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

Змагання

Напишіть програму функції, яка, задавши напрямок та сітку символів 3 на 3, виводить ту саму сітку після того, як гравець зробив крок.

Наприклад,

9
#..
.@#
#.#

стає

#.@
..#
#.#

Вхідні дані

  • Напрямок задається однією цифрою від 1 до 9, кожна відповідає 8 кардинальним напрямкам і стоїть нерухомо. Це походить від відносних розташувань чисел на клавіатурі:

    NW N NE
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    Однак ви також можете використовувати цифри 123, 456, 789 замість 789, 456, 123. Іншими словами, ви можете поміняти місцями верхній і нижній 2 ряди або числа, якщо захочете. Це єдині 2 прийнятні комбінації індексів.

  • Сітка 3 на 3 буде складатися з 3-х чітко роздрукованих символів ASCII, що представляють підлоги, стіни та програвач. (У тестових випадках,. використовується для підлоги, #s - це стіни та @гравець)

  • Ви можете вибрати, які символи використовує ваша програма, але ви повинні вказати їх у своїй відповіді, і вони повинні бути послідовними протягом декількох випробувань.
  • Символ, який представляє персонажа, завжди буде посередині сітки 3 на 3, а напрямок завжди буде від 1 до 9 (у т.ч.)
  • Ви можете взяти дані в будь-якому порядку
  • Сітка 3 на 3 може бути введена як масив char, рядок рядків, рядок довжиною 9 або інша розумна альтернатива.

Вихідні дані

  • Повернення з функції або вихід до StdOut або найближчої альтернативи
  • Дозволені пробіли та нові рядки
  • Ви повинні використовувати ті ж представлення символів, що і вхідні дані
  • Для виходів дозволені ті самі формати, дозволені для входів

Як рухається гравець

Якщо вказаний напрямок перекрито стіною (наприклад, якщо вищевказаний приклад мав напрямок 6), тоді подивіться на 2 найближчих напрямки:

  • Якщо один (і лише один) напрямок вільний, перемістіть гравця в цьому напрямку.
  • Якщо жоден напрямок не вільний, подивіться наступний найближчий 2 напрямок (виключаючи напрям 5). Якщо ви завернули всю дорогу і не знайшли відкритого напрямку (гравець, оточений стінами), не рухайте програвач
  • Якщо обидва напрямки відкриті, виберіть один, щоб перейти довільно (хоча не обов'язково рівномірно).

Якщо заданий напрямок 5, не рухайте програвача

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

( #= стіна, .= підлога, @= гравець)

Вхід:

9
# ..
. @ #
#. #

Вихід:

#. @
.. #
#. #


Вхід:

3
# ..
. @ #
#. #

Вихід:

# ..
.. #
# @ #


Вхід:

7
##.
# @ #
.. #

Вихід:

## @ ##
#. # або #. #
.. # @. #


Вхід:

5
...
. @.
...

Вихід:

...
. @.
...


Вхід:

2
###
# @ #
###

Вихід:

###
# @ #
###

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.


Не використовуєте yuhjklbn? RIP.
Rɪᴋᴇʀ

Крім того, мені не дуже подобається частина "вибрати альтернативний напрямок". Це щось на відміну від іншої частини виклику, яка полягає в тому, щоб «перемістити гравця у визначеному напрямку та вивести». Хоча це лише особисті переваги.
Rɪᴋᴇʀ

1
Ця частина заплутана: "Якщо жоден напрямок не вільний, подивіться наступні найближчі 2 напрямки."
Leaky Nun

1
Чи можемо ми призначити число замість символу ASCII для кожного елемента, а потім приймати введення як двовимірний список? Або вони повинні бути струнними?
Скотт Мілнер

2
Чи можу я використовувати вказівки 123;456;789замість 789;456;123?
Leaky Nun

Відповіді:


2

Pyth - 73 70 байт

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

Спробуй це

Вхід складається з двох рядків:

1-й рядок: напрямок руху

2-й рядок: Дошка (позиції 123456789, верхній ряд - 123)


3

JavaScript (ES6), 192 163 байти

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)

Примітки

Ця функція використовує спеціальний формат введення. Перший вхід - це масив цілих чисел ( 0для floor, 1для wallі 2для player), що представляють карту. Другий вхід - напрямок (перевернутий): 1північний захід, 2північ, 3північний схід, 4захід тощо. Введення слід вводити через синтаксис currying ( Z(a)(b)).

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

Карти та вказівки змінено відповідно до мого формату введення.

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

Пітон 3, 120 104 153 176 175 байт

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

Спробуйте в Інтернеті!

Цей метод отримує напрямок та список '.', '#' Та '@'. Індекси починаються з 1 до 9 (насправді від 0 до 8 у списку). Так вона має форму

123 
456
789 

Метод повернення нового списку з новими позиціями.

Ця лінія

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)

повертає список такого типу:

>>>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, '#')]

Обчислюємо відстані до вільних точок і додаємо випадковість. Тому що ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')ми можемо сказати, що найближчий '.' для n = 7 (індекс у списку) має індекс 8.

введіть тут опис зображення

Приклад:

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

1) Це не працює для тестових випадків, коли напрямок, в який гравець хоче рухатися, зайняте, а правильна позиція не перша ','(що стосується тестових випадків 2, 3 і 5). 2) Схоже, що ваш формат вводу / виводу не такий, як у запитанні. Будь ласка, зазначте свій формат вводу / виводу.
Лука

Ваш приклад f(9, ...не працює - він розміщує символу на рівні 2, але найближчі позиції до 9 - це 6 та 8, тому одне з них слід вибирати навмання (також у вашому коді немає випадковості). Крім того, він повинен обходити периметр, знаходячи наступного найближчого, так що f(9,list("####@#.##"))слід розмістити персонажа на єдиному можливому місці (7 тут).
Джонатан Аллан

Дякую за вказівку на помилки. Для мене новиною є те, що код l [4], l [l.index ('.')] = '. @' Та l [l.index ('.')], L [4 ] = "@." різні
Кирилл Малышев

@JonathanAllan, спочатку я не зовсім зрозумів правила. Я сподіваюся, що я міг правильно виправити код.
Кирилл Малышев

Ще не правильно, ні. 1. приклад f(9, ...повинен повернутися list("#....##@#")(тому що 8 є вільним, а поруч із 9). 2. Щось подібне f(9,list("####@.#.#"))повинно мати певний шанс повернутися list("####..#@#")(не завжди list("####.@#.#")), як зазначено "Якщо обидва напрямки відкриті, виберіть один, щоб перейти довільно".
Джонатан Аллан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.