एक बर्फ पहेली जनरेटर + सॉल्वर बनाएँ


13

में Twitch नाटकों पोकीमोन , सबसे कष्टप्रद बाधाओं में से एक एक कर सकते हैं चेहरा एक बर्फ पहेली है, जहां आप एक ही दिशा में सभी तरह फिसलने जब तक आप या तो एक दीवार या एक बोल्डर हिट द्वारा दूसरे के लिए एक स्थान से यात्रा करना होगा है।

आपका कार्य एक ऐसे प्रोग्राम का निर्माण करना है जो एक यादृच्छिक कठिन बर्फ पहेली उत्पन्न करेगा।

आपका कार्यक्रम तीन नंबर को स्वीकार करेंगे, M, N, और P, इनपुट के रूप में (के साथ 10 <= M <= 30, 15 <= N <= 40और 0 <= P < 65536):

12 18

और उत्पादन होगा:

  • एक Mसे Nग्रिड से मिलकर .और Oक्रमश: बर्फ और एक बोल्डर का प्रतिनिधित्व।
  • एक पोजीशन मार्कर जो यह दर्शाता है कि पहेली कहाँ से दर्ज की गई है। इस स्थिति में मार्कर एक पत्र के होते हैं L, R, T, या Bका प्रतिनिधित्व बाएँ, दाएँ, ऊपर, और नीचे, एक नंबर स्थिति यह है कि पक्ष पर (बाएं या ऊपर से) का प्रतिनिधित्व करने के बाद से दर्ज किए जाने की।
  • एक समान स्थिति मार्कर का प्रतिनिधित्व करता है जहां पहेली बाहर निकलती है।
  • पहेली को कम से कम समाधान, का एक क्रम से मिलकर L, R, U, और Dक्रमशः।

उदाहरण आउटपुट:

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

एक इनपुट के लिए Mऔर N, पहेली के समाधान में कम से कम min(M, N)चरण और कम से कम 2 (M + N)कुल स्थान होना चाहिए । (संदर्भ के लिए, उपरोक्त पहेली 69 स्थानों को आगे बढ़ाते हुए कुल 12 कदम चलती है।) आपके पहेली जनरेटर को प्रत्येक बीज के लिए एक अलग समाधान पथ (यानी प्रत्येक समाधान के लिए चरणों का एक अलग क्रम) के साथ पहेली Mद्वारा एक अलग उत्पन्न करना होगा ।NP

  • ध्यान दें कि एक अलग समाधान पथ की आवश्यकता उन समाधानों से बचने के लिए है जो क्लाउडु के समाधान की तरह व्यवस्थित रूप से रॉक पथ बनाने की कोशिश करते हैं । अगर यादृच्छिकता में quirks के कारण समान समाधानों के दो या तीन जोड़े हैं, तो यह ठीक रहेगा, जब तक कि प्रोग्राम जानबूझकर चालों के समान अनुक्रम के साथ पहेली को व्यवस्थित करने की कोशिश नहीं कर रहा है।

उपरोक्त जीत के लिए सबसे छोटा कोड।


2
मैं इस उद्देश्य को नहीं समझ सकता: "जब तक आप या तो एक दीवार या बोल्डर से टकराते हैं, तब तक आपको एक दिशा में सभी तरह से फिसलने से एक स्थान से दूसरे स्थान तक यात्रा करनी चाहिए।" दीवारों या बोल्डर से टकराना अच्छा है? आप शुरू से कहाँ जाना चाहते हैं? यदि आप एक बोल्डर से टकराते हैं तो खेल खत्म हो जाता है? जब आप दीवार से टकराते हैं तो क्या होता है? क्या यह सिर्फ मैं हूं या दिशाएं अस्पष्ट हैं?
डेविड मार्क

3
ओह, यहां पोकेमोन गोल्ड और सिल्वर की पुरानी यादें। बाहर निकलें, HM07 प्राप्त करें और ब्लैकथॉर्न सिटी जाएं।
विक्टर स्टैफुसा

3
यह मुझे चिप चैलेंज में बर्फ के स्तर की याद दिलाता है ।
लूसर ने

1
प्रवेश और निकास के लिए उपयोग >और <(या किसी भी वर्ण) क्यों नहीं ? पहेलियां पढ़ना आसान होगा।
AL

1
वास्तव में आपका नमूना आउटपुट अमान्य है - सबसे छोटा रास्ता LDLDRULDजो केवल 8 कदम लंबा है
क्लाउडी मारू

जवाबों:


5

पायथन, 672 548 वर्ण, अधिक रोचक पहेलियाँ

हालांकि नियमों से कड़ाई से गुजरते हुए, मेरे अन्य पायथन कार्यक्रम ने इस एक को हराया, मैंने एक लिखने का फैसला किया जो वैसे भी अधिक रोचक पहेलियाँ पैदा करेगा। यह रहा:

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

इंडेंटेशन लेवल स्पेस, टैब, टैब + स्पेस हैं।

नमूने :

$ 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

यह Pएक बीज के रूप में उपयोग करता है , इसलिए प्रत्येक Pएक ही पहेली उत्पन्न करेगा, और प्रत्येक अलग-अलग Pहोने की संभावना है:

$ 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

यह यथोचित रूप से तेजी से काम करता है, M=25,N=40लेकिन अतीत में यह बहुत धीमा हो जाता है। M=30, N=40यदि आप इसे लंबे समय तक चलने देते हैं तो इसके लिए सैद्धांतिक रूप से काम करना चाहिए । मैंने मैन्युअल रूप से यहां ट्रेल में लिखा है क्योंकि यह पालन करना कठिन है - प्रोग्राम सिर्फ पहेली को आउटपुट करता है।

$ 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

स्पष्टीकरण :

कार्यक्रम लूप्स, शीर्ष पर एक यादृच्छिक शुरुआत स्थिति, तल पर एक यादृच्छिक अंत स्थिति और 12.5%किसी भी मौके पर बोल्डर के लिए एक यादृच्छिक ग्रिड के साथ उत्पन्न करता है । यह तब पहेली को चौड़ाई-प्रथम-खोज के साथ हल करता है और यदि समाधान मौजूद है और इससे बड़ा है min(H,W), तो यह प्रिंट करता है और बाहर निकलता है।


4

जावा - 2632

जब मैं क्लाउडीयू के उत्तर की तकनीकी शुद्धता की प्रशंसा करता हूं , तो मैंने थोड़ा और कठिन ग्राफिक्स बनाने में अपना हाथ आजमाने का फैसला किया ;)

बुनियादी कदम (बहुत सरल):

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

मैं प्रत्येक स्थान को 'नोगो' के रूप में चिह्नित करता हूं क्योंकि मैं फिसल रहा हूं। अगर मैं एक नोगो स्पॉट (या एक के सामने सही का मतलब है जो एक रॉक वहाँ जा रहा था) पर समाप्त होता है, यह एक अमान्य कदम है।

तो, मूल रूप से यह विचार बेतरतीब ढंग से बहुत सारे नक्शे बनाने के लिए है, और पहले वाले को वैध रखें। मैं इस होशियार (backtracking, आदि) को बनाने की योजना बना रहा हूं, लेकिन यह अभी ठीक काम करता है। यह कुछ अनावश्यक कोड में कटौती कर सकता है, हम देखेंगे।

जैसा कि यह है, यह छोटे नक्शे (15x10) लगभग तुरन्त, कुछ सेकंड में मध्यम (30x20) नक्शे और बीज के आधार पर 20 सेकंड और 20 मिनट के बीच कुछ यादृच्छिक मात्रा में बड़े (40x30) उत्पन्न करता है। यह आकार के आधार पर मेरी मशीन पर 300k-500k नक्शे / सेकंड के बीच परीक्षण करता है।

साइड नोट: कभी-कभी नक्शे बहुत कठिन नहीं होते हैं , केवल इसलिए क्योंकि वहाँ केवल कदम के रूप में कई चट्टानें हैं, और जब तक कि कदम आपको एक दीवार पर नहीं ले जाता है, तब तक ज्यादातर बार केवल एक ही विकल्प होता है यदि आप एक वास्तविक चट्टान को मारना चाहते हैं। मैं सभी चरणों के ड्रा होने के बाद बाद में "यादृच्छिक" चट्टानों को सुरक्षित स्थानों पर रखकर ठीक करूँगा। चूंकि नोगो स्पॉट पहले से ही चिह्नित हैं, इसलिए यह बहुत सरल होना चाहिए। अभी के लिए, इन उदाहरणों का आनंद लें:

विभिन्न आकारों / बीजों को दिखाने वाला आउटपुट:

$ 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

अधिकतम आकार 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

golfed:

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

लाइन ब्रेक के साथ:

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

नहीं while(o<3){...;o=...;}हो सकता है for(;o<3;o=...){...;}, एक बाइट की बचत?
जोनाथन फ्रीच

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));
जोनाथन फ्रीच

3

पायथन, 235 206 185 176 वर्ण

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]

उपयोग :

इनपुट फॉर्म के स्टिन के माध्यम से होता है [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

आपने कहा कि प्रत्येक बीज के लिए नक्शे अलग-अलग होने चाहिए P... और वे हैं:

$ 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

और एक उदाहरण w / एक अलग आकार:

$ 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एक अलग पहेली की ओर जाता है
  • केवल एक ही समाधान है, इस प्रकार यह सबसे छोटा है
  • समाधान N + N%2कदम उठाता है, जो कम से कम हैN
  • समाधान हमेशा 2 (M + N)कुल रिक्त स्थान से अधिक लेता है

स्पष्टीकरण :

प्रत्येक पंक्ति एक निश्चित स्ट्रिंग तत्व को दोहराते हुए निर्माण किया है Wसमय और करने के लिए लंबाई सीमित W(मैं का उपयोग करें Hऔर Wके बजाय Mऔर N)।

Pप्रत्येक पहेली को अद्वितीय बनाने के लिए पहली दो पंक्तियाँ निर्भर करती हैं । मूल रूप से, ध्यान दें कि P16-बिट अहस्ताक्षरित पूर्णांक में फिट बैठता है। मैं Pबाइनरी में कनवर्ट करता हूं , .0 के लिए और O1 के लिए उपयोग कर रहा हूं :

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

पहली पंक्ति तत्व अंतिम 15 बिट्स है t[1:], जबकि दूसरी पंक्ति तत्व 1 बिट है t[0]। मैं यह सब एक पंक्ति में नहीं डाल सकता क्योंकि न्यूनतम चौड़ाई 15 है, जो कि सभी 16 बिट्स फिट नहीं होगी अगर P> 32767। इस प्रकार पहली दो पंक्तियाँ प्रत्येक संभावित मान का प्रतिनिधित्व करती हैं P

तीसरी पंक्ति एक पूर्ण दीवार है ताकि Pसमाधान के मूल्य पर प्रभाव न पड़े।

फिर वास्तविक भूलभुलैया तत्वों का पालन करें। यह रेखा उन सभी को प्रिंट करती है, उन्हें टोपी तक दोहराती है। परिणाम जैसा आप ऊपर देख रहे हैं:

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

बाकी बस यह पता लगा रहा था कि गतिशील रूप से उत्पन्न भूलभुलैया को कैसे हल किया जाए। यह केवल भूलभुलैया की चौड़ाई पर निर्भर करता है। मैंने नोट किया कि समाधान, दी गई चौड़ाई के लिए थे:

  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

आदि इसलिए यह सिर्फ है URDRदोहराया और सही जगह पर काट W+W%2

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

1
पूर्णांक का 33 वां बिट कैसे काम करता है?
मास्टरएक्स २४४ २०

@ masterX244: बहुत सारे और गोल्फ के बहुत सारे ... मूल रूप से उत्पादन की दोहरावदार प्रकृति का शोषण और यह सुनिश्चित करने के लिए कुछ गणित कर रहे हैं कि यह सभी लाइनों को ठीक से बना दे
क्लाउडी

ज्यादातर इस बारे में सोच रहे थे कि "यादृच्छिकता" कैसे बनती है (पीएस
डाउनवोट

@ मास्टरएक्स २४४: आह गच्चा। मैं एक विवरण जोड़ देंगे
Claudiu

1
मैं इसे एक नकारात्मक तरीके से मतलब नहीं था। यह सुनिश्चित करने के लिए चतुर है, मैं बस आशा करता हूं कि गेम के
शौकीन लोग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.