挑战
根据字符数的最短代码,以帮助机器人在最少的步骤中找到小猫。
高尔夫球手,这是一个危机的时刻-小猫失踪,这是机器人的工作,以找到它!机器人需要在最短的路径上到达Kitten。然而,机器人的道路上有很多障碍,他需要你为他设计一个解决方案。
机器人曾经有一个程序替他做,但是那个程序丢失了,机器人没有备份。
机器人的运行时不是最好的,最少的字符机器人必须从源代码中读取,它将花费最少的时间来处理,这意味着Kitten会被更快地找到!
机器人的记忆包含他目前所在位置的地图,顶部代表北方,底部代表南方,右边代表东方,左边代表西方。机器人总是在一个未知大小的长方形房间里,周围是墙壁,在雷达地图上以#为代表。机器人可以行走的区域是由一个空间代表的。
机器人的雷达还扫描房间里的许多障碍物,并用各种ASCII字母标记它们。机器人不能穿过这些障碍物。雷达将将Kitten标记为特殊的ASCII字符K,而机器人的位置将被标记为R。
机器人的导航系统就是这样工作的:他可以理解两个方向和移动单位的数量--例如,N 3的意思是‘向北走3个运动单位’。机器人的雷达地图是这样一个运动单位是一个ASCII字符。机器人只能朝四个方向走,不能斜行。
你的任务,勇敢的小猫保护,是读一次机器人的雷达地图,并输出最少的方向,最小的移动单位的旅行距离。机器人保证至少有一条通往Kitten的路。
为了确保机器人不会浪费时间执行一个无法帮助机器人找到Kitten的故障程序,我鼓励您,勇敢的Kitten保护程序,使用机器人过去程序的输出,以确保不会浪费在寻找Kitten上的时间!
Input:
######################
# d 3 Kj #
# #
# R #
# q #
######################
Output:
E 13
N 2Input:
######################
# d r 3 Kj #
# p p #
# T X #
# q s t #
# #
# R o d W #
# #
# g t U #
# #
######################
Output:
N 1
E 10
N 4
E 2Input:
######################
# spdfmsdlwe9mw WEK3#
# we hi #
# rdf fsszr#
# sdfg gjkti #
# fc d g i #
# dfg sdd #
# g zfg #
# df df #
# xcf R#
######################
Output:
N 1
W 9
N 5
E 4
N 1
E 4
N 1代码计数包括输入/输出(即完整程序)。
发布于 2011-02-06 17:03:09
...but --它不以最少的方向来解决联系(虽然它确实找到了最少的步骤)。
val m=io.Source.stdin.getLines.map(_.toArray).toSeq
var l=m.indexWhere(_ contains'R')
var c=m(l)indexOf'R'
val q=collection.mutable.Queue(l->c->"")
def s{val((l,c),p)=q.dequeue
if("R "contains m(l)(c))for((i,j,k)<-Seq((-1,0,"N"),(0,1,"E"),(1,0,"S"),(0,-1,"W")))q.enqueue(((l+i,c+j),p+k))
m(l)(c)='X'}
def P(s:String){if(s.nonEmpty){val (h,t)=s.span(s.head==)
println(s.head+" "+h.size)
P(t)}}
def Q{s
val((l,c),p)=q.head
if (m(l)(c)=='K')P(p)else Q}
QScala 2.8,642个字符,正确解决领带;
val m=io.Source.stdin.getLines.toSeq
var b=Map(0->0->0).withDefault(_=>Int.MaxValue)
var l=m.indexWhere(_ contains'R')
var c=m(l)indexOf'R'
val q=collection.mutable.PriorityQueue(l->c->List((' ',0)))(Ordering.by(t=>(-t._2.map(_._2).sum,-t._2.size)))
def s{val(p@(l,c),u@(h@(d,n))::t)=q.dequeue
if("R ".contains(m(l)(c))&&u.map(_._2).sum<=b(p)){b=b.updated(p,u.map(_._2).sum)
for((i,j,k)<-Seq((-1,0,'N'),(0,1,'E'),(1,0,'S'),(0,-1,'W'))){
val o=if(k==d)(d,n+1)::t else (k,1)::h::t
q.enqueue(((l+i,c+j),o))}}}
def P(l:List[(Char,Int)]){l.reverse.tail.foreach{t=>println(t._1+" "+t._2)}}
def Q{s;val((l,c),p)=q.head;if (m(l)(c)=='K')P(p)else Q}
Q它发现第二个例子的路径比问题中给出的路径更短:
N 1
E 10
N 4
E 2发布于 2011-02-06 12:27:00
import sys,itertools
W,Q=len,list
M=[]
B=[]
for l in sys.stdin.readlines():
r=Q(l.strip())
B.append([0]*W(r))
M.append(r)
if "R" in r:x,y=r.index("R"),W(B)-1
def S(B,M,x,y,P):
c=M[y][x]
b=B[y][x]
if b and W(P)>b:return 0
B[y][x]=W(P)
if c=="K":return P
elif c=="R" and P:return 0
if c in "R ":
b=[]
for q,w,s in((1,0,"E"),(-1,0,"W"),(0,-1,"N"),(0,1,"S")):
r=S(B,M,x+q,y+w,P+s)
if r and(W(r)<W(b)or not b):b=r
if b:return b
return 0
print "\n".join(k+str(W(Q(g)))for k,g in itertools.groupby(S(B,M,x,y,"")))发布于 2011-02-15 15:56:19
exec 'eJzNlLFugzAQhneewhki2/KBworksVOkDu3QgVqVE2hBioFgCDhV371nJ1VbKR3SKYtl/jvs77MwtenafiBVqbs9WGcjLW05MB69tj05QEfqhpTNaMpeDyXDhsQORd3wLCK+YwT7u6PzFVK/Ep9Tsn6gmU50UTA2woHzc01KuqYZ20PPZSh85/iCO2etzBnTG8tcvlLxnovTPFVxzyGEC4lpiBay5xiuYMXBcRVtzxqTfP+IpqrelaRFsheoYJbBNvFj13asxd23gXHGmZU7bTaFDgiZH+MUYydtKBuZRuS0nvPmOt564Sl3CmlxcWAG6D3lXIkpeUMGB7nyfj82HW3FWvjTTVSYCXNJEUupEimannu+nl04WyM8XoB1F13E9S6Pt+ki0vDZXOdyd5su8X9cnm7DBa/tLGW4yh7yKCn1rIF+9vSTj/HiBeqCS1M3bMrnwOvbl5Ysi+eGLlkBhosjxl1fNwM5Ak7xH6CiT3SdT4U='.decode('base64').decode('zlib')解包到一个严重虐待的A*实现。读着史丁。搜索最小总距离的解决方案。通过选择最少的方向来打破联系。列出向stdout的移动。找到小猫了。
该源已被手动反黄金在一些地方,以获得一个较小的压缩表示。例如,在指南针方向上展开了一个For循环。
import heapq,sys
a=set()
for v,p in enumerate(sys.stdin):
for u,s in enumerate(p):
if s in' KR':a.add((u,v))
if s=='K':(q,r)=(u,v)
if s=='R':y=(u,v)
o=[((abs(y[0]-q)+abs(y[1]-r),(y[0]!=q)+(y[1]!=r)),(0,0),y)]
c=set()
w={}
while o:
_,h,x=heapq.heappop(o)
c.add(x)
s=lambda(u,v):(u,v-1)
y=s(x)
m=1
while y in a-c:
w[y]=[(h,x,(m,'N'))]+w.get(y,[])
heapq.heappush(o,((abs(y[0]-q)+abs(y[1]-r)+h[0]+m,(y[0]!=q)+(y[1]!=r)+h[1]+1),(h[0]+m,h[1]+1),y))
m+=1
y=s(y)
s=lambda(u,v):(u,v+1)
y=s(x)
m=1
while y in a-c:
w[y]=[(h,x,(m,'S'))]+w.get(y,[])
heapq.heappush(o,((abs(y[0]-q)+abs(y[1]-r)+h[0]+m,(y[0]!=q)+(y[1]!=r)+h[1]+1),(h[0]+m,h[1]+1),y))
m+=1
y=s(y)
s=lambda(u,v):(u+1,v)
y=s(x)
m=1
while y in a-c:
w[y]=[(h,x,(m,'E'))]+w.get(y,[])
heapq.heappush(o,((abs(y[0]-q)+abs(y[1]-r)+h[0]+m,(y[0]!=q)+(y[1]!=r)+h[1]+1),(h[0]+m,h[1]+1),y))
m+=1
y=s(y)
s=lambda(u,v):(u-1,v)
y=s(x)
m=1
while y in a-c:
w[y]=[(h,x,(m,'W'))]+w.get(y,[])
heapq.heappush(o,((abs(y[0]-q)+abs(y[1]-r)+h[0]+m,(y[0]!=q)+(y[1]!=r)+h[1]+1),(h[0]+m,h[1]+1),y))
m+=1
y=s(y)
if x==(q,r):
z=''
while x in w:
_,x,(m,d)=min(w[x])
z='%s %d\n'%(d,m)+z
print z,
o=[]https://codegolf.stackexchange.com/questions/586
复制相似问题