Xác định giá trị nào biểu thị hướng nào trong đường dẫn


10

Chỉnh sửa quan trọng: Trước đó, có một giá trị không chính xác trong Ví dụ 1. Nó đã được sửa.

Bạn được cung cấp một mảng hai chiều trong đó mỗi ô chứa một trong bốn giá trị.

Ví dụ:

1 2 2 2 2 1        @ . .        X X V
1 3 1 4 1 4        e . @        I C V
2 3 1 3 4 2        H H @        X I V
1 4 4 2 1 3                     V C C
2 2 2 3 2 3                     X X X

Bốn giá trị đại diện cho mũi tên chỉ hướng (lên, xuống, trái và phải), mặc dù bạn không biết giá trị nào đại diện cho hướng nào.

Mũi tên định hướng tạo thành một đường dẫn không bị gián đoạn bao gồm mọi ô trong mảng, mặc dù bạn không biết điểm bắt đầu hoặc điểm kết thúc ở đâu.

Viết một số mã xác định hướng nào trong bốn giá trị đại diện và vị trí điểm bắt đầu và điểm kết thúc.

Giá trị trả về chấp nhận được cho một mảng chứa các giá trị A, B, C và D sẽ giống như:

{ up: A, down: C, left: D, right: B, start: [2, 0], end: [4, 2] }

Bởi vì bạn có thể đi qua con đường theo cả hai cách (từ đầu đến cuối và từ đầu đến cuối), sẽ luôn có nhiều hơn một giải pháp đúng và có thể có nhiều hơn hai. Giả sử rằng các đầu vào bạn nhận được (như trong các ví dụ trên) luôn có ít nhất một giải pháp đúng. Trong trường hợp có nhiều hơn một giải pháp đúng, trả về chỉ một trong những giải pháp đúng là đủ.

Mã ngắn nhất sẽ thắng. Tôi sẽ chọn người chiến thắng sau 7 ngày hoặc 24 giờ mà không cần gửi mới, tùy theo điều kiện nào đến trước.

Tôi đang bao gồm các giải pháp cho các ví dụ trên, nhưng tôi khuyến khích bạn chỉ kiểm tra chúng khi bạn đã viết mã:

Một:

{lên: 3, xuống: 1, trái: 4, phải: 2, bắt đầu: [0,0], kết thúc: [2,5]}

Hai:

{lên: '@', xuống: 'e', ​​trái: '.', phải: 'H', bắt đầu: [1,1], kết thúc: [0,0]}

Số ba:

{lên: 'I', xuống: 'V', trái: 'C', phải: 'X', bắt đầu: [0,2], kết thúc: [4.2]}


1
"Bạn có thể đi qua con đường theo cả hai chiều" - nếu các hướng là tuyệt đối, không tương đối, thì điều này không đúng. Là hướng tuyệt đối, hoặc tương đối? Ngoài ra, bắt đầu và kết thúc được biết là nằm ngoài mảng?
John Dvorak

@JanDvorak Điểm bắt đầu và điểm kết thúc là các ô trong mảng. Đối với các hướng, giả sử chúng luôn chỉ ra sự di chuyển vào một ô liền kề (bắc, nam, đông hoặc tây).
jawns317

Trong trường hợp đó, không thể đi ngược một con đường. Tôi không thể thấy bất kỳ sự đảm bảo nào sẽ luôn có nhiều hơn một giải pháp.
John Dvorak

1
Nếu chúng tôi "giả sử họ luôn chỉ ra sự di chuyển vào một ô liền kề", ví dụ thứ hai của bạn có còn hợp lệ không? Tôi có thể đang thiếu một cái gì đó nhưng có vẻ như @ không thể là một trong bốn hướng mà không đi ra khỏi giới hạn.
Nick Sarabyn

1
Ví dụ 1 không có giải pháp.
DavidC

Câu trả lời:


6

C #

EDIT: Đã sửa lỗi phân chia và định dạng. Và thêm lớp người trợ giúp.

Đây là mã đánh gôn, 807 ký tự

class M{public int c,x,y,u;}
void G(string[] z){
M K;int[]x={0,0,-1,1},y={-1,1,0,0},I={0,0,0,0};
string[]T={"Up","Down","Left","Right"};
int X,Y,R,n=0,H=z.Length,W=z[0].Length;W-=W/2;var D= string.Join(" ", z).Where(c=>c!=' ').Select(c=>new M(){c=c,x=n%W,y=n++/W}).ToList();n=0;var S=D.GroupBy(k=>k.c).ToDictionary(k=>k.Key,k =>n++);
for(;I[0]<4;I[0]++)for(I[1]=0;I[1]<4;I[1]++)for(I[2]=0;I[2]<4;I[2]++)for(I[3]=0;I[3]<4;I[3]++){
if ((1<<I[0]|1<<I[1]|1<<I[2]|1<<I[3])!=15)continue;
foreach (var Q in D){D.ForEach(p=>p.u=-1);R=1;K=Q;j:if((X=K.x+x[n=I[S[K.c]]])>=0&&X<W&&(Y=K.y+y[n])>=0&&Y<H&&(K=D[X+Y*W]).u<0){
K.u=1;if(++R==D.Count){Console.WriteLine("{4} Start({0}:{1}) End({2}:{3})",Q.x,Q.y,K.x,K.y,string.Join(", ",S.Select(k=>string.Format("{1}: '{0}'",(char)k.Key,T[I[k.Value]])).ToArray()));return;}goto j;}}}
}    

Kết quả cho ba trường hợp thử nghiệm:

Xuống: '1', Phải: '2', Lên: '3', Trái: '4' Bắt đầu (0: 0) Kết thúc (5: 2)
Lên: '@', Trái: '.', Xuống: ' e ', Phải:' H 'Bắt ​​đầu (1: 1) Kết thúc (0: 0)
Phải:' X ', Xuống:' V ', Lên:' I ', Trái:' C 'Bắt ​​đầu (0: 2) Kết thúc (2: 4)

Đây là mã thô không có "golf", gần 4.000 ký tự:

class Program
{
    static string[] input1 =  { "1 2 2 2 2 1",
               "1 3 4 4 1 4",       
               "2 3 1 3 4 2",
               "1 4 4 2 1 3",       
               "2 2 2 3 2 3"};

    static string[] input2 =  { "@ . .",
                                "e . @",       
                                "H H @",
               };

    static string[] input3 =  { "0 0 1",
                                "0 0 1",       
                                "3 2 2",
               };

    static void Main(string[] args)
    {
        Resolve(input1);
        Resolve(input2);
        Resolve(input3);
        Console.ReadLine();
    }


    class N { public int c; public int x, y, i, u; }

    static void Resolve(string[] input)
    {
        int[] ox = { -1, 1, 0, 0 }, oy = { 0, 0, -1, 1 }, I = { 0, 0, 0, 0 };
        string[] TXT = { "Left", "Right", "Up", "Down" };
        int X, Y, R, n = 0, H = input.Length, W = input[0].Length;
        W -= W / 2;
        N K = null;
        var data = string.Join(" ", input).Where(c => c != ' ').Select(c => new N() { c = c, x = (n % W), y = (n / W), i = n++, u = -1 }).ToList();
        n = 0;
       var S = data.GroupBy(k => k.c).ToDictionary(k => k.Key, k => n++);

        for (; I[0] < 4; I[0]++)
            for (I[1] = 0; I[1] < 4; I[1]++)
                for (I[2] = 0; I[2] < 4; I[2]++)
                    for (I[3] = 0; I[3] < 4; I[3]++)
                    {
                        if (((1 << I[0]) | (1 << I[1]) | (1 << I[2]) | (1 << I[3])) != 15) continue;
                        foreach(var Q in data)
                        {
                            data.ForEach(p => p.u = -1);
                            R = 0;
                            K = Q;
                            while (K != null)
                            {
                                n = I[S[K.c]];
                                X = K.x + ox[n];
                                Y = K.y + oy[n];
                                if (X >= 0 && X < W && Y >= 0 && Y < H)
                                {
                                    n = X + Y * W;
                                    if (data[n].u < 0)
                                    {
                                         data[n].u = K.i;
                                         K = data[n];
                                        R++;
                                        if (R == data.Count - 1)
                                        {
                                            Console.WriteLine();
                                            Console.WriteLine("Start({0}:{1}) End({2}:{3})", Q.x, Q.y, K.x, K.y);
                                            Console.WriteLine(string.Join(", ", S.Select(k => string.Format("'{0}': {1}", (char)k.Key, TXT[I[k.Value]])).ToArray()));
                                            Action<N> Write = null;
                                            Write = (k) =>
                                             {
                                                 if (k.u != -1)
                                                 {
                                                     Write(data[k.u]);
                                                 }
                                                 Console.Write(string.Format("({0}:{1}){2}", k.x, k.y, k == K ? "\n" : " => "));
                                             };

                                            Write(K);
                                            return;
                                        }
                                        continue;
                                    }
                                }
                                K = null;
                            }
                        }
                    }
        Console.WriteLine("Solution not found");
    }
 }
}

Đây là kết quả cho ba ví dụ:

Không tìm thấy giải pháp

Bắt đầu (1: 1) Kết thúc (0: 0) '@': Lên, '.': Trái, 'e': Xuống, 'H': Phải

(1: 1) => (0: 1) => (0: 2) => (1: 2) => (2: 2) => (2: 1) => (2: 0) => (2: 1) => (2: 0) => ( 1: 0) => (0: 0)

Bắt đầu (0: 0) Kết thúc (1: 1) '0': Phải, '1': Xuống, '3': Lên, '2': Trái

(0: 0) => (1: 0) => (2: 0) => (2: 1) => (2: 2) => (1: 2) => (0: 2) => ( 0: 1) => (1: 1)


Bạn có thể muốn chơi mã của mình, vì đây là một cuộc thi đánh gôn.
TimTech

Tôi đang làm điều đó :)
Blau

Được rồi, đừng vội vã :) Chỉ là một số người nhìn thấy một người dùng mới mà không có mã đánh gôn và có xu hướng downvote.
TimTech

2
Đây là lần đầu tiên của tôi ... nhưng tôi khuyên rằng chưa chơi gôn ... mặc dù tôi nghĩ rằng tôi sẽ không đánh bại mã mHRathica ... :)
Blau

Bất kỳ câu trả lời cho câu hỏi này đòi hỏi kỹ năng. +1
TimTech

5

Toán học 278

Không gian được thêm vào cho "sự rõ ràng"

k@l_ := (s = #~Join~-# &@{{1, 0}, {0, 1}};
         f@r_ := Flatten[MapIndexed[#2 -> #2 + (#1 /. r) &, l, {2}], 1];
         g     = Subgraph[#, t = Tuples@Range@Dimensions@l] & /@ 
                       Graph /@ f /@ (r = Thread[# -> s] & /@ Permutations[Union @@ l]);
        {t[[#]] & /@ Ordering[Tr /@ IncidenceMatrix@g[[#]]][[{1, -1}]], r[[#]]} & @@@ 
                                                                 Position[PathGraphQ /@ g, True])

Phiên & đầu ra:

 l = l1 = {{1, 2, 2, 2, 2, 1}, {1, 3, 1, 4, 1, 4}, {2, 3, 1, 3, 4, 2}, 
            {1, 4, 4, 2, 1, 3}, {2, 2, 2, 3, 2, 3}}; ;
 k@l1
 {{{{1, 1}, {3, 6}}, 
    {1 -> {1, 0}, 2 -> {0, 1}, 3 -> {-1, 0},  4 -> {0, -1}}}}

Đó là bắt đầu Vertex, End Vertex và các quy tắc chuyển đổi được liên kết với từng biểu tượng.

Đây là mã bổ sung để hiển thị biểu đồ định hướng:

sol = sg[[Position[PathGraphQ /@ sg, True][[1, 1]]]];
Framed@Graph[
  VertexList@sol,
  EdgeList@sol,
  VertexCoordinates -> VertexList@sol /. {x_, y_} :> {y, -x},
  VertexLabels -> MapThread[Rule, {VertexList@sol, Flatten@l}], 
  EdgeShapeFunction -> GraphElementData["FilledArcArrow", "ArrowSize" -> 0.03],
  ImagePadding -> 20]

Đồ họa toán học


2

Toán học (151)

L = {{1, 2, 2, 2, 2, 1}, {1, 3, 1, 4, 1, 4}, {2, 3, 1, 3, 4, 2}, 
   {1, 4, 4, 2, 1, 3}, {2, 2, 2, 3, 2, 3}};

PathGraphQ@#~If~Print@{TopologicalSort[#]〚{1,-2}〛,r}&@
Graph@Flatten@MapIndexed[#2->#2+(#/.r)&,L,{2}]~Do~{r,
Thread[Union@@L->#]&/@{-1,0,1}~Tuples~{4,2}}

Nó trả về điểm bắt đầu, điểm kết thúc và quy tắc chuyển đổi. Chỉ mục đầu tiên là hàng, thứ hai là cột

{{{1,1},{3,6}},{1->{1,0},2->{0,1},3->{-1,0},4->{0,-1}}}

Lưu ý rằng mã của tôi hoạt động ngay cả với {-1,0,1}~Tuples~{4,2}. Để tăng tốc, bạn có thể sử dụng Permutations@{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}thay thế.


0

APL (207)

Tôi không thể làm cho nó ngắn hơn Mathicala, vì tôi không thể suy luận về TopologicalSort và như vậy. Những người thông minh hơn được chào đón để siết chặt nó hơn nữa.

Chơi gôn

{u←∪,t←⍵⋄q r←↑(0≠+/¨r)/⊂[2]p,⍪r←{m←,⍵[u⍳t]⋄v r←⊂[1]⊃{{(↑⍴∪⍵),⊂(↑⍵)(↑⌽⍵)}n↑{3::⍬⋄i←↑⌽⍵⋄⍵,i+i⌷m}⍣n,⍵}¨⍳n←↑⍴,t⋄↑(v=n)/r}¨p←⊂[2]{1≥⍴⍵:⊃,↓⍵⋄⊃⍪/⍵,∘∇¨⍵∘~¨⍵}d←¯1 1,¯1 1×c←¯1↑⍴t⋄⊃('←→↑↓',¨u[q⍳d]),{1+(⌊⍵÷c)(c|⍵)}¨r-1}

Ung dung:

D←{⎕ML ⎕IO←3 1
    pmat←{1≥⍴⍵:⊃,↓⍵⋄⊃⍪/⍵,∘∇¨⍵∘~¨⍵}   ⍝ utility: permutations of the given vector
    u←∪,t←⍵                    ⍝ the 4 unique symbols in t←⍵
    n←↑⍴,t                     ⍝ number of elements in t
    d←¯1 1,¯1 1×c←¯1↑⍴t        ⍝ the four ∆i (+1, -1, +cols, -cols)
    p←⊂[2]pmat d               ⍝ list of permutations of the four ∆i
    r←{                        ⍝ for each permutation ⍵∊p (=interpretation of the 4 symbols)
        m←,⍵[u⍳t]              ⍝ (ravelled) t-shaped matrix of ∆i, using interpretation ⍵
        v r←⊂[1]⊃{             ⍝ for each starting index ⍵∊⍳n
            v←n↑{              ⍝ trail of visited cells after n steps 
                3::⍬           ⍝ if index out of bounds return empty list
                i←↑⌽⍵          ⍝ take last visited index
                ⍵,i+i⌷m        ⍝ follow the directions and add it to the list
            }⍣n,⍵
            (↑⍴∪v),⊂(↑v),↑⌽v   ⍝ number of unique cells, plus start/end indices
        }¨⍳n
        ↑(v=n)/r               ⍝ 1st couple of start/end indices to visit all cells (if any)
    }¨p
    q r←↑(0≠+/¨r)/⊂[2]p,⍪r     ⍝ select first perm. and start/end indices to visit all cells
    ⊃('←→↑↓',¨u[q⍳d]),{1+(⌊⍵÷c)(c|⍵)}¨r-1   ⍝ return char mapping and start/end indices
}

Ví dụ:

(Chỉ số bắt đầu từ 1)

     D⊃'122221' '131414' '231342' '144213' '222323'
 ←  4 
 →  2 
 ↑  3 
 ↓  1 
 1  1 
 3  6 
     D⊃'@..' 'e.@' 'HH@'
 ←  . 
 →  H 
 ↑  @ 
 ↓  e 
 2  2 
 1  1 
     D⊃'XXV' 'ICV' 'XIV' 'VCC' 'XXX'
 ←  C 
 →  X 
 ↑  I 
 ↓  V 
 3  1 
 5  3 
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.