别走进墙壁了!


16

一些基于文本的流氓行为不会让您走进墙壁,如果尝试的话,也会让您后退。当您可以使播放器朝最接近的有效方向移动时,为什么要这样做?

挑战

编写一个功能程序,给定方向和3 x 3的字符网格,在玩家采取步骤后输出相同的网格。

例如,

9
#..
.@#
#.#

变成

#.@
..#
#.#

输入值

  • 方向由1到9的单个数字给出,每个数字对应于8个基本方向并保持静止。这是从键盘上数字的相对位置得出的:

    西北西北
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    西南
    
    但是,您也可以使用数字123、456、789而不是789、456、123。换句话说,如果您愿意,可以交换顶部和底部2行或数字。这些是仅有的2个可接受的索引组合。

  • 3 x 3网格将由3个不同的可打印ASCII字符组成,这些字符代表步行地板,墙壁和播放器。(在测试用例中,.用于地板,#s是墙壁,@是玩家)

  • 您可以选择程序使用的字符,但是您必须在答案中说明它们,并且它们在多次试验中必须保持一致。
  • 代表角色的角色将始终位于3 x 3网格的中间,并且方向将始终在1到9(包括)之间
  • 您可以按任何顺序输入
  • 3 x 3网格可以作为char数组,字符串数组,9长度字符串或其他合理的替代输入。

输出量

  • 从函数返回,或输出到StdOut或最接近的替代项
  • 允许尾随空格和换行符
  • 您必须使用与输入相同的字符表示形式
  • 输入允许的格式相同,输出允许的格式相同

玩家如何移动

如果指定的方向被墙挡住(例如,如果上面的示例的方向为6),则查看2个最接近的方向:

  • 如果一个(只有一个)方向是自由的,请沿该方向移动播放器。
  • 如果没有方向可用,请查看下一个最近的2个方向(方向5除外)。如果您一直缠绕并且没有打开方向(玩家被墙壁包围),请不要移动玩家
  • 如果两个方向都打开,请随机选择一个方向(尽管不一定要一致)。

如果给定方向为5,请勿移动播放器

测试用例

#=墙,.=地板,@=玩家)

输入:

9
#..
。@#
#。#

输出:

#。@
..#
#。#


输入:

3
#..
。@#
#。#

输出:

#..
..#
#@#


输入:

7
##。
#@#
..#

输出:

## @ ##。
#。# 要么 #。#
..#@。#


输入:

5
...
。@。
...

输出:

...
。@。
...


输入:

2
###
#@#
###

输出:

###
#@#
###

计分

这是,因此最短的答案以字节为单位。


不使用yuhjklbn?RIP。
Rɪᴋᴇʀ

另外,我不太喜欢“选择其他方向”部分。这与挑战的其他部分有点不同,挑战的另一部分是“将玩家移动到指定的方向并输出”。不过那只是个人喜好。
Rɪᴋᴇʀ

1
这部分令人困惑:“如果没有免费的路线,请查看下一个最近的2个路线。”
Leaky Nun

1
我们可以为每个元素分配一个数字而不是ASCII字符,然后将输入作为二维列表吗?还是必须是字符串?
Scott Milner

2
我可以使用指示123;456;789代替789;456;123吗?
Leaky Nun

Answers:


2

Pyth- 73 70字节

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

尝试一下

输入包含两行:

第一行:移动方向

第二行:木板(位置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)

笔记

此功能使用特殊的输入格式。第一个输入是代表地图的整数数组(0for floor1for wall2for player)。第二个输入是(翻转)方向:1西北,2北,3东北,4西等。这些输入应通过循环语法(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

Python 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)您的I / O格式似乎与问题中的格式不同。请提及您的I / O格式。
路加福音

您的示例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("####.@#.#"))。
乔纳森·艾伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.