미로를 걸어


15

아니면 실제로 미로가 아니지만 여전히 그렇습니다.

규칙 :

  1. 입력 , 두 줄 문자열로 구성 *, 1, xX. 그 끈은 걷는 미로입니다. 줄의 길이같습니다 .

    ,이 두 줄 사이에 (쉼표) 또는 편리한 구분 기호를 사용하여 입력을 문자열로 취할 수 있습니다 . 또는 두 줄을 함수에 대한 별도의 인수로 사용할 수 있습니다.

  2. 출력 은 문자열을 종료하기 위해 수행해야하는 단계 수입니다 (마지막 단계는 문자열에서 사용자를 이동시키는 단계입니다).

  3. 첫 번째 기호 앞에 왼쪽 위 모서리 (더 높은 선)에서 시작 합니다.

  4. 각 단계마다 하나의 기호 (n 번째에서 (n + 1) 번째 위치 ) 씩 앞으로 이동합니다 . 그런 다음 밟는 캐릭터에 따라 결과가 다릅니다. 각 문자는 다음과 같습니다.

    • *- 아무것도. 당신은 그것을 정상적으로 밟습니다.
    • x-일단 밟으면 라인을 전환하지만 처음부터 동일한 수평 거리를 유지하십시오. 예를 들어, 더 높은 선의 세 번째 위치를 밟고 x여기 에서 소문자를 만났습니다 . 그런 다음 즉시 하단 라인으로 이동하지만 다시 세 번째 위치에서 이동합니다.
    • X-회선을 전환하고 다음 위치로 이동하십시오. 예제는 동일하지만 세 번째 위치에서 네 번째 위치로 이동합니다 (따라서 네 번째 위치의 두 번째 줄에 있음).
    • 1 -다른 위치로 앞으로 이동하십시오.

각 문자가 작업을 수행하면 공백으로 바뀌고 더 이상 "작동"하지 않습니다.

예는 다음과 같습니다.

  1. 입력 :

    x
    *
    

    앞에서 말했듯이 첫 번째 줄의 첫 번째 기호보다 먼저 시작합니다. 첫 번째 단계는 문자로 이동 x하고이 문자는 두 번째 줄로 전환합니다. 문자 x는 더 이상으로 기능하지 x않지만로 대체되었습니다 *. 이것은 후자의 예에서 더 관련이 있습니다. 당신은 이제 더 낮은 줄에 별표를 표시하고 있습니다.

    두 번째 단계는 앞으로 나아가고 줄을 빠져 나가서 미로가 완성되고 2 단계가 걸렸습니다.

    출력 2 .

  2. 입력 :

    xX*
    x1*
    

    첫 번째 단계 :에서 x이동하면 x하단 라인으로 이동합니다 . 사용 된 문자가 별표로 대체되었다는 규칙이 있습니다. 그런 다음 첫 번째 줄로 돌아가지만 더 이상 사용되지 않으며 x별표가되었습니다. 따라서이 별표로 안전하게 이동하면 단계가 완료됩니다 (이제 첫 번째 줄의 첫 번째 위치에 있습니다).

    2 단계 : 계속 진행X 하면 하단 라인으로 이동 한 다음 앞으로 이동합니다. 이제 두 번째 행 (별표)의 세 번째 위치에 있습니다 (이 포함 된 두 번째 위치를 방문한 적이 없음 1).

    3 단계 : 문자열을 종료하면서 앞으로 이동합니다.

    출력 : 3.

테스트 사례 :

  1. 입력:

    *1*
    xxx
    

    출력 : 3. ( 1당신이 세 번째 위치로 점프 하기 때문에 ). 거기에서는 두 번째 줄을 방문하지 않지만 입력의 일부가 필요합니다.

  2. 입력:

    *X*1*x
    x*1xx*
    

    출력 : 4.

  3. 입력:

    1x1x
    ***X
    

    출력 : 3.

  4. 입력:

    1*x1xxx1*x
    x*x1*11X1x
    

    출력 : 6.

  5. 입력:

    xXXXxxx111*
    **xxx11*xxx
    

    출력 : 6.


빈 문자열은 두 줄 문자열이 아니므로 유효한 입력이 아니어야합니다.
edc65

@edc Haha, 나는 모순된다. 네 확실합니다.
nicael

"\n\n"두 줄 문자열입니다.
feersum

@feersum 그렇다면 나는 1당신이 첫 번째 줄을 시작하기 전에 출력이 있어야한다고 생각합니다 . 그리고 한 단계 앞으로 나아가면 미로를 마칩니다 ...
Amit Gold

답변:


5

달팽이, 34 바이트

A^
\1r|\xud|\Xaa7},(\*|\xud=\x)r},

넓히는:

{
    {
        \1 r |
        \x ud |
        \X aa7
    },
    (\* | \x ud =\x)
    r
},

N 단계를 수행하는 경로의 경우 프로그램은 0 단계, 1 단계, ..., N-1 단계의 각 순회에 대해 하나의 성공적인 일치를 찾습니다.


3

하스켈, 68 66 65 바이트

(a:b)#l@(c:d)|a<'+'=1+b#d|a>'w'=l#('*':b)|a>'W'=d#b|1<2=b#d
_#_=1

함수 #는 두 줄을 별도의 매개 변수로 사용합니다. 사용 예 : "1x1x" # "***X"-> 3.

우리는 *떠나기 위해 우리 가 밟는 별 + 1을 세 어야합니다 .

(a:b)#l@(c:d)             -- bind: a -> first char of first line
                                   b -> rest of first line
                                   l -> whole second line
                                   c -> first char of second line (never used)
                                   d -> rest of second line
   |a < '+' = 1+b#d       -- stepped on a *, so add 1 and go on
   |a > 'w' = l#('*':b)   -- x switches lines and replaces the x with *
   |a > 'W' = d#b         -- X switch lines and go on
   |1<2     = b#d         -- the rest (-> 1) simply walks forward
_#_=1                     -- base case: the empty string counts 1 for leaving

편집 : @feersum은 바이트를 저장했습니다. 감사!


작업 데모 ( ideone.com에서 편리 할 것입니다)를 제공 할 수 있습니까 , 나는 Haskell 프로그래머는 아니지만 그것을 가지고 놀고 싶습니다.
nicael

1
@nicael : 여기를 참조
nimi을

예를 들어 a>'a'대신 사용할 수 a=='x'있습니까?
feersum

나는 알지 못했지만 실제로 빈 문자열은 유효하지 않은 입력입니다 (입력이 2 줄 문자열
이라고 말했기

@ feersum : 그렇습니다. 감사!
nimi

2

자바 스크립트 (ES6), 119

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}

덜 골프

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
}

테스트

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

TSQL (sqlserver 2012+), 276 바이트

골프 :

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

언 골프 드 :

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

깡깡이


1

자바 스크립트, 211 바이트

웹 페이지에 표시되는 각 단계가 표시되는 버전을 만드는 중입니다.

(x,y)=>{t=0;l=0;n=1;while(t<x.length){c=(l?x:y);if(c[t]=='x'){l=!l;if(l){x=x.slice(0,t-2)+'*'+x.slice(t-1);}else{y=y.slice(0,t-2)+'*'+y.slice(t-1);}}if(c[t]=='X'){l=!l;t++;}if(c[t]=='1'){return n}

내가 교체 할 때 기대했던 것보다 더 바이트 사용 x으로 *인해 JS의 불변 Strings. 특히 교체 부품을 사용하여 개선 할 제안을 부탁드립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.