একটি আইস ধাঁধা জেনারেটর + সলভার তৈরি করুন


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)মোট স্থান ফাঁকা রাখতে হবে। (রেফারেন্সের জন্য, উপরের ধাঁধাটি মোট 12 টি পদক্ষেপ নিয়ে ,৯ টি স্পেস সরিয়ে নিয়েছে।) আপনার ধাঁধা জেনারেটরের প্রতিটি বীজের জন্য পৃথক সমাধানের পাথ (অর্থাত্ প্রতিটি সমাধানের জন্য পদক্ষেপের একটি পৃথক ক্রম) সহ ধাঁধা Mদ্বারা আলাদা তৈরি করতে হবে ।NP

  • দ্রষ্টব্য যে এখানে সমাধানের পথটি যেমন ক্লডিউয়ের সমাধানের মতো পদ্ধতিতে রক পাথ তৈরির চেষ্টা করে তা এড়ানো থেকে আলাদা সমাধানের পথ প্রয়োজন । যদি এলোমেলোভাবে তত্পরতার কারণে দুটি বা তিন জোড়া অভিন্ন সমাধান পাওয়া যায়, তবে তা ঠিক থাকবে, যতক্ষণ না প্রোগ্রামটি ইচ্ছাকৃতভাবে একই ধরণের ক্রমের সাথে ধাঁধাটি পদ্ধতিগতভাবে উত্পন্ন করার চেষ্টা করছে না p

উপরোক্ত জয়গুলি করতে সংক্ষিপ্ততম কোড।


2
আমি উদ্দেশ্যটি বুঝতে পারি না: "আপনি কোনও দেয়াল বা পাথর আঘাত না করা পর্যন্ত আপনাকে অবশ্যই এক দিক থেকে অন্য দিকে সমস্ত দিকে একদিকে ঘুরতে হবে" " দেয়াল বা পাথর আঘাত করা ভাল? আপনি শুরু থেকে কোথায় যেতে চান? আপনি যদি একটি বোল্ডার আঘাত করেন তবে খেলাটি কি শেষ হবে? আপনি যখন কোনও দেয়ালে আঘাত করবেন তখন কি হবে? এটি কি আমি বা দিকনির্দেশগুলি অস্পষ্ট?
ডেভিডসি

3
ওহ, পোকমন সোনার এবং রৌপ্যের পুরানো স্মৃতি এখানে। প্রস্থানটি সন্ধান করুন, এইচএম07 পান এবং ব্ল্যাকথর্ন সিটিতে যান।
ভিক্টর স্টাফুসা

3
এটি আমাকে চিপের চ্যালেঞ্জের বরফের স্তরগুলির কথা মনে করিয়ে দেয় ।
লুসার droog

1
প্রবেশ এবং প্রস্থান করার জন্য কেন >এবং <(বা কোনও চরিত্র) ব্যবহার করবেন না? ধাঁধা পড়তে আরও সহজ হবে।
এএল

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

আমি স্লাইডিংয়ের সাথে প্রতিটি স্পটকে 'নোগো' হিসাবে চিহ্নিত করি। যদি আমি কোনও নোগো স্পটে শেষ হয়ে যাই (বা তার ঠিক সামনে যেখানে একটি শিলা বোঝা যাচ্ছে সেখানে), এটি একটি অবৈধ পদক্ষেপ।

সুতরাং, মূলত ধারণাটি এলোমেলোভাবে প্রচুর মানচিত্র তৈরি করা এবং প্রথমটি যা বৈধ keep আমি এটি আরও স্মার্ট (ব্যাকট্র্যাকিং ইত্যাদি) তৈরি করার পরিকল্পনা করছি, তবে এটি এখনই ঠিক কাজ করে। এটি কিছু অপ্রয়োজনীয় কোডও কেটে দিতে পারে, আমরা দেখব।

যেমনটি হয়, এটি প্রায় তাত্ক্ষণিকভাবে ছোট মানচিত্র (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

এবং ডাব্লু / একটি ভিন্ন আকারের একটি উদাহরণ:

$ 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)মোট স্থানের চেয়ে বেশি লাগে takes

ব্যাখ্যা :

প্রতিটি সারি একটি নির্দিষ্ট স্ট্রিং উপাদান Wবার পুনরাবৃত্তি এবং দৈর্ঘ্য W(আমি ব্যবহার করি Hএবং Wপরিবর্তে Mএবং এর বাইরে N) সীমাবদ্ধ দ্বারা নির্মিত হয় ।

প্রথম দুটি সারি Pপ্রতিটি ধাঁধা অনন্য করতে নির্ভর করে । মূলত, নোট করুন যে P16-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যায় ফিট করে। আমি 0 এবং 1 এর জন্য Pব্যবহার করে বাইনারি রূপান্তর করি :.O

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

প্রথম সারির উপাদানটি হ'ল সর্বশেষ 15 টি বিট t[1:], যখন দ্বিতীয় সারির উপাদানটি 1 ম বিট t[0],। আমি এগুলি সমস্তই একটি সারিতে রাখতে পারিনি কারণ সর্বনিম্ন প্রস্থটি 15, যা P32767 এর মধ্যে সমস্ত 16 বিট মাপসই করে না Thus সুতরাং প্রথম দুটি সারিটি প্রতিটি সম্ভাব্য মানকে আলাদাভাবে উপস্থাপন করে 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 তম বিটটি কাজ করে?
মাস্টারএক্স 244

@ মাস্টারএক্স ২৪৪: প্রচুর এবং প্রচলিত গল্ফিং ... মূলত আউটপুটটির পুনরাবৃত্তিমূলক প্রকৃতি কাজে লাগানো এবং এটি সমস্ত লাইন সঠিকভাবে আপ হয়েছে তা নিশ্চিত করার জন্য কিছু গণিত করা
ক্লোডিউ

"র্যান্ডমনেস" কীভাবে তৈরি হয় তা নিয়ে বেশিরভাগ ক্ষেত্রেই ভাবছি (পিএস
ডাউনটা

@ মাস্টারএক্স 244: আহ গোছা। আমি একটি ব্যাখ্যা যুক্ত করব
ক্লাদিউ

1
আমি এটি নেতিবাচক উপায়ে বলতে চাইনি। এটি নিশ্চিতভাবে চতুর, আমি আশাবাদী গেম
ডেভস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.