首页
学习
活动
专区
圈层
工具
发布

走迷宫
EN

Code Golf用户
提问于 2016-07-11 19:17:36
回答 4查看 587关注 0票数 15

或者也许这不是真正的迷宫,但仍然是。

规则:

  1. 输入是一个两行字符串,由*1xX组成.那根绳子是个迷宫。这两条线的长度相等。您可以将输入作为带有, (逗号)或这两行之间的任何方便分隔符的字符串。或者,您可以将这两行作为函数的单独参数。
  2. 输出是退出字符串必须采取的步骤数(最后一步是将您移出字符串的步骤)。
  3. 您从左上角(较高的行)开始,在第一个符号之前。
  4. 对于每一步,您将向前移动一个符号(从nth到(n+1)th位置)。然后,取决于你踩到的角色,结果是不同的。以下是每个字符所做的工作:
    • * -没什么。你只是正常地踩在上面。
    • x --一旦你踩到了它,就切换线路,但从一开始就保持在相同的水平距离上。例如,您踩到了较高行的第三个位置,并在这里遇到了一个小写x。然后你立即移动到较低的线,但再次在第三个位置。
    • X -切换线路并转到下一个位置.这里的例子是一样的,但您也从第三个位置移动到第四个位置(因此,您位于第四位置的第二行)。
    • 1 --只要换个位置就行了。

一旦每个字符完成了它的工作,它就被替换为一个空格,不再“工作”。

下面是一些例子。

  1. 输入x*如前所述,在第一行的第一个符号之前开始。第一步将您移动到字母x上,这封信将您切换到第二行。字母x不再充当x,而是替换为*。在后一个例子中,这将更有意义。你现在在底线上的星号上,它对你没有任何影响。第二步是向前移动,然后退出字符串,这样迷宫就完成了,它采取了两个步骤。输出2
  2. 输入xX* x1*第一步:您在x上移动,它将您移动到下一行的x上。这里有这样的规则,即用星号代替使用的字符。然后移回第一行,但它不再是x,因为它已经被使用并成为星号。因此,您在这个星号上安全地移动,步骤就完成了(您现在位于第一行的第一个位置)。第二步:你在X上移动,它把你推到下线,然后把你向前推。您现在居住在第二行的第三个位置(星号),从未访问过第二个位置(其中包含1)。第三步:向前移动,退出字符串。输出:3

测试用例:

  1. 输入:*1* xxx输出:3。(因为1会让你跳到第三个位置)。在那里,您永远不会访问第二行,但它是输入的一部分。
  2. 输入:*X*1* x *1xx*输出:4
  3. 输入: 1x1x *X输出:3
  4. 输入:1*x1xx1* x*x1*11X1x输出:6
  5. 输入:xXXXxx111*xxx11*xxx输出:6
EN

回答 4

Code Golf用户

回答已采纳

发布于 2016-07-12 05:19:47

蜗牛,34字节

代码语言:javascript
复制
A^
\1r|\xud|\Xaa7},(\*|\xud=\x)r},

扩大:

代码语言:javascript
复制
{
    {
        \1 r |
        \x ud |
        \X aa7
    },
    (\* | \x ud =\x)
    r
},

对于采取N步的路径,程序为每遍历0步、1步、.、N-1步骤找到一次成功匹配。

票数 5
EN

Code Golf用户

发布于 2016-07-12 11:02:48

JavaScript (ES6),119

代码语言:javascript
复制
l=>{z=-~l.search`
`,l=[...l+' '];for(n=p=0;(c=l[p%=2*z])>' ';p+=c>'X'?z:c>'1'?z+1:c>'0'?1:(++n,1))l[p]='*';return-~n}

少镀金

代码语言:javascript
复制
l=>{
  z=1+l.search`\n`;
  l=[...l+' '];
  for( n = p = 0; 
       (c=l[p%=2*z])>' '; 
       p += c>'X' ? z : c>'1' ? z+1 : c>'0'? 1 : (++n,1) )
    l[p] = '*';
  return 1+n
}

测试

代码语言:javascript
复制
f=l=>{z=-~l.search`
`,l=[...l+' '];for(n=p=0;(c=l[p%=2*z])>' ';p+=c>'X'?z:c>'1'?z+1:c>'0'?1:(++n,1))l[p]='*';return-~n}

[['x\n*',2]
,['xX*\nx1*',3]
,['*1*\nxxx',3]
,['*X*1*x\nx*1xx*',4]
,['1x1x\n***X',3]
,['1*x1xxx1*x\nx*x1*11X1x',6]
,['xXXXxxx111*\n**xxx11*xxx',6]
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i) 
  console.log('Test result '+r+(r==k?' OK ':' KO (expected '+k+')')+'\n'+i)
})  
票数 2
EN

Code Golf用户

发布于 2016-07-13 09:50:52

TSQL(sqlserver 2012+),276个字节

Golfed:

代码语言:javascript
复制
DECLARE @i VARCHAR(99)=
'xXXXxxx111*'+CHAR(13)+CHAR(10)+
'**xxx11*xxx'

,@t BIT=0,@c INT=1,@ INT=1WHILE @<LEN(@i)/2SELECT @t-=IIF(a like'[1*]'or'xx'=a+b,0,1),@c+=IIF(a='*'or'xx'=a+b,1,0),@+=IIF(a='x'and'x'>b,0,1)FROM(SELECT SUBSTRING(d,@t*c+@,1)a,SUBSTRING(d,(1-@t)*c+@,1)b FROM(SELECT LEN(@i)/2+1c,REPLACE(@i,'X','q'COLLATE thai_bin)d)x)x PRINT @c

Ungolfed:

代码语言:javascript
复制
DECLARE @i VARCHAR(99)=
'xXXXxxx111*'+CHAR(13)+CHAR(10)+
'**xxx11*xxx'

,@t BIT=0,@c INT=1,@ INT=1
WHILE @<LEN(@i)/2
  SELECT
    @t-=IIF(a like'[1*]'or'xx'=a+b,0,1),
    @c+=IIF(a='*'or'xx'=a+b,1,0),
    @ +=IIF(a='x'and'x'>b,0,1)
  FROM
    (
      SELECT
        SUBSTRING(d,@t*c+@,1)a,
        SUBSTRING(d,(1-@t)*c+@,1)b
      FROM 
        (SELECT LEN(@i)/2+1c,REPLACE(@i,'X','q'COLLATE thai_bin)d)x
    )x

PRINT @c

小提琴

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/85186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档