Zbuduj generator łamigłówek lodowych + solver

13

W Twitch Plays Pokémon jedną z najbardziej irytujących przeszkód, z którymi można się zmierzyć, jest łamigłówka lodowa, w której musisz podróżować z jednego miejsca do drugiego, przesuwając się całkowicie w jednym kierunku, aż uderzysz w ścianę lub głaz.

Twoim zadaniem jest zbudowanie programu, który wygeneruje losową trudną łamigłówkę lodową.

Program będzie akceptować trzy numery, M, N, i P, jako wejście (z 10 <= M <= 30, 15 <= N <= 40i 0 <= P < 65536):

12 18

i wyświetli:

  • MPrzez Nsiatkę składającą się z .a O, co stanowi lód i głaz odpowiednio.
  • Znacznik pozycji reprezentujący miejsce, w którym układanka jest wprowadzana. Ten znacznik pozycja składa się z małej litery L, R, T, lubB , reprezentujący w lewo, w prawo, do góry i na dole, a następnie przez szereg odpowiadające pozycji (z lewej strony lub z góry) na tej stronie, aby wprowadzić z.
  • Podobny znacznik pozycji reprezentujący miejsce wyjścia z układanki.
  • Najkrótsze rozwiązanie puzzli, składający się z sekwencji L, R, Ui D, odpowiednio.

Przykładowe dane wyjściowe:

..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.)

W przypadku wkładu Mi Nrozwiązanie układanki musi mieć co najmniej min(M, N)kroki i przesunąć co najmniej 2 (M + N)całkowitą liczbę pól. (Dla porównania powyższy logiczna przenosi w sumie 12 stopni, 69 obowiązuje w ruchu). Generatora logiczna musi wytwarzać inny Mprzez Npuzzle z inną ścieżkę roztworu (tj inna kolejność etapów każdego roztworu) na każde nasiono P.

  • Zauważ, że wymogiem innej ścieżki rozwiązania jest unikanie rozwiązań, które próbują systematycznie generować ścieżki skalne, jak tutaj rozwiązanie Claudiu . Jeśli istnieją dwie lub trzy pary identycznych rozwiązań z powodu dziwactw losowych, będzie to w porządku, o ile program celowo nie próbuje systematycznie generować zagadek o tej samej sekwencji ruchów.

Najkrótszy kod do wykonania powyższych wygrywa.

Joe Z.
źródło
2
Nie rozumiem celu: „musisz podróżować z jednego miejsca do drugiego, przesuwając się całkowicie w jednym kierunku, aż uderzysz w ścianę lub głaz”. Czy dobrze jest uderzać w ściany lub głazy? Dokąd zmierzasz od samego początku? Jeśli trafisz głaz, gra się kończy? Co się stanie, gdy uderzysz w ścianę? Czy to tylko ja, czy wskazówki są niejasne?
DavidC,
3
Och, stare wspomnienia o Pokémon Gold i Silver tutaj. Znajdź wyjście, zdobądź HM07 i idź do Blackthorn City.
Victor Stafusa
3
To przypomina mi poziom lodu w Chip's Challenge .
luser droog
1
Dlaczego nie użyć >i <(lub dowolnego znaku) dla wejścia i wyjścia? Zagadki będą łatwiejsze do odczytania.
AL
1
W rzeczywistości twój przykładowy wynik jest nieprawidłowy - najkrótsza ścieżka, LDLDRULDktóra ma tylko 8 kroków długości
Claudiu

Odpowiedzi:

5

Python, 672548 znaków, ciekawsze łamigłówki

Chociaż ściśle przestrzegając zasad, mój inny program w Pythonie bije ten, postanowiłem napisać taki, który i tak wygeneruje bardziej interesujące łamigłówki. Oto on:

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

Poziomy wcięć to spacja, tab, tab + spacja.

Próbki :

$ 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

Wykorzystuje się go Pjako ziarno, więc każda z Pnich wygeneruje tę samą łamigłówkę, a każda inna Pmoże być inna:

$ 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

Działa dość szybko do rozmiarów, M=25,N=40ale przeszłość robi się naprawdę wolna. Teoretycznie powinien działać, M=30, N=40jeśli pozwolisz mu działać wystarczająco długo. Napisałem tutaj ręcznie na szlaku, ponieważ jest trudny do naśladowania - program po prostu wyświetla układankę.

$ 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

Objaśnienie :

Program zapętla się, generując losową pozycję początkową na górze, losową pozycję końcową na dole i losową siatkę z 12.5%szansą na głaz w dowolnym miejscu. Następnie rozwiązuje zagadkę za pomocą pierwszego wyszukiwania i jeśli rozwiązanie istnieje i jest większe niż min(H,W), drukuje i wychodzi.

Claudiu
źródło
4

Java - 2632

Podziwiając techniczną czystość odpowiedzi Claudiu , postanowiłem spróbować swoich sił w tworzeniu nieco trudniejszych zagadek;)

Podstawowe kroki (dość proste):

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

Zaznaczam też każde miejsce jako „nogo”, gdy się przesuwam. Jeśli skończę w miejscu nogo (lub tuż przed jednym, co oznaczałoby, że tam idzie kamień), to jest to niewłaściwy krok.

Zasadniczo chodzi o to, aby losowo wygenerować wiele map i zachować pierwszą, która jest ważna. Planuję uczynić to mądrzejszym (cofanie, itp.), Ale teraz działa dobrze. Zobaczymy, że może to również ograniczyć zbędny kod.

W tej chwili generuje małe mapy (15 x 10) niemal natychmiast, średnie (30 x 20) mapy w kilka sekund, a duże (40 x 30) w losowej ilości czasu od 20 sekund do 20 minut, w zależności od nasion. Testuje między 300k-500k map / sekundę na mojej maszynie, w zależności od rozmiaru.

Uwaga dodatkowa: Czasami mapy nie są zbyt trudne, po prostu dlatego, że jest tylko tyle kamieni, ile kroków, i chyba że krok prowadzi do ściany, w większości przypadków jest tylko jedna opcja, jeśli chcesz uderzyć w prawdziwą skałę. Naprawię to później, umieszczając „losowe” skały w bezpiecznych miejscach po narysowaniu wszystkich kroków. Ponieważ miejsca nogo są już zaznaczone, powinno to być dość proste. Na razie skorzystaj z poniższych przykładów:

Dane wyjściowe pokazujące różne rozmiary / nasiona:

$ 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

Maksymalny rozmiar 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

Gra w golfa:

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);}}

Z podziałami linii:

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);              
    }
}
Geobity
źródło
Nie może while(o<3){...;o=...;}być for(;o<3;o=...){...;}, oszczędzając jeden bajt?
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

Python, 235 206 185 176 znaków

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]

Zastosowanie :

Dane wejściowe są poprzez standardowe wejście formularza [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

Powiedziałeś, że mapy muszą być różne dla każdego ziarna P... i są to:

$ 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

I przykład z innym rozmiarem:

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

Spełnia wszystkie podane kryteria obiektywne:

  • Każda Pprowadzi do innej układanki
  • Jest tylko jedno rozwiązanie, dlatego jest najkrótsze
  • Rozwiązanie wymaga N + N%2co najmniej krokówN
  • Rozwiązanie zawsze zajmuje więcej niż 2 (M + N)całkowitą ilość miejsca

Objaśnienie :

Każdy rząd jest konstruowany przez powtarzanie pewnych elementów ciągu znaków Wi ograniczenie długości do W(używam Hi Wzamiast Mi N).

Pierwsze dwa rzędy zależą od Ptego, czy każda łamigłówka będzie unikalna. Zasadniczo należy pamiętać, że Ppasuje do 16-bitowej liczby całkowitej bez znaku. Konwertuję Pna binarny, używając .dla 0 i Odla 1:

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

Pierwszy element rząd to ostatnie 15 bitów t[1:], podczas gdy drugi element rząd jest 1 bit t[0]. Nie mogłem umieścić tego wszystkiego w jednym rzędzie, ponieważ minimalna szerokość wynosi 15, co nie pasowałoby do wszystkich 16 bitów, jeśli P> 32767. Zatem pierwsze dwa rzędy jednoznacznie reprezentują każdą z możliwych wartości P.

Trzeci rząd to pełna ściana, więc wartość Pnie wpływa na rozwiązanie.

Następnie podążaj za elementami labiryntu. Ta linia drukuje je wszystkie, powtarzając je aż do czapki. Wynik jest taki, jak widać powyżej:

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

Reszta zastanawiała się, jak rozwiązać dynamicznie generowany labirynt. To zależy tylko od szerokości labiryntu. Zauważyłem, że rozwiązaniem dla danej szerokości były:

  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

itd. Stąd to tylko URDRpowtórzyć i odcięte na właściwym miejscu W+W%2.

print"B 1\nR",(H,3,3,H)[W%4],"\n",("URDR"*W)[:W+W%2]
Claudiu
źródło
1
jak do 33. liczby całkowitej to działa?
masterX244,
@ masterX244: Dużo golfa ... w zasadzie wykorzystując powtarzalność danych wyjściowych i wykonując matematykę, aby upewnić się, że wszystko się zgadza
Claudiu
głównie zastanawiam się, jak powstaje „losowość” (PS głosowanie nie pochodziło ode mnie)
masterX244
@ masterX244: ah gotcha. Dodam wyjaśnienie
Claudiu
1
Nie miałem tego na myśli negatywnie. To na pewno sprytne, mam tylko nadzieję, że początkujący twórcy gier nie używają tego do rzeczywistych łamigłówek: p
Geobits