Đi bộ trong mê cung


15

Hoặc có thể nó không thực sự là một mê cung, nhưng vẫn còn.

Quy tắc:

  1. Đầu vào là một chuỗi hai dòng, bao gồm *, 1, xX. Chuỗi đó là một mê cung để đi qua. Các dòng có độ dài bằng nhau .

    Bạn có thể lấy đầu vào dưới dạng một chuỗi bằng ,(dấu phẩy) hoặc bất kỳ dấu phân cách thuận tiện nào giữa hai dòng này. Hoặc bạn có thể lấy cả hai dòng làm đối số riêng biệt cho hàm của mình.

  2. Đầu ra là số bước bạn phải thực hiện để thoát chuỗi (bước cuối cùng là bước di chuyển bạn ra khỏi chuỗi).

  3. Bạn bắt đầu ở góc trên cùng bên trái (dòng cao hơn), trước biểu tượng đầu tiên.

  4. Đối với mỗi bước, bạn di chuyển về phía trước bởi một biểu tượng (từ thứ n để (n + 1) lần thứ vị trí ). Sau đó, tùy thuộc vào nhân vật bạn bước vào, kết quả là khác nhau. Đây là những gì mỗi char làm:

    • *- không có gì. Bạn chỉ cần bước vào nó bình thường.
    • x- một khi bạn bước lên nó, chuyển dòng, nhưng vẫn giữ nguyên khoảng cách ngang từ đầu. Ví dụ, bạn bước lên vị trí thứ ba của dòng cao hơn và gặp một chữ thường xở đây. Sau đó, bạn ngay lập tức di chuyển đến dòng dưới, nhưng một lần nữa ở vị trí thứ ba.
    • X- chuyển dòng và đi đến vị trí tiếp theo. Ví dụ tương tự ở đó, nhưng bạn cũng di chuyển từ vị trí thứ ba sang vị trí thứ tư (do đó bạn đang ở dòng thứ hai ở vị trí thứ tư).
    • 1 - chỉ cần di chuyển về phía trước bởi một vị trí khác.

Khi mỗi nhân vật thực hiện công việc của mình, nó sẽ được thay thế bằng một khoảng trắng và không còn "hoạt động" nữa.

Ví dụ sau.

  1. Đầu vào :

    x
    *
    

    Như đã nói, bạn bắt đầu trước biểu tượng đầu tiên của dòng đầu tiên. Bước đầu tiên chuyển bạn trên thư xvà thư này chuyển bạn đến dòng thứ hai. Chữ xkhông còn chức năng như x, nhưng thay thế bằng *. Điều này sẽ có liên quan hơn trong các ví dụ sau. Bây giờ bạn đang có một dấu sao ở dòng dưới và nó không làm gì cho bạn.

    Bước thứ hai là đưa bạn về phía trước và bạn thoát khỏi chuỗi, vì vậy mê cung đã hoàn thành và phải mất 2 bước.

    Đầu ra 2 .

  2. Đầu vào :

    xX*
    x1*
    

    Bước 1 : bạn di chuyển trên x, di chuyển bạn trên xdòng dưới. Ở đây có quy tắc nói rằng ký tự được sử dụng được thay thế bằng dấu hoa thị. Sau đó, bạn quay trở lại dòng đầu tiên, nhưng nó không còn xở đó nữa , vì nó đã được sử dụng và trở thành một dấu sao. Vì vậy, bạn di chuyển an toàn trên dấu sao này và bước hoàn thành (bây giờ bạn đang ở vị trí đầu tiên của dòng đầu tiên).

    Bước 2 : bạn tiến lên X, nó đẩy bạn xuống dòng dưới và sau đó đẩy bạn về phía trước. Bây giờ bạn cư trú ở vị trí thứ ba của dòng thứ hai (dấu hoa thị), chưa bao giờ truy cập vị trí thứ hai (có chứa 1).

    Bước 3 : bạn tiến lên phía trước, thoát khỏi chuỗi.

    Đầu ra : 3.

Các trường hợp thử nghiệm:

  1. Đầu vào:

    *1*
    xxx
    

    Đầu ra : 3. (vì 1làm cho bạn nhảy lên vị trí thứ ba). Ở đó bạn không bao giờ truy cập vào dòng thứ hai, nhưng nó là một phần bắt buộc của đầu vào.

  2. Đầu vào:

    *X*1*x
    x*1xx*
    

    Đầu ra : 4.

  3. Đầu vào:

    1x1x
    ***X
    

    Đầu ra : 3.

  4. Đầu vào:

    1*x1xxx1*x
    x*x1*11X1x
    

    Đầu ra : 6.

  5. Đầu vào:

    xXXXxxx111*
    **xxx11*xxx
    

    Đầu ra : 6.


Một chuỗi trống không phải là một đầu vào hợp lệ, vì đó không phải là một chuỗi hai dòng
edc65

@edc Haha, tôi đang mâu thuẫn với chính mình. Vâng, thực sự.
nicael

"\n\n"là một chuỗi hai dòng ...
frageum

@feersum thì tôi nghĩ đầu ra phải là 1, khi bạn bắt đầu trước dòng thứ 1, sau đó bạn tiến lên một bước, và sau đó bạn hoàn thành mê cung ...
Amit Gold

Câu trả lời:


5

Ốc, 34 byte

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

Mở rộng:

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

Đối với một đường dẫn có N bước, chương trình tìm thấy một kết quả khớp thành công cho mỗi lần di chuyển gồm 0 bước, 1 bước, ..., N - 1 bước.


3

Haskell, 68 66 65 byte

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

Hàm #lấy cả hai dòng làm tham số riêng. Ví dụ sử dụng: "1x1x" # "***X"-> 3.

Chúng ta chỉ cần đếm những ngôi sao *chúng ta bước vào cộng 1 để rời đi.

(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

Chỉnh sửa: @feersum đã lưu một byte. Cảm ơn!


Bạn có thể cung cấp một bản demo hoạt động (trên ideone.com nó sẽ thuận tiện), tôi không phải là lập trình viên Haskell nhưng muốn chơi với nó.
nicael


Bạn có thể sử dụng ví dụ a>'a'thay vì a=='x'?
frageum

Tôi đã không nhận ra rằng, nhưng chuỗi thực phẩm nào là đầu vào không hợp lệ (kể từ khi tôi đã tuyên bố bản thân mình rằng đầu vào là một chuỗi hai dòng), do đó bạn có thể loại bỏ các xác nhận đối với trường hợp cạnh này :)
nicael

@feersum: vâng, nó hoạt động. Cảm ơn!
nimi

2

JavaScript (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}

Ít chơi gô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
}

Kiểm tra

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 byte

Chơi gôn

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

Ung dung:

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

Vĩ cầm


1

JavaScript, 211 byte

Tôi đang suy nghĩ về việc tạo một phiên bản hiển thị từng bước được phát sau nhau, được hiển thị trên một trang web.

(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}

Được sử dụng nhiều byte hơn tôi mong muốn khi thay thế xbằng *vì JS không thay đổi Strings. Đề xuất cải tiến được đánh giá cao, đặc biệt là với phần thay thế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.