Xây dựng một trình tạo câu đố băng + người giải


13

Trong Twitch Plays Pokémon , một trong những chướng ngại vật khó chịu nhất mà người ta có thể gặp phải là một câu đố trên băng, nơi bạn phải di chuyển từ nơi này sang nơi khác bằng cách trượt tất cả các hướng theo một hướng cho đến khi bạn đâm vào tường hoặc tảng đá.

Nhiệm vụ của bạn là xây dựng một chương trình sẽ tạo ra một câu đố băng khó ngẫu nhiên.

Chương trình của bạn sẽ chấp nhận ba số, M, N, và P, như là đầu vào (với 10 <= M <= 30, 15 <= N <= 400 <= P < 65536):

12 18

và sẽ xuất ra:

  • Một Mbởi Nlưới bao gồm .O, đại diện cho băng và một tảng đá tương ứng.
  • Một điểm đánh dấu vị trí đại diện cho nơi câu đố được nhập từ. Vị trí đánh dấu này bao gồm thư L, R, T, hay B, đại diện cho trái, phải, trên và dưới, tiếp theo là một số đại diện các vị trí (từ trái hoặc trên cùng) về phía đó để được nhập từ.
  • Một điểm đánh dấu vị trí tương tự đại diện cho nơi câu đố được thoát ra.
  • Các giải pháp ngắn nhất để các câu đố, bao gồm một chuỗi các L, R, U, và Dtương ứng.

Ví dụ đầu ra:

..O...O...........
............O.....
..O...............
.......O..........
..................
...........O......
O..O...........O..
..........O.......
..O..........O....
........O.........
O....O.........O..
............O.....
R 4
B 5
LDLDRULD
(Note that this output is actually invalid because it is not actually long enough.)

Đối với một đầu vào MN, giải pháp cho câu đố phải có ít nhất min(M, N)các bước và di chuyển ít nhất 2 (M + N)tổng không gian. (Để tham khảo, câu đố trên di chuyển tổng cộng 12 bước, di chuyển 69 khoảng trắng.) Trình tạo câu đố của bạn phải tạo ra một câu đố khác nhau Mbằng Nmột đường dẫn giải khác nhau (nghĩa là một chuỗi các bước khác nhau cho mỗi giải pháp) cho mỗi hạt giống P.

  • Lưu ý rằng yêu cầu của một đường dẫn giải pháp khác là tránh các giải pháp cố gắng tạo ra các đường dẫn đá một cách có hệ thống, như giải pháp của Claudiu ở đây . Nếu có hai hoặc ba cặp giải pháp giống hệt nhau do các quirks ngẫu nhiên, điều đó sẽ ổn, miễn là chương trình không cố tình tạo ra các câu đố có hệ thống với cùng một chuỗi di chuyển.

Mã ngắn nhất để làm chiến thắng ở trên.


2
Tôi không thể hiểu mục tiêu: "bạn phải đi từ nơi này sang nơi khác bằng cách trượt tất cả các hướng theo một hướng cho đến khi bạn va vào tường hoặc một tảng đá." Nó là tốt để nhấn tường hoặc tảng đá? Bạn định đi đâu từ đầu? Nếu bạn nhấn một tảng đá thì trò chơi kết thúc? Điều gì xảy ra khi bạn va vào tường? Có phải chỉ là tôi hoặc là hướng dẫn không rõ ràng?
DavidC

3
Ôi, những kỷ niệm xưa về Pokémon Gold và Silver ở đây. Tìm lối ra, lấy HM07 và đến Blackthorn City.
Victor Stafusa

3
Điều này làm tôi nhớ đến các cấp độ băng trong Thử thách của Chip .
luser droog

1
Tại sao không sử dụng ><(hoặc bất kỳ ký tự nào) cho mục nhập và thoát? Các câu đố sẽ dễ đọc hơn.
AL

1
Trên thực tế, kết quả đầu ra mẫu của bạn không hợp lệ - con đường ngắn nhất LDLDRULDchỉ dài 8 bước
Claudiu

Câu trả lời:


5

Python, 672 548 ký tự, câu đố thú vị hơn

Mặc dù tuân thủ nghiêm ngặt các quy tắc, chương trình Python khác của tôi đánh bại cái này, tôi quyết định viết một cái sẽ tạo ra nhiều câu đố thú vị hơn. Đây là:

R=range;import random as J;X=J.randint
x=(0,1,-1,0);y=x[2:]+x
g=lambda r,c:(0<=r<H)+(0<=c<W)>1and f[r][c]or x[(r,c)in(A,E)]
l=lambda r,c:g(r+y[d],c+x[d])<1and(r,c)or l(r+y[d],c+x[d])
H,W,P=input();J.seed(P)
while 1:
 A=(-1,X(0,W));E=(H,X(0,W));f=[[X(0,7)for _ in R(W)]for _ in R(H)]
 q=[(A,'')];n=z={}
 while q and n!=E:
    n,O=q.pop()
    for d in R(4):
     N=l(*n)
     if g(n[0]+y[d],n[1]+x[d])and N not in z:q[:0]=[(N,O+"URLD"[d])];z[N]=1
 if(n==E)*len(O)>min(H,W):print"\n".join(''.join('O.'[c>0]for c in T)for T in f),"\nT",A[1],"\nB",E[1],"\n",O;break

Cấp độ thụt là không gian, tab, tab + không gian.

Các mẫu :

$ echo [10,15,0] | python ice2.py
.....OO........
...............
...O....O.OO..O
...........O...
..O....O.......
.......O....O..
....O..........
.............O.
..............O
...............
T 1
B 10
DLURDRURULDRD

Nó sử dụng Pnhư một hạt giống, vì vậy mỗi loại Psẽ tạo ra cùng một câu đố và mỗi khác nhau Pcó khả năng khác nhau rất nhiều:

$ echo [10,15,1] | python ice2.py
.OOO.O.........
...O......O.O.O
.......O.......
..O..........OO
.....O.........
.............O.
.O.............
.O............O
O....O.........
......O........
T 14
B 8
DLDRDLURULD

Nó hoạt động hợp lý nhanh đến kích cỡ M=25,N=40nhưng quá khứ mà nó thực sự chậm. Về mặt lý thuyết nó sẽ hoạt động M=30, N=40nếu bạn để nó chạy đủ lâu. Tôi đã viết thủ công theo dấu vết ở đây vì khó theo dõi - chương trình chỉ xuất ra câu đố.

$ echo [25,40,0] | python ice2.py
                   *
...................dO....urrrO..O..O....
....O.....O........dO....u..dO..........
..........O.....O..d....Ou.Odrrrrrrrrrrr
...........O.......d.O..Ou..O.....OOllld
.O....O.OO.........drrrrrrO....Olllud..O
O......O...O.O.....O............dO.ud...
O........OO..........O.........Od..ud..O
.........O......................d..ud...
....O.....O.O....O.....O........d..ud.O.
.....O..O...................O...d..udO..
.........O.........O..O.........d..ud...
.......O.O...O..O.OO....O...OOlldOOld...
........Olllllllllu....OO.OO..dOO...O...
.O.O....Od........u......O....d..O...O..
..O....O.d........u..O........d..O..O...
....O....d..O.....uO.....O....d.........
.........d........u...........d.........
.........d....O...u.O..O.....Od.O.......
........Od...O....u...........d.........
.O.....OuxrrrrO...u...OOOO..O.d.........
........udO..dO.O.u...........d.........
O..O.O..ud...d..urrO..........d.O...O...
........ud...d..u.O.O........Od..O...O..
..OO....ud..Od..u......OllllludO.....O..
..O....OldO..dOOlllllllld...Old...O..O..
             *
T 19
B 13
DRURDRDLDLULDLDLULDLURULDLURD

Giải thích :

Các vòng lặp chương trình, tạo ra một vị trí bắt đầu ngẫu nhiên ở trên cùng, một vị trí kết thúc ngẫu nhiên ở phía dưới và một lưới ngẫu nhiên có 12.5%cơ hội cho một tảng đá trên bất kỳ vị trí nào. Sau đó, nó giải quyết câu đố với lần tìm kiếm đầu tiên và nếu giải pháp tồn tại và lớn hơn min(H,W), nó sẽ in và thoát ra.


4

Java - 2632

Trong khi tôi ngưỡng mộ sự thuần khiết về kỹ thuật trong câu trả lời của Claudiu , tôi quyết định thử thực hiện những câu đố khó hơn một chút ;)

Các bước cơ bản (khá đơn giản):

Randomize entry location
Step forward
For min(m,n)-1 steps:
    Rotate left or right
    Slide until I hit something or go a random distance
    Place a rock in front of stopping location
If I can slide straight to any wall:
    Slide to exit
Else
    Create another step and try again

If at any step I get trapped, start over
If BFS finds shorter path, start over

Tôi cũng đánh dấu từng vị trí là 'nogo' khi tôi trượt. Nếu tôi kết thúc tại một điểm nogo (hoặc ngay trước một điểm có nghĩa là một tảng đá sẽ đến đó), đó là một bước không hợp lệ.

Vì vậy, về cơ bản, ý tưởng là tạo ngẫu nhiên rất nhiều bản đồ và giữ bản đồ đầu tiên hợp lệ. Tôi dự định làm cho nó thông minh hơn (quay lui, v.v.), nhưng nó hoạt động tốt ngay bây giờ. Nó cũng có thể cắt giảm một số mã dự phòng, chúng ta sẽ thấy.

Như vậy, nó tạo ra các bản đồ nhỏ (15x10) gần như ngay lập tức, bản đồ trung bình (30x20) trong vài giây và lớn (40x30) trong một khoảng thời gian ngẫu nhiên trong khoảng từ 20 giây đến 20 phút, tùy thuộc vào hạt giống. Nó kiểm tra giữa 300k-500k bản đồ / giây trên máy của tôi, tùy thuộc vào kích thước.

Lưu ý bên lề: Đôi khi các bản đồ không quá khó, đơn giản là vì chỉ có nhiều tảng đá như các bước và trừ khi bước đó đưa bạn đến một bức tường, hầu hết chỉ có một lựa chọn nếu bạn muốn chạm vào một tảng đá thực sự. Tôi sẽ khắc phục điều đó sau bằng cách đặt đá "ngẫu nhiên" vào các điểm an toàn sau khi tất cả các bước được rút ra. Vì các điểm nogo đã được đánh dấu, nên điều đó khá đơn giản. Bây giờ, chỉ cần thưởng thức các ví dụ sau:

Đầu ra hiển thị kích thước / hạt giống khác nhau:

$ java I 30 20 6851              $ java I 15 10 1     $ java I 15 10 65513  

............................O.      .......O.......     ....O..........     
..............................      ...............     ...............     
..............................      .........O.....     .........O.....     
..........O......O............      .............O.     ..............O     
...............O...........O..      ...............     ...............     
..............................      .......O.......     .....O.O.......     
..............................      O..............     ...............     
........................O.....      ...............     ..........O....     
..............................      ...............     O..............     
...O.......................O..      ......O........     ...............     
O...............O.OO..........          
..............O..........O....          
...........O..................      T 14                R 6         
....O.........................      T 7                 T 14            
..............................      DLDLULURU           LULDLDRURU
..............................
..............................
.................O............
.O............................
..............................


B 28
R 9
ULURDLDLDRURDLDRURUR

Kích thước tối đa 40x30:

$ java I 40 30 2

........................................
........................................
........................................
........................................
................O.......................
..........O.............................
........................................
.......O................................
.....................O..........O.......
......................O.................
.................................O......
......................................O.
........................................
........................................
..............................O.........
...........O............................
........................................
.......................................O
.........O...................O..........
....................O...................
...............................O........
............O..O......................O.
......O...........O.....................
..................O....O................
..................................O.....
........................................
..............................O.........
.....................................O..
...........O............................
...................O....................

B 19
B 11
URURDLULULDRDRDLULDLDLULURDLD

Chơi gôn

import java.util.*;import java.awt.*;class I{int m,n,p,g,a[][],b[][];Random r;Point s,e,c;ArrayList<Integer>z;void Q(String q,int l){if(l>0)System.out.println(q);else System.out.print(q);}void G(String[]y){m=Integer.valueOf(y[0]);n=Integer.valueOf(y[1]);p=Integer.valueOf(y[2]);r=new Random(p);Q("",1);int o=0,i,j,u=0;char t,f[]={85,76,68,82};while(o<3){if(++u%20000==0)Q("\r#"+u,0);a=new int[m+2][n+2];b=new int[m+2][n+2];for(i=0;i<m+2;i++)for(j=0;j<n+2;j++)if(i==0||i==m+1||j==0||j==n+1)a[i][j]=2;s=new Point();int e=r.nextInt(m*2+n*2);if(e<m*2){s.x=e%m+1;s.y=e<m?0:n+1;}else{s.y=(e-m*2)%n+1;s.x=(e-m*2)<n?0:m+1;}if(s.x<1)g=3;else if(s.x>m)g=1;else if(s.y<1)g=2;else if(s.y>n)g=0;a[s.x][s.y]=0;c=new Point(s);z=new ArrayList<Integer>();z.add(g);for(i=0;i++<Math.min(m,n)-1;)if(N()<1&&N()<1)break;o=((z.size()>=Math.min(m,n)-1)?1:0)+F()+((V()==z.size())?1:0);}Q("\r",0);for(j=1;j<n+1;j++){for(i=1;i<m+1;i++)Q(String.valueOf(a[i][j]>0?'O':'.'),0);Q("",1);}Q("\n\n",0);if(s.x<1||s.x>m){t=s.x<1?'L':'R';u=s.y;}else{t=s.y<1?'T':'B';u=s.x;}Q(t+" "+u,1);if(e.x<1||e.x>m){t=e.x<1?'L':'R';u=e.y;}else{t=e.y<1?'T':'B';u=e.x;}Q(t+" "+u,1);for(i=0;i<z.size();)Q(String.valueOf(f[z.get(i++)]),0);Q("",1);}public static void main(String[]a){new I().G(a);}int F(){int c=0;while(C()<1&&c++<10)if(N()<1)return 0;return e==null?0:1;}int C(){int d=g<2?-1:1;if(g%2<1){int y=c.y;while(y>0&&y<n+1){y+=d;if(a[c.x][y]==1)return 0;}e=new Point(c.x,y);}else{int x=c.x;while(x>0&&x<m+1){x+=d;if(a[x][c.y]==1)return 0;}e=new Point(x,c.y);}a[e.x][e.y]=0;return 1;}int V(){if((s.x-e.x)+(s.y-e.y)<2)return 0;Queue<Point>q=new ArrayDeque<Point>();Queue<Integer>d=new ArrayDeque<Integer>();a[s.x][s.y]=-2;q.add(s);d.add(0);while(q.size()>0){Point t=q.poll();int h=d.poll(),i=0;if(t.equals(e))return h;for(;i<4;i++){Point n=S(a,t,i<2?0:1,i%2<1?-1:1,99,1);if(a[n.x][n.y]==-2)continue;a[n.x][n.y]=-2;q.add(n);d.add(h+1);}}return 0;}int N(){Point q;int d=g<2?-1:1,x,y;System.arraycopy(a,0,b,0,a.length);q=S(b,c,g,d,r.nextInt((g%2<1?n:m)/2)+2,0);if(q.x<1||q.y<1||q.x>m||q.y>n||q.equals(c)||b[q.x][q.y]!=0)return 0;x=q.x;y=q.y;if(g%2<1)y+=d;else x+=d;if(b[x][y]<0)return 0;b[q.x][q.y]=-1;b[x][y]=1;int f=r.nextInt(2)<1?-1:1;g=g%2<1?(f<0?1:3):(g=f<0?0:2);c=q;System.arraycopy(b,0,a,0,a.length);z.add(g);return 1;}Point S(int[][]u,Point f,int w,int d,int q,int s){int i=1,x=f.x,y=f.y;for(;i<=q;i++){if(w%2<1)y=f.y+i*d;else x=f.x+i*d;if(e!=null&&e.x==x&&e.y==y)return e;if(y<0||y>n+1||x<0||x>m+1)return f;if(s<1&&u[x][y]<1)u[x][y]=-1;if(u[x][y]>0){if(w%2<1)y-=d;else x-=d;return new Point(x,y);}}if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);}}

Với ngắt dòng:

import java.util.*;
import java.awt.*;

class I{
    int m,n,p,g,a[][],b[][];
    Random r;
    Point s,e,c;
    ArrayList<Integer>z;

    void Q(String q,int l){if(l>0)System.out.println(q);else System.out.print(q);}

    void G(String[]y){
        m=Integer.valueOf(y[0]);
        n=Integer.valueOf(y[1]);
        p=Integer.valueOf(y[2]);
        r=new Random(p);
        Q("",1);

        int o=0,i,j,u=0;
        char t,f[]={85,76,68,82};
        while(o<3){
            if(++u%20000==0)
                Q("\r#"+u,0);

            a=new int[m+2][n+2];
            b=new int[m+2][n+2];
            for(i=0;i<m+2;i++)
                for(j=0;j<n+2;j++)
                    if(i==0||i==m+1||j==0||j==n+1)
                        a[i][j]=2;

            s=new Point(); 
            int e=r.nextInt(m*2+n*2);
            if(e<m*2){
                s.x=e%m+1;
                s.y=e<m?0:n+1;
            }else{
                s.y=(e-m*2)%n+1;
                s.x=(e-m*2)<n?0:m+1;
            }
            if(s.x<1)g=3;
            else if(s.x>m)g=1;
            else if(s.y<1)g=2;
            else if(s.y>n)g=0;

            a[s.x][s.y]=0;
            c=new Point(s);
            z=new ArrayList<Integer>();
            z.add(g);

            for(i=0;i++<Math.min(m,n)-1;)
                if(N()<1&&N()<1)
                        break;
            o=((z.size()>=Math.min(m,n)-1)?1:0)+F()+((V()==z.size())?1:0);
        }

        Q("\r",0);
        for(j=1;j<n+1;j++){
            for(i=1;i<m+1;i++)
                Q(String.valueOf(a[i][j]>0?'O':'.'),0);
            Q("",1);
        }
        Q("\n\n",0);
        if(s.x<1||s.x>m){
            t=s.x<1?'L':'R';
            u=s.y;
        }else{
            t=s.y<1?'T':'B';
            u=s.x;
        }
        Q(t+" "+u,1);
        if(e.x<1||e.x>m){
            t=e.x<1?'L':'R';
            u=e.y;
        } else {
            t=e.y<1?'T':'B';
            u=e.x;
        }
        Q(t+" "+u,1);
        for(i=0;i<z.size();)
            Q(String.valueOf(f[z.get(i++)]),0);
        Q("",1);
    }

    public static void main(String[]a){
        new I().G(a);
    }

    int F(){
        int c=0;
        while(C()<1&&c++<10)
            if(N()<1)
                return 0;
        return e==null?0:1;
    }

    int C(){
        int d=g<2?-1:1;
        if(g%2<1){
            int y=c.y;
            while(y>0&&y<n+1){
                y+=d;
                if(a[c.x][y]==1)
                    return 0;
            }
            e=new Point(c.x,y);
        }else{
            int x=c.x;
            while(x>0&&x<m+1){
                x+=d;
                if(a[x][c.y]==1)
                    return 0;
            }
            e=new Point(x,c.y);
        }
        a[e.x][e.y]=0;
        return 1;
    }


    int V(){
        if((s.x-e.x)+(s.y-e.y)<2)
            return 0;
        Queue<Point>q=new ArrayDeque<Point>();
        Queue<Integer>d=new ArrayDeque<Integer>();
        a[s.x][s.y]=-2;

        q.add(s);
        d.add(0);
        while(q.size()>0){
            Point t=q.poll();
            int h=d.poll(),i=0;
            if(t.equals(e))
                return h;
            for(;i<4;i++){
                Point n=S(a,t,i<2?0:1,i%2<1?-1:1,99,1);
                if(a[n.x][n.y]==-2)
                    continue;
                a[n.x][n.y]=-2;
                q.add(n);d.add(h+1);
            }
        }
        return 0;
    }


    int N(){
        Point q;
        int d=g<2?-1:1,x,y;
        System.arraycopy(a,0,b,0,a.length);
        q=S(b,c,g,d,r.nextInt((g%2<1?n:m)/2)+2,0);      
        if(q.x<1||q.y<1||q.x>m||q.y>n||q.equals(c)||b[q.x][q.y]!=0)
            return 0;
        x=q.x;
        y=q.y;
        if(g%2<1)
            y+=d;
        else
            x+=d;
        if(b[x][y]<0)
            return 0;
        b[q.x][q.y]=-1;
        b[x][y]=1;
        int f=r.nextInt(2)<1?-1:1;          
        g=g%2<1?(f<0?1:3):(g=f<0?0:2);
        c=q;
        System.arraycopy(b,0,a,0,a.length);
        z.add(g);
        return 1;
    }

    Point S(int[][]u,Point f,int w,int d,int q,int s){
        int i=1,x=f.x,y=f.y;
        for(;i<=q;i++){
            if(w%2<1)
                y=f.y+i*d;
            else
                x=f.x+i*d;
            if(e!=null&&e.x==x&&e.y==y)
                return e;
            if(y<0||y>n+1||x<0||x>m+1)
                return f;
            if(s<1&&u[x][y]<1)
                u[x][y]=-1;
            if(u[x][y]>0){
                if(w%2<1)
                    y-=d;
                else
                    x-=d;
                return new Point(x,y);
            }
        }
        if(w%2<1)
            return new Point(f.x,f.y+i*d);
        else
            return new Point(f.x+i*d,f.y);              
    }
}

Không while(o<3){...;o=...;}thể for(;o<3;o=...){...;}, tiết kiệm một byte?
Jonathan Frech

if(w%2<1)return new Point(f.x,f.y+i*d);else return new Point(f.x+i*d,f.y);-> return new Point(f.x+(w%2<1?0:i*d),f.y+(w%2<1?f.y:0));.
Jonathan Frech

3

Con trăn, 235 206 185 176 ký tự

H,W,P=input()
t=''
for x in range(16):t+=".O"[(P>>x)%2]
for n in[t[1:],t[0],"O","...O"]+["."]*(H-5)+[".O.."]:print(n*W)[:W]
print"B 1\nR",(H,3)[-W%4/2],"\n",("URDR"*W)[:W+W%2]

Cách sử dụng :

Đầu vào là thông qua stdin của mẫu [M, N, P].

$ echo [14, 17, 2] | python ice.py
O..............O.
.................
OOOOOOOOOOOOOOOOO
...O...O...O...O.
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...O...O...O...
B 1
R 3
URDRURDRURDRURDRUR

Bạn nói rằng các bản đồ phải khác nhau đối với mỗi hạt giống P... và chúng là:

$ echo [14, 17, 233] | python ice.py
..O.OOO..........
OOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOO
...O...O...O...O.
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...O...O...O...
B 1
R 3
URDRURDRURDRURDRUR
$ echo [14, 17, 65133] | python ice.py
.OO.OO..OOOOOOO.O
OOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOO
...O...O...O...O.
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...O...O...O...
B 1
R 3
URDRURDRURDRURDRUR

Và một ví dụ với kích thước khác nhau:

$ echo [10, 15, 65133] | python ice.py
.OO.OO..OOOOOOO
OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOO
...O...O...O...
...............
...............
...............
...............
...............
.O...O...O...O.
B 1
R 10
URDRURDRURDRURDR

Đáp ứng tất cả các tiêu chí khách quan được cung cấp:

  • Mỗi người Pdẫn đến một câu đố khác nhau
  • Chỉ có một giải pháp, do đó, nó là ngắn nhất
  • Giải pháp thực N + N%2hiện các bước, ít nhất làN
  • Giải pháp luôn chiếm nhiều hơn 2 (M + N)tổng dung lượng

Giải thích :

Mỗi hàng được xây dựng bằng cách lặp lại một Wthời gian phần tử chuỗi nhất định và giới hạn độ dài W(tôi sử dụng HWthay vì MN).

Hai hàng đầu tiên phụ thuộc vào Pđể làm cho mỗi câu đố độc đáo. Về cơ bản, lưu ý Pphù hợp với số nguyên không dấu 16 bit. Tôi chuyển đổi Pthành nhị phân, sử dụng .cho 0 và Ocho 1:

t=''
for x in range(16):t+=".O"[(P>>x)%2]

Phần tử hàng đầu tiên là 15 bit cuối cùng t[1:], trong khi phần tử hàng thứ hai là bit thứ nhất , t[0]. Tôi không thể đặt tất cả trên một hàng vì chiều rộng tối thiểu là 15, sẽ không vừa với tất cả 16 bit nếu P> 32767. Do đó, hai hàng đầu tiên đại diện duy nhất cho mỗi giá trị có thể củaP .

Hàng thứ ba là một bức tường đầy đủ để giá trị của Pkhông ảnh hưởng đến giải pháp.

Sau đó làm theo các yếu tố mê cung thực tế. Dòng này in tất cả chúng, lặp lại chúng lên đến nắp. Kết quả là như bạn thấy ở trên:

for n in[t[1:],t[0],"O","O..."]+["."]*(H-5)+["..O."]:print(n*W)[:W]

Phần còn lại chỉ là tìm ra cách giải quyết mê cung được tạo ra một cách linh hoạt. Điều này chỉ phụ thuộc vào chiều rộng của mê cung. Tôi lưu ý rằng các giải pháp, cho một chiều rộng nhất định, là:

  W  | solution 
-----+---------
  1  | UR
  2  | UR
  3  | UR DR
  4  | UR DR 
  5  | UR DR UR
  6  | UR DR UR
  7  | UR DR UR DR
  8  | UR DR UR DR

vv Do đó, nó chỉ URDRlặp đi lặp lại và cắt ở đúng nơi , W+W%2.

print"B 1\nR",(H,3,3,H)[W%4],"\n",("URDR"*W)[:W+W%2]

1
Làm thế nào để bit thứ 33 của một số nguyên hoạt động?
masterX244

@ masterX244: Rất nhiều và rất nhiều môn đánh gôn ... về cơ bản khai thác tính chất lặp đi lặp lại của đầu ra và thực hiện một số phép toán để đảm bảo tất cả các dòng đều đúng
Claudiu

chủ yếu là tự hỏi về cách "tính ngẫu nhiên" được tạo ra (PS downvote không phải từ tôi)
masterX244

@ masterX244: ah gotcha. Tôi sẽ thêm một lời giải thích
Claudiu

1
Tôi không có ý đó theo cách tiêu cực. Thật thông minh, chắc chắn, tôi chỉ hy vọng các nhà phát triển trò chơi khao khát không sử dụng điều này cho các câu đố thực tế: p
Geobits
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.