Thoát khỏi mê cung!


20

Bạn bị mắc kẹt trong mê cung 5x5 này - mỗi phòng được dán nhãn từ 1 đến 25 và lối ra nằm trong phòng 1.

nhập mô tả hình ảnh ở đây

Bạn được cung cấp làm đầu vào phòng bạn hiện đang ở. Nhiệm vụ của bạn là xuất ra chuỗi di chuyển ngắn nhất (bắc, đông, nam, tây) cần thiết để đến phòng 1.

Mov có thể là đầu ra ở bất kỳ định dạng nào bạn muốn (danh sách, chuỗi, mảng ...) miễn là bạn sử dụng các ký tự n,w,e,s.

Dưới đây là tất cả các trường hợp thử nghiệm:

1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw

Câu trả lời ngắn nhất trong byte chiến thắng!


3
Làm thế nào linh hoạt là ghi nhãn phòng / đầu vào? Chúng ta có thể 0-index thay vì 1-index không? Chúng ta có thể lấy số phòng làm nhân vật (suy nghĩ, như trong cơ sở 36) không?
Chas Brown

2
@Therandomguy không, bạn cần xử lý mê cung cụ thể này.
Arnaud

6
Vì có thể, tôi nghĩ rằng tất cả các trường hợp có thể nên được đưa vào các trường hợp thử nghiệm.
Jonathan Frech

1
@UnrelatedString Câu hỏi này có 1 đầu vào và đầu ra đường dẫn khác nhau dựa trên đầu vào của nó. Tôi tin rằng yêu cầu này không phù hợp với thẻ phức tạp kolmogorov .
tsh

2
Ai đó cần cung cấp một câu trả lời trong Labyrinth .
Draco18

Câu trả lời:


20

Python 2 , 64 byte

def f(n):d=0x1211252b5375>>2*n-4&3;print"nwes"[d];f(n+d*3+d%2-5)

Hãy thử trực tuyến!

Một chức năng in một hướng trên mỗi dòng, kết thúc có lỗi.

Hằng số 0x1211252b5375mã hóa trong cơ sở 4 hướng dchúng ta đi từ mỗi số phòng là số 0 đến 3. Chữ số trích xuất >>2*n-4&3cũng được thiết kế để đưa ra lỗi dịch chuyển âm khi n=1kết thúc mã. Chúng tôi cập nhật số phòng nthông qua một giá trị bù được tính từ hướng dnhư d*3+d%2-5bản đồ:

d   d*3+d%2-5
0  -> -5
1  -> -1
2  ->  1
3  ->  5 

1
Tôi không chắc đây có phải là hợp lệ không, các chức năng phải được sử dụng lại và bạn cần bẫy lỗi ( try/ except) để có thể tiếp tục thực hiện sau khi gọi hàm này.
Erik the Outgolfer


6

05AB1E , 30 29 byte

-1 byte nhờ vào sự trùng hợp kỳ diệu với các số nguyên tố

[Ð#•θzƶ‰`Ó•4вsè<DˆØ·5-+}'‹™¯è

Hãy thử trực tuyến!

[                      }    # infinite loop:
 Ð                          #  triplicate the room number (initially, the input)
  #                         #  break if room number == 1
   •θzƶ‰`Ó•4в               #  compressed list 202232302231102210202010
             sè             #  use the room number to index into that list
               <            #  decrement
                Dˆ          #  add a copy to the global array
                  Ø         #  nth prime (-1 => 0, 0 => 2, 1 => 3, 2 => 5)
                   ·        #  double
                    5-      #  subtract 5
                      +     #  add that to the room number
'‹™                         # dictionary string "western"
   ¯                        # push the global array
    è                       # index (wraps around, so -1 => n, 0 => w, 1 => e, 2 => s)

1
Đầu ra này 1cho đầu vào1 , thay vì một chuỗi trống (sửa chữa dễ dàng sẽ là thêm một đầu õ?). Ngoài ra, câu trả lời tốt đẹp!
Kevin Cruijssen

1
@KevinCruijssen cảm ơn vì đã chỉ ra sai lầm đó! Tôi tìm thấy một sửa chữa byte đơn.
Grimmy

5

Ruby , 72 62 byte

f=->n{n<2?'':' en  sw'[x=4*18139004[n]+6*4267088[n]-5]+f[n+x]}

Hãy thử trực tuyến!

Làm sao?

Mẹo ở đây là sử dụng 2 hằng số để xây dựng bước tiếp theo cho mỗi ô, sau đó giải quyết đệ quy vấn đề.

Hai hằng số 18139004 và 4267088 là các chuỗi nhị phân đưa ra hướng di chuyển tiếp theo, bằng cách trích xuất một bit từ cả hai cho mỗi ô, chúng ta có thể nhận được:

"n" = 4*0+6*0-5 = -5
"w" = 4*1+6*0-5 = -1
"e" = 4*0+6*1-5 = +1
"s" = 4*1+6*1-5 = +5

Dễ dàng hơn thay đổi xung quanh và che giấu một số nhị phân lớn IMHO.

Khi chúng tôi nhận được hướng, chúng tôi trích xuất chữ cái tương ứng từ chuỗi "en sw":

  1   5
  |   |
" en  sw"
   |   |
  -5  -1

Và tiến hành đệ quy trên ô [n + x]



3

Perl 5 ( -n), 94 byte

-5 byte nhờ Grimy

@A=map/./g,__wwswsnwwseenwwenwnwnenwn;%H=(n,-5,s=>5,e,1,w,-1);$_+=$H{$,=$A[$_]},say$,until$_<2

TIO





1
Bạn có nghĩa là tôi nên đăng nó như một câu trả lời riêng biệt?
Grimmy

1
vâng bởi vì có vẻ như bạn đã làm hầu hết công việc, thật thú vị khi xem làm thế nào chúng ta luôn có thể tiết kiệm không gian
Nahuel Fouilleul



2

Than , 43 40 byte

NθW⊖θ«≔I§”)“⊞x⟧∧⎚⁵2”ιι§nwesι≧⁺⁻⁺﹪ι²×³ι⁵θ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Dựa trên câu trả lời của cả @ ChasBrown và @ xnor. Giải trình:

Nθ

Nhập phòng.

W⊖θ«

Đặt biến vòng lặp ithành một ít hơn số phòng và lặp lại trong khi nó khác không.

«≔I§”)“⊞x⟧∧⎚⁵2”ιι

Trích xuất hướng từ chuỗi nén 0113130113220112010102010. (Hàng đầu 0chỉ là một chữ số phụ.)

§nwesι

In hướng.

≧⁺⁻⁺﹪ι²×³ι⁵θ

Sử dụng công thức của @ xnor để tính số phòng mới.


2

Thạch , 30 29 byte

“þ&ƊĿñ÷°e’b6Ḥ_5Ż⁸+ị¥ƬI‘ị“®ȯẹ»

Hãy thử trực tuyến!

Một liên kết đơn âm lấy ô bắt đầu và trả về một chuỗi có chỉ đường.

Tôi thích thực tế là từ điển của Jelly có một từ như 'Kennesaw' (một thành phố phía tây bắc Atlanta, Georgia), được sử dụng ở đây vì lập chỉ mục vào đó với sự [5, 1, -5, -1] + 1cho đi nesw!

Giải trình

“þ...e’                    | Base-250 integer 1962789844189344852  
       b6                  | Convert to base 6 (2, 2, 5, 2, 5, 0, 2, 2, 5, 3, 3, 0, 2, 2, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0)
         Ḥ                 | Double
          _5               | Subtract 5
            Ż              | Prepend 0
             ⁸  ¥Ƭ         | Using this as the right argument and the original link argument as the left argument, loop the following as a dyad until there is no change, collecting up results
              +            | - Add the left argument to:
               ị           |   - The left argument indexed into the right argument
                  I        | Differences between consecutive numbers
                   ‘       | Increment by 1
                    ị“®ȯẹ» | Index into "Kennesaw"

2

PHP , 110 byte

Một giải pháp không phải là một câu trả lời tuyệt vời của Chas Brown hay câu trả lời tuyệt vời của xnor . Tôi biết điều này lâu hơn nhưng tôi muốn có một giải pháp khác!

for($n=$argn;$n>1;$n=ord($s[$n*2+1])%30)echo($s='0000w<w sEw"s)n w%w&s-e*e+n&w+w,e/n*w/n,w1n.e5n0w5n2')[$n*2];

Hãy thử trực tuyến!

Tôi đã tạo một chuỗi ánh xạ có 2 ký tự cho mỗi ô trong bảng. Ký tự đầu tiên cho mỗi ô là một di chuyển (n / e / s / w) hoặc 0mã ASCII mod 30 của ký tự thứ hai sẽ trả về một số ô khác mà chúng ta nên theo dõi di chuyển của nó trong chế độ đệ quy cho đến khi chúng ta thoát khỏi ô ( cell < 2).

Ví dụ cho đầu vào của 8:

  • 2 ký tự cho ô8 là:w%
  • Nó có nghĩa là in w và tiếp tục với các di chuyển cho ô của%
  • Mã ASCII của % là 37 mà mod 30 sẽ là 7, vì vậy ô tiếp theo sẽ là 7.
  • 2 ký tự cho ô 7 là: n (ký tự cuối cùng là dấu cách, mã ASCII = 32)
  • Nó có nghĩa là in n và tiếp tục di chuyển cho ô 32 mod 30, đó là2 .
  • 2 ký tự cho ô 2 là:w< (ký tự mã ASCII cuối cùng = 60)
  • Nó có nghĩa là in w và tiếp tục di chuyển cho ô 60 mod 30 0.
  • Nếu số lượng tế bào ít hơn 2 , vòng lặp dừng lại!
  • Kết quả in cuối cùng: wnw

PHP , 75 byte

Phiên bản này được viết bởi Grimy , nó ngắn hơn 35 byte so với câu trả lời ban đầu của tôi vì anh ấy / cô ấy thông minh hơn! Nhận xét của Grimy: "4 * 25 <256, vì vậy bạn chỉ cần 1 byte cho mỗi ô chứ không phải 2"

for($n=$argn;$n=ord("0\0~f;6o4R:s%ql&rup*@^tIDbx"[$n%25]);)echo news[$n%4];

Hãy thử trực tuyến!


PHP , 71 byte

Cổng câu trả lời này của Arnauld là cổng của câu trả lời của xnor , nhưng là một vòng lặp thay vì hàm đệ quy, vì nó hóa ra ngắn hơn trong PHP.

for($n=$argn;--$n;$n+=$d*3+$d%2-4)echo nwes[$d=79459389361621/4**$n&3];

Hãy thử trực tuyến!


2
4 * 25 <256, vì vậy bạn chỉ cần 1 byte cho mỗi ô chứ không phải 2: Hãy thử trực tuyến!
Grimmy

1
@Grimy, tuyệt vời, tôi nghĩ bạn phải đăng nó như một câu trả lời riêng biệt, nó là đủ khác nhau.
Đêm 2

1
Tôi sẽ không làm điều đó, vì vậy bạn chọn có nên đưa nó vào câu trả lời của bạn hay để nó như một bình luận.
Grimmy

1
@Grimy, đã thêm phiên bản của bạn với tên của bạn. Dù sao đi nữa cũng xin cám ơn.
Đêm2

2

C (tiếng kêu) , 81 byte

v;f(p){p-1&&putchar(v="00wwswsnwwseenwwenwnwnenwn"[p])+f(p+=v%5?6-v%8:v%2?5:-5);}

Hãy thử trực tuyến!

Cảm ơn @ Tommylee2k đề xuất -8! + cuộc gọi đệ quy

C (tiếng kêu) , 90 byte

v;f(p){for(char*l="00wwswsnwwseenwwenwnwnenwn";p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v=l[p]);}

Hãy thử trực tuyến!

Tương tự như tất cả các giải pháp không nén.


1
có thể rút ngắn:v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
Tommylee2k

1

05AB1E , 45 43 byte

õ?[Ð#.•DUo¢ê`Ω÷‰₂¡)R€ûK•¦sè©?Ž₁9₂в6-'€Ã®kè+

Cổng câu trả lời Python 2 của @ChasBrown .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

õ?               # Output an empty string
                 # (to overwrite the implicit output if the input is 1)
[                # Start an infinite loop:
 Ð               #  Triplicate the top of the stack
                 #  (which is the (implicit) input in the first iteration)
  #              #  If it's exactly 1: stop the infinite loop
  .•DUo¢ê`Ω÷‰₂¡)R€ûK
                 #  Push compressed string "a  wwswsnwwseenwwenwnwnenwn"
   ¦             #  Remove the first character
    sè           #  Swap to get the number, and use it to index into the string
      ©          #  Store it in variable `®` (without popping)
       ?         #  Print it without trailing newline
  Ž₁9            #  Push compressed integer 22449
     ₂в          #  Convert to base-26 as list: [1,7,5,11]
       6-        #  Subtract 6 from each: [-5,1,-1,5]
         '€Ã    '#  Push dictionary string "news"
            ®k   #  Get the index in this string of character `®`
              è  #  And use that to index into the integer-list
               + #  And add it to the originally triplicated integer

Xem 05AB1E mẹo này của tôi (tất cả bốn phần) để hiểu tại sao .•DUo¢ê`Ω÷‰₂¡)R€ûK•"a wwswsnwwseenwwenwnwnenwn"; Ž₁922449; Ž₁9₂в[1,7,5,11]; và '€Ã"news".


1
Đó là chuỗi từ điển thuận tiện phải có tin tốt!
Neil

@Neil Chắc chắn. :) Mặc dù rõ ràng chuỗi từ điển westernlà tốt hơn. ; p
Kevin Cruijssen

1

Bash , 120 byte

S=__wwswsnwwseenwwenwnwnenwn
N=n-5w-1s05e01
for((i=$1;$i>1;i+=$j)){ d=${S:$i:1};j=${N:`expr index $N $d`:2};printf $d; }

Hãy thử trực tuyến!

Tôi đã chơi một lúc với việc cố gắng gói bit thành chuỗi, nhưng việc giải mã sẽ đòi hỏi nhiều ký tự hơn số được lưu.

Làm thế nào nó hoạt động:

S=__wwswsnwwseenwwenwnwnenwn

Chuỗi $ S giữ một ký tự đơn (n, w, s, e) cho mỗi phòng cho biết hướng đi nào để di chuyển một phòng về phía lối ra, bỏ qua các phòng 0 và 1.

N=n-5w-1s05e01

Chuỗi $ N có delta để thêm / trừ từ số phòng hiện tại cho mỗi lần thay đổi hướng (n: -5, w: -1, s: +5, e: +1)

for((i=$1;$i>1;i+=$j)){ d=${S:$i:1};j=${N:`expr index $N $d`:2};printf $d; }

Bắt đầu với $ i bằng với số phòng được đưa ra trên dòng lệnh ($ 1). Gán ký tự tại chỉ mục $ i trong chuỗi $ S thành $ d. Lấy giá trị delta từ $ N cho hướng đi đến phòng tiếp theo, gán giá trị đó cho $ j.

In hướng tiếp theo để lấy $ d.

Thêm / trừ đồng bằng trong $ j đến / từ $ i.

Vòng lặp cho đến khi chúng tôi rời phòng số 2 (trong khi $ i> 1).



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.