একটি এলোমেলো গোলকধাঁধা মুদ্রণ করুন


19

এমন একটি প্রোগ্রাম লিখুন যা আপনার পছন্দের অ্যালগরিদম ব্যবহার করে একটি এলোমেলো ম্যাজ তৈরি করে এবং মুদ্রণ করে। প্রোগ্রামটির একাধিক রানের জন্য গোলকধাঁধাটি আলাদা হওয়া উচিত। কমান্ড লাইন আর্গুমেন্ট হিসাবে উচ্চতা এবং প্রস্থ দেওয়া হয়। ব্যবহার করুন |উল্লম্ব প্রাচীর জন্য, -অনুভূমিক প্রাচীর এবং +কোণ জন্য। গোলকধাঁধাটি দেয়াল দ্বারা আবদ্ধ এবং প্রবেশপথগুলি নিখোঁজ প্রাচীর দ্বারা চিহ্নিত করা হয়েছে। গোলকধাঁধায় একটি ধন রয়েছে #যা অবশ্যই কমপক্ষে একটি প্রবেশদ্বার থেকে পৌঁছনীয়।

$ python2 random-maze.py 4 5
+-+-+
  |#|
|   |
+---+

+1 দুর্দান্ত প্রশ্ন। যদিও কয়েক পয়েন্ট। 1: প্রস্থানটি কীভাবে চিহ্নিত করা হয়? এটি কি একটি প্রতীক *বা দুটি পৃথক প্রবেশদ্বার আছে? 2: আপনার সম্ভবত উল্লেখ করা উচিত যে প্রস্থানটি অবশ্যই পৌঁছনীয়।
snmcdonald

1
@ এসএনএমসিডোনাল্ড: আসুন এটি মজাদার করুন এবং একটি ধন যোগ করুন :)।
আলেকজান্দ্রু

2
আমি তাদের সমাধান সম্পর্কে একটি ফলোআপ গল্ফ দেখতে পাচ্ছি ... :)
st0le

@ st0le: আমার ইতিমধ্যে কিছু ধারণা আছে। আপনি আলোচনা করতে চাইলে আমাকে মেইল ​​করুন।
আলেকজান্দ্রু

1
ধাঁধা ধরণ এখানে অনির্ধারিত। আমি দেখতে পাচ্ছি লোকেরা এর উত্তর দিয়েছে যেন এটি একটি [কোড-গল্ফ]। এটা কি উদ্দেশ্য ছিল? যদি তা হয় তবে দয়া করে এটি ট্যাগ করুন?
ডিএমকেকে

উত্তর:


5

আমি মনে করি এটি প্রযুক্তিগতভাবে কোনও ধাঁধা জেনারেটর নয়, তবে এটি ফলাফলের মতো গোলকধাঁধা তৈরি করে: https://gist.github.com/803450

আমি জানি সেখানে কিছু ভয়াবহ কোড এবং এটি কেবল অর্ধেকেরও কম সময়ের জন্য কাজ করে এবং ফলস্বরূপ দেয়াল অন্যান্য দেয়াল থেকে সজ্জিত করার ক্ষেত্রে যথেষ্ট সঠিক মনে হয় না। তবে এটি এতটা কাছে যে আমি বাকীগুলি ঠিক করতে বিরক্ত হচ্ছি না।

কিছু উদাহরণ আউটপুট:

→ ruby random-maze.rb 30 30
+----+-+-----------++-+----+
|    + |           ++ |    |
++  +  | ++ ++   +    + ++ ++
|  ++ ++ |  |    +---+  +   |
| +      | +| +   +++  +  + |
|   +   +| +| +-+  |   + +  |
|        +  +    + + ++  |+ |
| + ++ +  ++   + |  +   ++| |
| |  | ++  + +----+ + +-+ | |
| +  |  +-+  |+        |  | |
|   +-+  +| ++  ++ + + |  | |
| ++   +  + |  ++|   + | ++ |
|  + + + +  +---++-+   +++  |
| +  |  +| +    |  ++   |   |
| | +++ +| + ++ +--+  + |---+
|#+ | |  |   +++     +  +   |
++  | ++ +-+  ++ +--+  +  + |
|  ++  |    +     ++| +  ++ |
| ++   +--------+  +| + +   |
| |     |      +++  |  +  +-+
| |     | +--+  |++ |+ | ++
| |     |  +--+ | | || |  |
| |     +-+     +-+ |+ |+ |
| | +---+   ++      +  |  |
| +-|     +    +      ++ ++
|   +       ++   +---+   |
|              ++   +  +-+
|                 +   ++
+-+ +-------------+---+

1
ভাল যুক্তি. যদি আপনি এটি ঠিক করেন তবে অতিরিক্ত পয়েন্টগুলি;)
আলেকজান্দ্রু

এটি কেবলমাত্র আমার ইউনি অ্যাসাইনমেন্টের জন্য একটি গোলকধাঁধা উত্পন্ন করার জন্য ব্যবহৃত একটি অ্যালগরিদমটির জন্য দ্রুত চাবুক এবং আউটপুট পরিবর্তন ছিল । আসল অ্যালগরিদম মূলত শেভেরায় একটি ব্লগ পোস্ট থেকে চুরি করা হয় । আমি এই সপ্তাহান্তে এটি ঠিক করতে প্রায় পেতে পারি, আমি নিশ্চিত না যে আউটপুট ফর্ম্যাটটি পুরোপুরি কাজ করবে যেহেতু এটি সত্যিকারের গোলকধাঁধা নয়, তবে আমি চেষ্টা করব এবং ভাল লাগার সময় এটি যথাসম্ভব কাছাকাছি আনব।
নিমো 157

আমার কাছে খুব ভাল গোলকধাঁধা মনে হচ্ছে।
আলেকজান্দ্রু

8

পাইথন, 375 টি অক্ষর

import random,sys
H,V=map(int,sys.argv[1:])
H-=1
V-=1
b,h,v,p=' -|+'
M=H/2*h
n=random.randint(1,(H/2)*(V/2-1))
for i in range(V/2):
 e=s=t='';N=v
 for j in range(H/2):
  if i and(random.randint(0,1)or j==0):s+=N+b;t+=v;N=v;M=M[1:]+p
  else:s+=M[0]+h;t+=b;N=p;M=M[1:]+h
  n-=1;t+=' #'[n==0]
 if H&1:s+=s[-1];t+=b;e=h
 print s+N+'\n'+t+v
if V&1:print t+v
print h.join(M)+e+h+p

এটি একটি প্রবেশদ্বার এবং এলোমেলোভাবে রাখা ধন সহ একটি গোলকধাঁধা উত্পন্ন করে। গোলকধাঁধা হ'ল একটি সাধারণ বাইনারি গাছের গোলকধাঁধা

$ ./maze.py 15 15
--------------+
              |
| | ----------+
| |           |
| +-----+ | --+
|       | |   |
| --+ --+ +---+
|   |   |     |
| --+-+ +---+ |
|     |     | |
| --+ +-+ --+ |
|   |   |   |#|
| | | --+ --+-+
| | |   |     |
+-+-+---+-----+

সম্ভবত এটি উদ্দেশ্যযুক্ত ছিল, তবে উপরের সারিটি (কেবল প্রাচীরের নীচে) সর্বদা একটি দীর্ঘ করিডোর।
আলেকজান্দ্রু

হ্যাঁ, এবং বামতম কলামটিও সর্বদা দীর্ঘ করিডোর। এটি যে ধরণের ধাঁধা তৈরি করছি তার একটি সম্পত্তি।
কীথ র্যান্ডাল

উহু. মেজগুলি যদিও :) খুব সুন্দর।
আলেকজান্দ্রু

6

রুবি 1.9.2p136: 90

eval ARGV[0]
z=[l="+"+"-"*@w+"+"]
@h.times{z<<"|"+" "*@w+"|"}
z[rand(@h)+1]="|#"
puts z<<l

আউটপুট

$> ruby maze.rb "@h=8;@w=8;"

+------+
|      |
|      |
|      |
|      |
|#
|      |
+------+

আরে, কেউ বলেনি এটি একটি ভাল ধাঁধা হতে হবে । ঠিক আছে, ঠিক আছে, আমি এখন একটি বাস্তব করব।


ভাল, তবে নিশ্চিত হন যে এটি প্রোটোকলকে সম্মান করে (কমান্ড লাইন থেকে উচ্চতা এবং প্রস্থ, গোলকধাঁটি স্টাডাউটে মুদ্রিত)।
আলেকজান্দ্রু

আসলে এটি স্টাডাউট সম্পর্কে কিছু বলে না (এটি কোনও যুক্তিসঙ্গত শর্ত নয় কারণ কেউ কেউ এমন ভাষা ব্যবহার করছেন যা স্টাডাউটে প্রিন্ট করে না) এবং এটি সাধারণত গৃহীত হয় যে ইনপুটগুলি কোনও ফাংশন / পদ্ধতিতে রয়েছে। এই ভোটদানকারী ব্যক্তির পক্ষে, এটি নির্দিষ্ট হিসাবে সমস্যাটি সমাধান করে সুতরাং ম্যাজারটিকে ঘৃণা করা ঘৃণা করবেন না।

যতক্ষণ না এটি প্রশ্নের ক্ষেত্রে নির্দিষ্ট করা হয়েছে ততক্ষণ Not Meta.codegolf.stackexchange.com/questions/13/… দেখুন । তদুপরি, জাভাস্ক্রিপ্টের বিপরীতে রুবি স্ট্যান্ডার্ড আউটপুটে আর্গুমেন্ট পড়া এবং লেখার পক্ষে সমর্থন করে। আপনার সমাধান অন্যদের সাথে তুলনা করে প্রতারণা করছে যারা সমস্যাটি সঠিকভাবে সমাধান করেছেন।
আলেকজান্দ্রু

সম্পাদনা করা যায় না। আমার অর্থ 'অসম্পূর্ণ' 'প্রতারণা' নয়। গোলকধাঁধাটির ধারণাটি আমার পছন্দ হয়েছে।
আলেকজান্দ্রু

তারপরে অন্যান্য ভাষাগুলি তাদের কোড করতে অন্তর্ভুক্ত কোডটি অন্তর্ভুক্ত করতে হবে বা #!/usr/bin/env pythonউদাহরণস্বরূপ, তাদের কোডে অন্তর্ভুক্ত করবে। যেমনটি আমি বলেছিলাম যে আমিও একটি বাস্তব সমাধান লিখব, এটি কেবল নিজের প্রশ্নের (এবং আরও অনেক) দুর্বল গুণটি দেখিয়েছিল এবং দেখায় যে আমাদের আরও ভাল নির্দেশিকা থাকা দরকার need এবং অবশেষে একটি প্রশ্নের দিকে ইঙ্গিত করা প্রশ্নের উত্তরটিকে সাইটের আসল নিয়ম করে না। তবে ঠিক আছে, এখানে আপনার নতুন সংস্করণটি ...

3

গ 844

#include <stdlib.h>
#include <time.h>
h,w,*m,y,x,z;d(t,b,l,r){int i=b-t,j=r-l;if(i>1&&j>1){i=(rand()%--i)|1;j=(rand()%--j)|1;z=rand()%4;x=rand()%i+t;x|=1;for(y=t;y<i+t;y++)if(y!=x||!z)m[y*w+j+l]=124;x=rand()%(b-i-t)+i+t;x|=1;for(y=t+i;y<b+1;y++)if(y!=x||!(z-1))m[y*w+j+l]=124;y=rand()%j+l;y|=1;for(x=l;x<j+l;x++)if(y!=x||!(z-2))m[(i+t)*w+x]=45;y=rand()%(r-j-l)+j+l;y|=1;for(x=l+j;x<r+1;x++)if(y!=x||!(z-3))m[(i+t)*w+x]=45;m[(i+t)*w+j+l]=43;m[(t-1)*w+l+j]=43;m[(b+1)*w+j+l]=43;m[(i+t)*w+l-1]=43;m[(i+t)*w+r+1]=43;d(t,t+i-1,l,l+j-1);d(t+i+1,b,l,l+j-1);d(t,t+i-1,l+j+1,r);d(t+i+1,b,l+j+1,r);}}main(int c,char**v){h=atoi(v[1]),w=atoi(v[2]),m=calloc(h*w,4);srand(time(0));while(y<h){while(x<w){m[y*h+x]=(!y||y==h-1)?(!x||x==w-1)?43:45:(!x||x==w-1)?124:32;x++;}y++;x=0;}d(1,h-2,1,w-2);z=rand()%(w-2);z|=1;m[z]=32;z=rand()%(w-2);z|=1;m[h*(w-2)+z]=35;}

পরীক্ষা করার জন্য:

#include <stdio.h>//beginning
for(y=0;y<h;y++){for(x=0;x<w;x++){putchar(m[y*h+x]);}putchar('\n');}getchar();//end

3x3

+ +
| # |
- + +

7x8

+ - + - - +
| |
+ + - + - +
| |
| + - + - +
| | # |
- - - + +

18x20

+ - + - + + --- + --- + - + - +
| | | | |
| + + + - + --- + + - +
| | | |
+ + + - + --- + - + - + - +
| | | |
+ - + + - + - + - + --- + - + - +
| | | | | |
| + + + + - + - - + |
| | | | |
| | | + - + - + ---- + |
| | | | |
+ + + - + - + - + - + - +
| | | | |
| + + - + - + - - + |
| | | | |
| | | | # | | |
- - - + + --- + + ----- - + +

এটি একটি কোড-চ্যালেঞ্জ , কোনও কোড-গল্ফ নয় । সবে পঠনযোগ্য কোড কেন?
ব্র্যাডেন সেরা

-1। এই কোডটি কেবল অবরুদ্ধ নয়, তবে কীভাবে এটি সংকলন করা উচিত, এবং কোডের দুটি ব্লক কীভাবে কার্যকর করা উচিত সে সম্পর্কে কোনও সুস্পষ্ট নির্দেশনা নেই। সম্পূর্ণরূপে অনুপস্থিত না থাকলে ব্যবহারের নির্দেশাবলী অপ্রতুল। এটি সুস্পষ্ট যে আপনার উত্তরটি একটি কোড-গল্ফ। তবে প্রশ্নটি নয় । সুতরাং কোডটি পঠনযোগ্য এবং সহজে অনুলিপি / পেস্ট / সংকলনের জন্য স্ব-অন্তর্ভুক্ত হওয়া উচিত, যাতে অন্যেরা যাচাই করতে পারে যে এটি আপনার কোডটি প্রথম স্থানে কীভাবে কাজ করবে সে বিষয়ে সিদ্ধান্ত না নিয়েই এটি কাজ করে।
ব্র্যাডেন সেরা

0

এখানে একটি সহজ জাভা সমাধান:

import java.util.*;

public class MazeGen {
    public static void main(String[]a){
        int w,l;
        Random rand=new Random(System.currentTimeMillis()%1000+System.nanoTime());
        if(a.length==2){
            w=Integer.parseInt(a[0]);
            l=Integer.parseInt(a[1]);
        }else{
            System.out.println("No command line arguments, taking from STDIN.");
            Scanner input=new Scanner(System.in);
            w=input.nextInt();
            l=input.nextInt();
            input.close();
        }
        char[][]maze=new char[w][l];
        for(int x=0;x<w;x++){
            for(int y=0;y<l;y++){
                maze[x][y]=' ';
            }
        }
        for(int x=0;x<w;x++){
            maze[x][0]=maze[x][l-1]='|';
        }
        for(int y=0;y<l;y++){
            maze[0][y]=maze[w-1][y]='-';
        }
        maze[0][0]=maze[w-1][0]=maze[w-1][l-1]=maze[0][l-1]='+';
        int dor=1+rand.nextInt(l-2);
        maze[0][dor]=' ';
        int tx=2+rand.nextInt(w-3),ty=1+rand.nextInt(l-2);
        maze[tx][ty]='#';
        if(ty<dor-1){
            maze[tx][ty+1]='|';
            if(tx==w-2){
                maze[tx+1][ty+1]='+';
            }
            if(tx==1){
                maze[0][ty+1]='+';
            }
        }
        if(ty>dor+1){
            maze[tx][ty-1]='|';
            if(tx==w-2){
                maze[tx+1][ty-1]='+';
            }
            if(tx==1){
                maze[0][ty-1]='+';
            }
        }
        if(ty==dor&&tx>3&&(maze[tx][ty+1]==' '||maze[tx][ty-1]==' ')){
            maze[tx-1][ty]='-';
        }
        if(dor>5){
            int z=2+rand.nextInt(dor-3);
            int q=1+rand.nextInt(w-3);
            for(int i=0;i<w;i++){
                if(i==0||i==w-1){
                    maze[i][z]='+';
                }else if(i!=q&&maze[i][z]==' '){
                    maze[i][z]='|';
                }
            }

        }
        if(l-dor>5){
            int z=dor+2+rand.nextInt(l-dor-3);
            int q=1+rand.nextInt(w-3);
            for(int i=0;i<w;i++){
                if(i==0||i==w-1){
                    maze[i][z]='+';
                }else if(i!=q&&maze[i][z]==' '){
                    maze[i][z]='|';
                }
            }

        }
        for(char[]row:maze){
            System.out.println(row);
        }
    }
}

কিছু নমুনা ফলাফল:

3x3:

+ +
|#|
+-+

4x4:

+ -+
| #|
|  |
+--+

4x5:

+-+ +
|#| |
|   |
+---+

5x5:

+ --+
|   |
|   |
| |#|
+-+-+

5x8:

+ --+--+
|   |  |
|      |
| # |  |
+---+--+

8x15:

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