চিত্রের মাজেস তৈরি করা হচ্ছে


20

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম / ফাংশন লিখুন যা কোনও "চিত্র" গ্রহণ করে এবং সেই চিত্র থেকে গঠিত চিত্র গোলকধাঁধা আউটপুট করে ।

ইনপুট

আপনার প্রোগ্রামটি দুটি যুক্তি গ্রহণ করা উচিত:

  • আমি, চিত্রটি থেকে ধাঁধাটি তৈরি করতে চাই
  • এস, একটি বুলিয়ান যা ধাঁধাটির সমাধানটি প্রদর্শন করবে কিনা তা নির্দিষ্ট করে

আমি নিম্নলিখিত ফর্ম দেওয়া হয়:

.......
.#####.
.#####.
#######
.#####.
.#####.
.......

যেখানে #সমাধানের পথে অন্তর্ভুক্ত করার জন্য কোষগুলি হ'ল এবং .এর ঘরগুলি বাদ দেওয়া হবে। আপনি খুঁজে অদলবদল পারে .'র, #এর এবং আপনার যতদিন তারা একে অপরের থেকে ভিন্ন নির্বাচন কোন অক্ষর দিয়ে নতুন লাইন। বিকল্পভাবে, আপনি ইনপুট চিত্রের একটি আসল বিটম্যাপ গ্রহণ করতে পারেন।

আউটপুট

আপনার ফলাফল গোলকধাঁধা নিম্নলিখিত ফর্ম হতে হবে:

###############
#             #
# ### ####### #
# #.........# #
# #.#######.# #
# #.#.......# #
###.#.#########
....#.#........
#####.#.#######
#  ...#.....  #
# #.#######.# #
# #.........# #
# ####### ### #
#   #       # #
###############

যেখানে #দেয়াল .বোঝানো হয়, সেই পথের অংশগুলি বোঝায় যেগুলি সমাধানের অংশ এবং ফাঁকা স্থানগুলি সমাধান থেকে বাদ দেওয়া। .এর শূণ্যস্থান দ্বারা প্রতিস্থাপিত হতে পারে, S মিথ্যা। আবার, অক্ষরগুলি আপনার চয়ন করা অন্যান্য চরিত্রের সাথে অদলবদল হতে পারে বা আপনি হাইলাইটযুক্ত সমাধানটি দিয়ে গোলকধাঁসের একটি আসল বিটম্যাপ আউটপুট করতে পারেন।

অতিরিক্ত তথ্য

  • পাথগুলি অবশ্যই একটি কক্ষ প্রশস্ত হতে হবে (ফাঁকা জায়গার দৈত্য পুলটি পথ হতে পারে না)
  • গোলকধাঁধায় কোনও লুপ থাকতে হবে না
  • গোলকধাঁটি সম্পূর্ণরূপে সংযুক্ত থাকতে হবে (সমস্ত কক্ষ অবশ্যই প্রবেশ / প্রস্থান থেকে পৌঁছনীয়)
  • গোলকধাঁটি অবশ্যই প্রাচীর দ্বারা বেষ্টিত হবে (এটির প্রবেশ পথ / প্রস্থান না করা)
  • সমাধানের পথে অবশ্যই মৃতপ্রান্তগুলি অন্তর্ভুক্ত করা উচিত নয়
  • ধাঁধাটির জন্য অবশ্যই 1 টি প্রবেশদ্বার এবং 1 প্রস্থান থাকতে হবে
  • প্রবেশদ্বার এবং প্রস্থানটি গ্রিডের প্রান্তে এবং সমাধানের পথে অন্তর্ভুক্ত একটি কক্ষের সাথে সংলগ্ন হতে হবে
  • প্রবেশদ্বার এবং প্রস্থানটি কোথায় রাখা হয়েছে তা বেছে নিতে পারেন
  • আপনি ধরে নিতে পারেন প্রদত্ত ইনপুট চিত্র থেকে একটি বৈধ পথ তৈরি করা যেতে পারে

(স্পষ্টকরণের জন্য যুক্ত) নীচের চিত্রটি কীভাবে সমাধানের পথটিকে ইনপুট চিত্রের সাথে সম্পর্কিত বলে দেখায়:

Input (I): |    Output:            |    Corresponding Cells: 
           |                       |    (@'s denote #'s from I)
           |                       |
.......    |    ###############    |    ###############
.#####.    |    #             #    |    #             #
.#####.    |    # ### ####### #    |    # ### ####### #
#######    |    # #.........# #    |    # #@.@.@.@.@# #
.#####.    |    # #.#######.# #    |    # #.#######.# #
.#####.    |    # #.#.......# #    |    # #@#@.@.@.@# #
.......    |    ###.#.#########    |    ###.#.#########
           |    ....#.#........    |    .@.@#@#@.@.@.@.
           |    #####.#.#######    |    #####.#.#######
           |    #  ...#.....  #    |    #  @.@#@.@.@  #
           |    # #.#######.# #    |    # #.#######.# #
           |    # #.........# #    |    # #@.@.@.@.@# #
           |    # ####### ### #    |    # ####### ### #
           |    #   #       # #    |    #   #       # #
           |    ###############    |    ###############
           |                       |

পরীক্ষার মামলা

জল সরবরাহ উইকিপিডিয়া থেকে উদাহরণস্বরূপ হতে পারে :

ইনপুট:

..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................

আউটপুট (এস = মিথ্যা):

#####################################
#   #     #   #   #     #           #
# ### ### ### # # ##### ### ### ### #
#     # #   # # #         # #   # # #
# ### # ##### # ########### # ### # #
# # #         #           # # #   # #
# # # ### ##### # ### ### # ### ### #
#   # # #   #   # # #   # #   # #   #
# ### # ##### ##### ### ##### # # ###
# #   #       #   #   #       # # #  
### ####### ### ### # ### ##### ### #
#   #     # #   #   #   # #   # #   #
# ### ##### # ### ####### # # # # # #
# #       #             #   # #   # #
# # ##### ############# ### ### ### #
#   #   #       #     #   # #   # # #
# ### # ####### # ### ### # # ### # #
# # # #         #   # #   #   #     #
# # # ### ######### # # ##### # #####
# #   # # #       # #   #   # # #   #
# ##### # # ##### # ##### # # ### # #
#       # #   #   # #     # #   # # #
# ### ### ### # ### # ##### ####### #
#   # # #     # #   # #       #     #
# # # # ####### # ### # ##### # ### #
  # # # #   #   #     #     # #   # #
### # # # # # ############# # ### # #
#   # # # #   #         #   # #   # #
##### # # ##### ####### # ### ##### #
#     # # #   #       # #   #       #
##### # # # # ####### # ### #########
#     #     #         #       #     #
# ### ######### ############# # #####
# # #   #     # #       #     #     #
# # ######### # ####### ####### ### #
#             #                 #   #
#####################################

আউটপুট (এস = সত্য):

#####################################
#   #     #   #   #     #           #
# ### ### ### # # ##### ### ### ### #
#     # #   # # #         # #   # # #
# ### # ##### # ########### # ### # #
# # #         #.......    # # #   # #
# # # ### #####.# ###.### # ### ### #
#   # # #   #...# # #...# #   # #   #
# ### # #####.##### ###.##### # # ###
# #   #    ...#   #   #...    # # #..
### #######.### ### # ###.##### ###.#
#   #     #.#   #   #   #.#   # #...#
# ### #####.# ### #######.# # # #.# #
# #.......#.............#...# #...# #
# #.#####.#############.###.###.### #
#...#   #.......#.....#...#.#...# # #
#.### # #######.#.###.###.#.#.### # #
#.# # #  .......#...#.#...#...#     #
#.# # ###.#########.#.#.##### # #####
#.#   # #.#.......#.#...#...# # #   #
#.##### #.#.#####.#.#####.#.# ### # #
#.      #.#...#...#.#.....#.#   # # #
#.### ###.###.#.###.#.#####.####### #
#.  # # #.....#.#...#.#.....  #     #
#.# # # #######.#.###.#.##### # ### #
..# # # #...#...#.....#.....# #   # #
### # # #.#.#.#############.# ### # #
#   # # #.#...#.........#...# #   # #
##### # #.#####.#######.#.### ##### #
#     # #.#...#.......#.#...#       #
##### # #.#.#.#######.#.###.#########
#     #  ...#.........#.....  #     #
# ### ######### ############# # #####
# # #   #     # #       #     #     #
# # ######### # ####### ####### ### #
#             #                 #   #
#####################################

বিটম্যাপ উদাহরণ (উপরের মতো একই ধাঁধা):

ইনপুট: ইনপুট বিটম্যাপআউটপুট (এস = মিথ্যা): আউটপুট বিটম্যাপ সমাধান আনইলাইটেডআউটপুট (এস = সত্য):আউটপুট বিটম্যাপ সমাধান হাইলাইট করা


4
এটি কেবল আমার হতে পারে তবে আমি আউটপুট ধাঁধাতে ইনপুট ছবিটি দেখতে পাচ্ছি না।
মাইক বুফার্দেসি

@ মাইক-বুফার্ডে আউটপুট ধাঁধাতে ইনপুট চিত্র দেখায় একটি চিত্র যুক্ত করেছে। আশা করি এইটি কাজ করবে!
ডেনড্রোবিয়াম

2
ধাঁধাটি সংযুক্ত রয়েছে এমন প্রয়োজনীয়তার কোনও নিয়ম বলে মনে হচ্ছে না। এটি কি কোনও বৈধ সমাধান হতে পারে? এমন কোনও নিয়ম বলে মনে হয় না যে গ্রিডটি অবশ্যই প্রাচীর দ্বারা আবদ্ধ হওয়া উচিত (যতক্ষণ না প্রতিটি অ-দেয়াল একটি প্রবেশদ্বার বা প্রস্থান হিসাবে বিবেচিত হয় না)। এটি কি কোনও বৈধ সমাধান হতে পারে?
মার্টিন এন্ডার

1
এছাড়াও, দয়া করে আরও কয়েকটি পরীক্ষার কেস যুক্ত করুন।
flawr

@ মার্টিনব্যাটনার গোলকধাঁধাটি পুরো দেয়াল দ্বারা সংযুক্ত এবং চারপাশে থাকা উচিত, এই বিষয়গুলি পরিষ্কার করে প্রশ্ন সম্পাদনা করা উচিত।
ডেন্ড্রোবিয়াম

উত্তর:


10

পাইথন 3, 1599 বাইট

আমি এটি একটি মজাদার প্রকল্প এবং খুব আকর্ষণীয় (এবং কিছুটা দীর্ঘ) বলে মনে করেছি। আমি যখন এটি দেখলাম, তখন গ্রীষ্মের স্মরণ করিয়ে দিয়েছিলাম যে আমি এক ধরণের ধাঁধা প্রজন্মের অ্যালগরিদম লেখার এবং উন্নত করার জন্য ব্যয় করেছি এবং তাত্ক্ষণিকভাবে এটির জন্য কাজ শুরু করে।

কিছুক্ষণ পরে, আমার প্রায় 6000 বাইট লম্বা প্রাথমিক খসড়া হয়েছিল এবং আমি পরের কয়েক ঘন্টা এটি নীচের প্রোগ্রামটিতে ঘনীভূত করতে ব্যয় করি:

import math,random;R=range;L=len;T=sorted;P=print;N=random.randint
def M(I,S):
 I=I.rsplit('\n');s=[0]*(1+L(I[0])*2);G=[s]
 for i in R(L(I)):
  r=[0]
  for x in I[i]:r+=x,0
  G+=[r];s=[0]*(1+L(I[0])*2);G+=[s]
 c=E(G,L(G[0])-2,-2);G[c][L(G[0])-1]=1;e=[c,L(G[0])-2];c=E(G,1,2);G[c][0]=1;G[c][1]=1;s=[c,1]
 while s!=e:
  o=[];Q(G,s,e,-2,0,o,0);Q(G,s,e,0,2,o,1);Q(G,s,e,2,0,o,2);Q(G,s,e,0,-2,o,3);o=T(o,key=lambda x:(x[2],-x[1]))[0][0]
  if o==0:G[s[0]-1][s[1]]=1;s[0]-=2
  elif o==1:G[s[0]][s[1]+1]=1;s[1]+=2
  elif o==2:G[s[0]+1][s[1]]=1;s[0]+=2
  else:G[s[0]][s[1]-1]=1;s[1]-=2
  G[s[0]][s[1]]=1
 s=0
 while not s:
  r=N(1,(L(G)-1)/2)*2-1;c=N(1,(L(G[0])-1)/2)*2-1
  if G[r][c]in[1,2]:
   o=[];F(G,r-2,c,o,0);F(G,r,c+2,o,1);F(G,r+2,c,o,2);F(G,r,c-2,o,3)
   try:
    if o[0]==0:G[r-1][c]=2;G[r-2][c]=2
    elif o[0]==1:G[r][c+1]=2;G[r][c+2]=2
    elif o[0]==2:G[r+1][c]=2;G[r+2][c]=2
    else:G[r][c-1]=2;G[r][c-2]=2
   except:0
  s=1
  for x in G:
   if'.'in x:s=0;break
 *s,='#  '
 if S:s[1]='.'
 for x in G:
  for y in x:P(s[y],end='')
  P()
def Q(G,s,e,x,y,o,a,n=0):
 c=lambda x,y:G[s[0]+x][s[1]+y]is'#'
 try:
  if c(x,y):
   try:n+=c(2*x,2*y)
   except:0
   try:n+=c(x+abs(x)-2,y+abs(y)-2)
   except:0
   try:n+=c(x-abs(x)+2,y-abs(y)+2)
   except:0
   o+=[[a,math.sqrt((s[0]+x-e[0])**2+(s[1]+y-e[1])**2),n]]
 except:0
def F(G,r,c,o,a):
 try:
  if G[r][c] is'.':o+=[a]
 except:0
def E(G,y,z,d='#'):
 c=[]
 for x in R(1,L(G)-1,2):
  n=0
  try:n+=G[x-2][y]==d
  except:0
  try:n+=G[x+2][y]==d
  except:0
  n+=G[x][y+z]==d
  if G[x][y]==d:c+=[[x,n]]
 if L(c)>1:c=T(c,key=lambda x:x[1])
 return c[0][0]

অসি-আর্ট ধাঁধা হিসাবে দেখতে যতটা অ-সংবেদনশীল তা হ'ল ...

এটি লক্ষণীয় যে, যেহেতু সঠিক পথটি সন্ধান না হওয়া পর্যন্ত এলোমেলো ফাংশন ব্যবহার করা হয় না, একই ইনপুটটি যতবার দেওয়া হয় তা বিবেচনা না করে, শুরু থেকে শেষ পর্যন্ত রুটটি একই হবে এবং এই প্রোগ্রামটি যখন উপরোক্ত উদাহরণগুলির জন্য কাজ করুন, কখনও কখনও এটি 'কোনও দেয়ালে নিজেকে চালিত করে' তাই কথা বলার ক্ষেত্রে কোনও সমাধান খুঁজে পাবে না।

উপরের উদাহরণগুলি চালনার সময়, এটি এটি দেয়:

>>> M('''.......
.#####.
.#####.
#######
.#####.
.#####.
.......''',True)
###############
# # #   # #   #
# # # ### # # #
# #...#.....# #
# #.#.#.###.###
#  .#.#.#...# #
###.#.#.#.### #
....#.#.#.#....
# ###.#.#.#.###
# #...#.#.#.  #
# #.###.#.#.# #
# #.....#...# #
### ####### # #
#         # # #
###############
>>> 

এই:

>>> M('''..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................''',False)
#####################################
# #     #   # # #   # #   # # # # # #
# ### ##### # # # ### # ### # # # # #
#   # # #   #   # # # #   # # #   # #
### # # ### # ### # # # ### # ### # #
# #     #   # #         # # # # # # #
# ### ##### # # ##### ### # # # # # #
# # #   #   #     # #   # # # # # # #
# # # ##### # ##### ### # # # # # # #
# # # #         # # #         #      
# # # # # # ##### # ### # ######### #
# #   # # # #   # # # # # # # # #   #
# # ####### # ### # # ### # # # # # #
#         # #           #   #     # #
### ##### # # ######### ### ### ### #
#     #   # # #   #   #     #   # # #
# ### ### # # # # # # ####### ### # #
#   # #   # # # # # # #   #       # #
# ##### # # # # # # # # # # # ##### #
#   #   # # # # # # # # #   #     # #
# ####### # # # # # # # #############
#   #     # # # # # # #         #   #
# ####### # # # # # # ##### ##### # #
#   #     # # # # # #           # # #
# ### ### # # # # # ######### ### ###
    # #   # # # # #         #   #   #
# ### # # # # # # ######### ##### ###
#   # # # # # # #                 # #
# # # ### # # # ################### #
# # # # # # # #               #     #
# ### # # # # ############# ### ### #
# # # #     #                     # #
# # ##### # # # ##### # # ##### ### #
# # #     # # #     # # #     #   # #
### ##### # ### # # # ##### # ### # #
#         #   # # # #     # #   # # #
#####################################
>>> 

এবং এই:

>>> M('''..................
..................
.......####.......
......##..##......
.....##....##....#
.....#......#...##
.#############.##.
##..############..
#...###########...
#...##########....
#...##########....
#...##########....
#...##########....
....##########....
....##########....
....##########....
..................
..................''',True)
#####################################
#     #     # #   # # # # # # #     #
##### # # ### ### # # # # # # ### # #
# # # # # # # #     # # # # # # # # #
# # # ### # # ##### # # # # # # # ###
#   # #   # # #.......# #     #   # #
### # ### # # #.#####.# # ####### # #
#   # #   # #...#   #...#   # #   # #
### # ### # #.# # ### #.# ### ### # #
# # # # # #...# #   # #...  # #   #..
# # # # # #.# ### #######.### ### #.#
# #     #  .# #   # # #  .    # #...#
# # #######.##### # # ###.##### #.# #
#  .......#.#...........#...# #...# #
###.# ###.#.#.#########.###.# #.### #
#...# #  .#.#.#...#...#.....#...  # #
#.#######.#.#.#.#.#.#.#######.#######
#.    #  .#.#.#.#.#.#.#...#...#     #
#.#######.#.#.#.#.#.#.#.#.#.### #####
#.    #  .#.#.#.#.#.#.#.#...        #
#.#######.#.#.#.#.#.#.#.#############
#.    # #.#.#.#.#.#.#.#.....        #
#.##### #.#.#.#.#.#.#.#####.#########
#.  #    .#.#.#.#.#.#.......  # #   #
#.# # ###.#.#.#.#.#.########### # ###
..# # #  .#.#.#.#.#.........#   # # #
# # #####.#.#.#.#.#########.# ### # #
# # #    .#.#.#.#...........        #
#########.#.#.#.############### #####
#   #    .#.#.#.............# #     #
### # ###.#.#.#############.# ##### #
#     #  ...#...............      # #
##### # # ### # # # # ### # # ##### #
#     # #   # # # # #   # # #   #   #
####### # ### # # # ##### # ####### #
#       # #   # # #     # #       # #
#####################################
>>> 

যে কেউ এই প্রোগ্রামটি নিজে চালানোর চেষ্টা করতে চান তাদের জন্য কমান্ডটি ব্যবহার করুন M(Image, Show solution)। আমি চিত্রটি ইনপুট করতে ট্রিপল-কোটগুলি ব্যবহার করার পরামর্শ দেব কারণ অন্যথায় এতে প্রচুর ব্যাক স্ল্যাশ বা নিউলাইন চরিত্র জড়িত থাকবে।


1
নির্ভুল ডাকনাম: পি
17'99

1
চমৎকার কাজ! কিছু টিপস: -> , -> 0এর পরিবর্তে ব্যবহার করুন pass, কোনও ভেরিয়েবলের জন্য এটি নির্ধারণ করা উপযুক্ত এবং ->l.append(a);l.append(b)l+=a,bl.append(a)l+=[a]'#'def E(G,y,z):\n c=[]def E(G,y,z,c=[]):
লুভজো

1
এছাড়াও, if G[r][c]==1 or G[r][c]==2:-> if 0<G[r][c]<3:, s=[0]\n for x in R(L(I[0])*2):s+=[0]-> s=[0]*(1+L(I[0])*2)এবং (আমার ধারণা, যদিও এটি পরীক্ষা করা হয়নি) G=[s]-> *G=s
লুভজো

পরামর্শের জন্য ধন্যবাদ @Loovjo, except:0, l+=a,bএবং s=[0]*(1+L(I[0])*2)সত্যিই সাহায্য করেছিল। দুর্ভাগ্যক্রমে, যে কারণেই হোক না কেন, ফাংশন কলে সি প্রদান করা এটি একাধিক কলগুলির উপর পুনরায় সেট করে না যার অর্থ এটি কাজ করা বন্ধ করে দিয়েছে, জি [আর] [সি] একটি স্ট্রিং হতে পারে যাতে আমি এতে এবং < * জি = গুলি আমাকে একটি সিনট্যাক্স ত্রুটি দিয়েছে। তবুও, দুর্দান্ত পরামর্শ।
বেনামে নো লাইফার

1
@ অজ্ঞাতনামা এছাড়াও, যদি G[r][c]স্ট্রিং হতে পারে তবে G[r][c]in[1,2]কাজ করা উচিত।
লুভজো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.