Kod: Zaznacz cały
MISJA 008 goo.gl/gg4QcA DIFFICULTY: █████████░ [9/10]
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅
Otrzymaliśmy dość nietypową prośbę o pomoc od lokalnego Instytutu Archeologii.
Okazało się, iż podczas prac remontowych studni w pobliskim zamku odkryto
niewielki tunel. Poproszono nas abyśmy skorzystali z naszego autonomicznego
drona wyposażonego w LIDAR (laserowy skaner odległości zamontowany na obracającej
się platformie) do stworzenia mapy tunelu.
Przed chwilą dotarliśmy na miejsce i opuściliśmy drona do studni. Interfejs I/O
drona znajduje się pod poniższym adresem:
http://gynvael.coldwind.pl/misja008_drone_output/
Powodzenia!
--
Korzystając z powyższych danych stwórz mapę tunelu (i, jak zwykle, znajdź tajne
hasło). Wszelkie dołączone do odpowiedzi animacje są bardzo mile widziane.
Odzyskaną wiadomość (oraz mapę) umieśc w komentarzu pod tym video :)
Linki do kodu/wpisów na blogu/etc z opisem rozwiązania są również mile widziane!
HINT 1: Serwer może wolno odpowiadać a grota jest dość duża. Zachęcam więc do
cache'owania danych na dysku (adresy skanów są stałe dla danej pozycji i nigdy
nie ulegają zmianie).
HINT 2: Hasło będzie można odczytać z mapy po odnalezieniu i zeskanowaniu
centralnej komnaty.
P.S. Rozwiązanie zadania przedstawie na początku kolejnego livestreama.
Pod linkiem: http://gynvael.coldwind.pl/misja008_drone_output/ jest przekierowanie do: http://gynvael.coldwind.pl/misja008_drone_io/ gdzie jest opis interejsu:
Kod: Zaznacz cały
SCAN DRONE v0.17.3
CLASSIFIED DATA. FOR YOUR EYES ONLY.
-- Podręcznik Operatora
1. Dron posiada zamontowany obrotowy LIDAR.
2. Dron automatycznie wykonuje skan LIDARem w każdym nowym miejscu.
3. Skan odbywa się co 10 stopni i zwraca odległość w metrach.
4. Zerowy stopien oznacza kierunek północny.
5. Odległość może być niedokładna, szczególnie w okolicy ciasnych przejść.
6. Zasięg LIDARu to 50m. Powyżej tej odległości zwracany jest "inf".
7. Skan zawsze odbywa sie na wysokosci 1m nad powierzchnia.
8. Dron zawsze porusza się o dokładnie jeden metr.
9. Dron podaje swoją pozycję w metrach na osi zachód-wschód oraz
północ-południe od ustawionego przez operatora (na stałe) nadajnika.
10. Dron może się poruszać jedynie w kierunkach wschód/zachód/północ/południe.
-- Format Danych
SCAN DRONE v0.17.3
POZYCJA_DRONA_X POZYCJA_DRONA_Y
ODLEGLOSC_NA_KĄCIE_0
ODLEGLOSC_NA_KĄCIE_10
ODLEGLOSC_NA_KĄCIE_20
...
ODLEGLOSC_NA_KĄCIE_350
MOVE_EAST: ADRES_PRZESUWAJĄCY_NA_WSCHÓD_LUB_"not possible"
MOVE_WEST: ADRES_PRZESUWAJĄCY_NA_ZACHÓD_LUB_"not possible"
MOVE_SOUTH: ADRES_PRZESUWAJĄCY_NA_POŁUDNIE_LUB_"not possible"
MOVE_NORTH: ADRES_PRZESUWAJĄCY_NA_PÓŁNOC_LUB_"not possible"
-- Dane
Zamiast się bawić w matematykę, postanowiłem pobrać wszystkie punkty i je wyświetlić, odpaliłem poniższy skrypt na noc, rano przerwałem po pobraniu ponad 178 tys plików. Sporo tego, trzeba teraz je jakoś wyświetlić.
Kod: Zaznacz cały
import os
import urllib2
import StringIO
#goo.gl/gg4QcA
url = "http://gynvael.coldwind.pl/misja008_drone_io/scans/"
nod = "68eb1a7625837e38d55c54dc99257a17.txt"
path = "robot/"
def read_node(nod):
ret = []
if not os.path.isfile(path+nod):
try:
r = urllib2.urlopen(url+nod).read()
f = open(path+nod, 'w')
f.write(r)
f.close()
except:
ret.append(nod)
print "TIMEOUT:", nod
return ret
for line in StringIO.StringIO(r):
sline = line.split(' ')
if sline[0] == "MOVE_EAST:" or sline[0] == "MOVE_WEST:" or sline[0] == "MOVE_SOUTH:" or sline[0] == "MOVE_NORTH:":
print nod, line.strip()
if sline[1] != "not":
ret.append(sline[1].strip())
return ret
def search_nodes():
nodes = read_node(nod)
while len(nodes):
nodes += read_node(nodes.pop())
if __name__ == "__main__":
search_nodes()
W każdym pobranym pliku, w drugiej linii mamy współrzędne drona, wystarczy zapalić ten bit na teksturze, do tego celu wykorzystałem poniższy program:
Kod: Zaznacz cały
import Image
import os
path = "robot/"
licznik = 0
im = Image.new('RGB', (2000,2000))
for filename in os.listdir(path):
licznik += 1
f = open(path + filename, 'r')
l = f.readline()
l = f.readline()
f.close()
ll = l.split(' ')
x = int(ll[0])
y = int(ll[1])
try:
im.putpixel((x,y), (255,255,255))
except:
print "error", x, y
im.save("out.bmp")
if licznik%1000 == 0:
im.save("out.bmp")
print licznik
im.save("out.bmp")
Tajne hasło to SECRET: DRON3$C4N