পাঠ্য বিস্ময়কর সমাধানকারী


14

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

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

আপনি ধরে নিতে পারেন:

  • প্রবেশ এবং প্রস্থান পয়েন্টগুলি ইনপুটটির প্রান্তে রয়েছে
  • ইনপুটটির প্রতিটি লাইনের দৈর্ঘ্য একই থাকে
  • গোলকধাঁটি দ্রবণীয় এবং কোনও চক্র নেই
  • শুধুমাত্র একটি প্রস্থান পয়েন্ট আছে

(ইউনিকোড) দ্বারা সংক্ষিপ্ততম সমাধানটি অক্ষর গণনা জিতবে।

উদাহরণ

(দ্রষ্টব্য যে ইনপুটগুলি স্পেস দিয়ে প্যাড করা হয়েছে)

####   
#  #   
@ #####
#     #
#      
#######

####
#  #
@*#####
#*    #
#******
#######

### ###################
###         #         #
##  #########      #  #
 #             #####  #
 ###############   #@##

###*###################
###*********#*********#
## *#########*     # *#
 # *********** #####**#
 ###############   #@##

আমি কি শেষ পয়েন্টের জন্য একটি চরিত্র যুক্ত করতে পারি? আমার প্রোগ্রামটি কখন শেষ হবে তা জানার জন্য এটি আরও সহজ করে তুলবে।
পিটার ওলসন

@ পিটার অফ কর্ন: অবশ্যই পুরো পথটি আঁকতে আপনাকে একই অক্ষর ব্যবহার করতে হবে না, এটি কেবলমাত্র বাকি আউটপুট থেকে পৃথক হতে হবে।
লোজ্যাকার

উত্তর:


5

রুবি 1.9, 244 টি অক্ষর

l=*$<
i=l*""
e=[]
d=[1,-1,x=l[0].size,-x]
r=[f=9e9]*s=x*b=l.size;r[i=~/@/]=0
r.map{i.gsub(/ /){r[p=$`.size]=d.map{|u|p>-u&&r[u+p]||f}.min+1;e<<p if p%x%~-~-x*(p/-~x%~-b)<1}}
r[g=e.find{|i|r[i]<f}].times{i[g]=?*;g+=d.find{|l|r[g]>r[g+l]}}
puts i

দুটি উদাহরণের জন্য আউটপুট:

####   
#  #   
@*#####
#*    #
#******
#######

###*###################
###*        #     *** #
## *######### *****#* #
 # ************#####* #
 ###############   #@##

সম্পাদনা:

  • (247 -> 245) ইনলাইন করা ই এবং এর নাম পরিবর্তন করে জি
  • (245 -> 249) প্রস্থানটি সরাসরি প্রবেশদ্বারের উপরে উঠলে একটি বাগ ঠিক করুন
  • (249 -> 246) ইনলাইন করা + সরলীকরণ
  • (246 -> 244) প্রতিটি ক্ষেত্রের মধ্যে পুনরাবৃত্তি করার ছোট উপায়

8

এএনএসআই সি ( 384 373 368 টি অক্ষর)

আমার সি চেষ্টা এখানে। সংকলিত এবং ম্যাক ওএস এক্সে চালিত

m[9999],*r=m,*s=m,c,R=0,*a,L;
P(){while(*s++)putchar(*(s-1));}
C(int*l){if((l-s+2)%R==0||(l-s)%R==0||l-s<R||l>r-R)*l=42,P(),exit(0);}
e(int*l){if(*l==32)C(l),*l=42,e(l-1),*l=32,*l=42,e(l-R),*l=32,*l=42,e(l+1),*l=32,*l=42,e(l+R),*l=32;}
main(){while(~(c=getchar()))*r++=c,R=!R&&c==10?r-s:R,L=c==64?r-s-1:L;L%R==0&&e(s+L+1);(L+2)%R==0&&e(s+L-1);L<R&&e(s+L+R);e(s+L-R);}

কয়েকটি পরীক্ষার জন্য নমুনা আউটপুট:

####   
#  #   
@*#####
#*****#
#    *#
#####*#

###*###################
###*        #******** #
##**#########**    #* #
 #*************#####* #
 ###############   #@##

সীমাবদ্ধতা: কেবলমাত্র 1000 অক্ষর পর্যন্ত ম্যাসেজের জন্য কাজ করে তবে এটি সহজেই বাড়ানো যায়। আমি ম্যালোক / রিম্যালোককে বিরক্ত করার চেয়ে স্বেচ্ছাসেবী সংখ্যাটি বেছে নিয়েছি।

এছাড়াও, এটি আমি লিখেছি সবচেয়ে সতর্কতা-বোঝার কোড। 19 সতর্কতা, যদিও এটি XCode কোড হাইলাইট করার সাথে আরও বেশি দেখাচ্ছে। : ডি

সম্পাদনা: সম্পাদনা করা হয়েছে এবং প্রধান থেকে ইন্ট ড্রপ পরীক্ষা করতে হবে! = এর পরিবর্তে = ইওএফ এবং প্রিন্টফের পরিবর্তে পুটচার ব্যবহার করতে। মন্তব্যের জন্য ধন্যবাদ!


আপনি 9999 টি ব্যবহার করতে পারেন - এটি একই সংখ্যক অক্ষর
লোজ্যাকার

সাবাশ! int আগে " " ছেড়ে দিন mainএবং 4 টি অক্ষর সংরক্ষণ করুন। আরও 4 টি সঞ্চয় করার putchar(*(s-1))পরিবর্তে ব্যবহার করুন printf("%c",*(s-1))
কেসি

এছাড়াও আপনি প্রতিস্থাপন করতে পারেন 0xAদ্বারা 10এবং !=দ্বারা ^
লোজ্যাকার

আরও ভাল: আপনি ~EOF পরীক্ষা করতে অপারেটরটি ব্যবহার করতে পারেন :while(~(c=getchar())
লোজ্যাকার

আমি '@' এর বিভ্রান্তির এল, অবস্থান নির্ধারণের জন্য! এল ও অ্যান্ড গার্ডকেও ফেলে দিতে পারি।
জোনাথন ওয়াটমুফ

4

পাইথন, 339 অক্ষর

import sys
M=list(sys.stdin.read())
L=len(M)
R=range(L)
N=M.index('\n')+1
D=2*L*[9e9]
D[M.index('@')+N]=0
J=(1,-1,N,-N)
for x in R:
 for i in[N+i for i in R if' '==M[i]]:D[i]=min(1+D[i+j]for j in J)
e=[i+N for i in R[:N]+R[::N]+R[N-2::N]+R[-N:]if 0<D[i+N]<9e9][0]
while D[e]:M[e-N]='*';e=[e+j for j in J if D[e+j]<D[e]][0]
print''.join(M)

গোলকধাঁধার মধ্য দিয়ে একটি সংক্ষিপ্ততম পথ তৈরি করে।

উদাহরণস্বরূপ mazes এর আউটপুট:

####   
#  #   
@*#####
#*    #
#******
#######

###*###################
###*        #     *** #
## *######### *****#* #
 # ************#####* #
 ###############   #@##

এন দ্বারা সমস্ত সংযোজন এবং বিয়োগ কেন?
লোজ্যাকার

এটি 10 ​​লাইনের ইনডেক্সিং ডি [i + j] ને নেতিবাচক হতে বাধা দেয়। এবং ডি [ই + জ] লাইনে 12
কিথ র্যান্ডাল

1

পাইথন - 510 421 অক্ষর

m=[]
i=raw_input
l=i()
x=y=-1
while l:
 if y<0:x+=1;y=l.find('@')
 m.append(list(l));l=i()
s=(x,y)
t={}
q=[s]
v={s:1}
while 1:
 try:(i,j),q=q[0],q[1:];c=m[i][j]
 except:continue
 if c==' 'and(i*j==0)|(i+1==len(m))|(j+1==len(m[0])):break
 for d,D in(-1,0),(0,-1),(1,0),(0,1):
  p=(i+d,j+D)
  if not p in v and'#'!=c:v[p]=0;q.append(p);t[p]=(i,j)
while(i,j)!=s:m[i][j]='*';i,j=t[(i,j)]
print'\n'.join(''.join(l)for l in m)

আমি *প্রথম পরীক্ষার ক্ষেত্রে নীচে-ডানদিকে একটি পাইথার (পাইথন ২. 2..১) পেয়ে যাচ্ছি । কোন চিন্তা?
লোজ্যাকার

@ লাওজ্যাকার ধন্যবাদ, মনে হচ্ছে যে গল্ফ করার সময় আমি একটি বাগ যুক্ত করেছি যা এটি দেখে মনে হয়েছিল এটি কাজ করেছে তবে কেবল পরীক্ষার ক্ষেত্রে, এবং তারপরেও: পি
জুয়ান

ভাল, এটি এখন কাজ করে। তবে আপনি যেটি print b,rএবং print (i,j)ডিবাগ করার জন্য আমার ধারণা ছিল তা বের করতে ভুলে গিয়েছিলেন :)
লোজ্যাকার

0

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

import sys
def q(g,s=[]):w=len(g[0])+1;k='@'.join(g)+w*'@';*p,x=s or[k.find('#')];return'@'>k[x]and{x}-{*p}and[p,min((q(g,s+[x+a])or k for a in(-1,1,-w,w)),key=len)]['*'>k[x]]
g=''.join(sys.stdin.read());s=q(g.split('\n'))
for i in range(len(g)):print(end=[g[i],'+'][i in s])

এটি অনলাইন চেষ্টা করুন!

একটি ASCII রাস্তায় সবচেয়ে সংক্ষিপ্ত রুটটি খুঁজে পেতে আমার উত্তর বন্দর

ব্যবহার '#'শুরুর জন্য, '*'শেষ জন্য, '@'প্রাচীর এবং ' 'খালি জায়গা জন্য। এতে, ফাংশনটি qহেল্পার ফাংশন যা গোলকধাঁধার সবচেয়ে সংক্ষিপ্ত পথ সহ এক-মাত্রিক অ্যারে প্রদান করে। fভেরিয়েবলটি বরাদ্দ না করে ফাংশনটি 4 বাইট ছোট করা যায় s। এটি অবিশ্বাস্যভাবে অক্ষম এবং সম্ভবত সময় শেষ হবে, কারণ এটি গোলকধাঁধার প্রতিটি চরিত্রের জন্য পথ সন্ধানের ফাংশনটি ডেকে আনে।

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