Mercurial > hg > lib > markup
annotate python/safe.py @ 12:1e42c0147a49
minutor changed file format for minecraft 1.18
author | Henry S. Thompson <ht@inf.ed.ac.uk> |
---|---|
date | Sat, 11 Dec 2021 16:30:29 -0500 |
parents | e411408d64ec |
children | 1cd5c7952aaa |
rev | line source |
---|---|
4 | 1 #!/usr/bin/python3 |
2 '''Find a safe landing space (i.e. in air, not above lava) near a cluster''' | |
3 import sys, math | |
4 | |
5 from util import * | |
10 | 6 from bisect import insort |
4 | 7 |
8 def usage(): | |
10 | 9 print("""Usage: safe.py [-d n] [filename] |
4 | 10 n is maximum distance of landing to some point in the cluster, default is 10. |
11 | |
12 Feed stdin with lines from the output of cluster.py, having produced | |
13 air.tsv with the same settings as the cluster input, and lava.tsv | |
14 with a lower-bound on Y of 0""") | |
15 | |
16 class Block: | |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
17 '''Shared by Air and Lava, |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
18 holds points and columns. |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
19 Columns are dictionaries indexed by (x,z) coords, |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
20 value is upward-ordered list of pairs, closed intervals of y''' |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
21 def __init__(self,filename): |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
22 with open(filename,'r') as file: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
23 self.readHeaders(file) |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
24 self.readPoints(file) |
4 | 25 |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
26 cc=self.columns={} |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
27 tc={} |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
28 for p in self.points: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
29 k=(p[0],p[2]) |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
30 y=p[1] |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
31 try: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
32 yy=tc[k] |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
33 insort(yy,y) |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
34 except KeyError: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
35 tc[k]=[y] |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
36 # convert to lists of intervals |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
37 for k,yy in tc.items(): |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
38 tyy=[yy] |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
39 ii=[] |
11 | 40 if k==(108.5, -45.5): |
41 pass | |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
42 while True: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
43 clean=True |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
44 for j,yy in enumerate(tyy): |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
45 if len(yy)==1+(yy[-1]-yy[0]): |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
46 ii.append((yy[0],yy[-1])) |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
47 else: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
48 clean=False |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
49 for i in range(len(yy)-1): |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
50 if yy[i]+1!=yy[i+1]: |
11 | 51 ii.append((yy[0],yy[i])) |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
52 tyy=[yy[i+1:]]+tyy[j+1:] |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
53 break |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
54 if clean: |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
55 break |
10 | 56 self.columns[k]=set(ii) # so we can merge later |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
57 |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
58 def readPoints(self,file): |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
59 file.readline() |
12
1e42c0147a49
minutor changed file format for minecraft 1.18
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
11
diff
changeset
|
60 self.points=[[float(i) for i in l.split('\t')[2].split('/')] for l in file] |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
61 |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
62 Block.readHeaders=readHeaders # from util |
4 | 63 |
64 class Air(Block): | |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
65 pass |
4 | 66 |
67 | |
68 class Lava(Block): | |
8
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
69 pass |
fcef94b6324c
move all the action to Block
Henry S. Thompson <ht@inf.ed.ac.uk>
parents:
7
diff
changeset
|
70 |
4 | 71 def d(p1,p2): |
72 dx=p1[0]-p2[0] | |
73 dz=p1[1]-p2[1] | |
74 dy=p1[2]-p2[2] | |
75 return math.sqrt((dx*dx)+(dy*dy)+(dz*dz)) | |
76 | |
9 | 77 def safety(p): |
11 | 78 ka=[((a[0],a[2]),d(a,p)) for a in A.points if d(a,p)<=n] |
79 return [(k,A.columns[k[0]],L.columns.get(k[0],None)) for k in ka] | |
80 | |
81 if __name__=='__main__': | |
82 n=10.0 | |
83 if len(sys.argv)>1: | |
84 if sys.argv[1]=='-d': | |
85 sys.argv.pop(1) | |
86 n=float(sys.argv.pop(1)) | |
87 | |
88 if len(sys.argv)>1: | |
89 infile=open(sys.argv.pop(1)) | |
90 else: | |
91 infile=sys.stdin | |
92 | |
93 A=Air('air.tsv') | |
94 | |
95 L=Lava('lava.tsv') | |
96 | |
97 readHeaders(sys.modules['__main__'],infile,False) | |
4 | 98 |
11 | 99 for l in infile: |
100 c=eval(l) | |
101 ss=[] | |
102 hits={} | |
103 misses=[] | |
104 for p in c: | |
105 ss=safety(p) | |
106 if ss: | |
107 for (k,a,l) in ss: | |
108 try: | |
109 (aa,ll)=hits[k] | |
110 aa.update(a) | |
111 if l is not None: | |
112 ll.update(l) | |
113 except KeyError: | |
114 hits[k]=(a,l) | |
115 else: | |
116 misses.append(p) | |
117 print(c) | |
118 if hits: | |
119 print(' %s nearby landing columns'%len(hits)) | |
120 done={} | |
121 for k in sorted(hits.keys(),key=lambda k:k[1]): | |
122 if k[0] not in done: | |
123 done[k[0]]=1 | |
124 aa,ll=hits[k] | |
125 laa=sorted(list(aa)) | |
126 lowAir=laa[0][0] | |
127 j=-1 | |
128 if ll is not None: | |
129 lll=sorted(list(ll)) | |
130 highLava=-1 | |
131 for i,(_,h) in enumerate(lll): | |
132 if h>highLava and h<lowAir: | |
133 highLava=h | |
134 if h+1==lowAir: | |
135 j=i | |
136 break | |
137 if j>-1: | |
138 lava='['+','.join(str(e) if i!=j else \ | |
139 "(%s,%s)"%(e[0],RedFmt%e[1]) for i,e in enumerate(lll))+']' | |
140 lowAir=RedFmt%lowAir | |
141 else: | |
142 lava=None | |
143 else: | |
144 lava=None | |
145 print("%s(%s %s %s)@%0.1f: %s %s"%(' ' if j>-1 else '', | |
146 k[0][0],lowAir,k[0][1],k[1],laa,lava)) | |
9 | 147 else: |
11 | 148 print(' No nearby landing zones') |
10 | 149 |
11 | 150 if infile!=sys.stdin: |
151 infile.close() |