Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''
- Lassin hieno ratkaisu tehtävään pt2
- '''
- import os
- MAP1 = '''######
- #..T.#
- #P..G#
- #..T.#
- ######'''
- MAP2 = '''######
- #T...#
- #P..G#
- #....#
- ######'''
- MAP3 = '''######
- #..#.#
- #P.#G#
- #..#.#
- ######'''
- MAP4 = '''############
- #T.G....T..#
- #..##...#G.#
- #...G...#..#
- #G..##..TG.#
- #.T........#
- #...P......#
- #...#..G...#
- #..G#....T.#
- #...#.G....#
- #......T...#
- ############'''
- def safe_gold(map: str):
- '''
- Funktio kertoo montako turvallista saavutettavissa olevaa kultaa
- kartalla on.
- :param map: str, kartta
- :return: int, turvallisten kultien määrä
- '''
- map_in_rows = map.splitlines()
- # pähee upee hakukone
- def xy(coord: tuple, dir = 0):
- '''
- Funktio palauttaa koordinaatteja vastaavan ruudun arvon
- kartasta. Jos funktiolle annetaan suunta (dir), se palauttaa siinä
- suunnassa olevan ruudun arvon.
- Suunnat:
- 1: ylös
- 2: oikealle
- 3: alas
- 4: vasemmalle
- Koordinaattien periaate
- 0 1 2 3 4 5 (x)
- 0 # # # # # #
- 1 # T . . . #
- 2 # P . . G #
- 3 # . . . . #
- 4 # # # # # #
- (y)
- :param x: int, x-koordinaatti
- :param y: int, y-koordinaatti
- :return1: ruudun sisältö
- :return2: ruudun koordinaatit
- '''
- x, y = coord
- if dir == 0:
- return (map_in_rows[y])[x] , (x, y)
- elif dir == 1:
- return (map_in_rows[y - 1])[x] , (x, y - 1)
- elif dir == 2:
- return (map_in_rows[y])[x + 1] , (x + 1, y)
- elif dir == 3:
- return (map_in_rows[y + 1])[x] , (x, y + 1)
- elif dir == 4:
- return (map_in_rows[y])[x - 1] , (x - 1, y)
- def in_danger(coord):
- '''
- Funktio kertoo onko pelaaja vaarassa annetussa ruudussa
- '''
- danger = False
- for i in range(1, 5):
- if xy(coord, i)[0] == "T":
- danger = True
- return danger
- def is_wall(coord):
- '''
- Funktio kertoo onko annetuissa koordinaateissa seinä
- '''
- if xy(coord) == "#":
- return True
- else:
- return False
- # etsitään lähtöruutu ja tallennetaan se
- start = ()
- for i1, row in enumerate(map_in_rows):
- for i2, square in enumerate(row):
- if square == "P":
- start = (i2, i1)
- # käydyt ruudut
- visited = set()
- # seuraavaksi käytävät ruudut
- # aloitetaan P-kirjaimesta, eli lähdöstä
- visit_next = {start}
- # kultien määrä
- golds = 0
- while visit_next:
- # löydetyt ruudut, joihin voi mennä
- discovered = set()
- for square in visit_next:
- # jos ruudussa on kultaa, päivitetään kultien määrä
- if xy(square)[0] == "G":
- golds += 1
- # jos ruudun vieressä on ansa, ei ruudusta voi liikkua
- if in_danger(square):
- continue
- elif square in visited:
- continue
- # käydään läpi ruudun viereiset ruudut ja lisätään ne seuraavaksi
- # käytäviin ruutuihin, jos viereisessä ruudussa on seinä, ei sitä
- # lisätä
- for i in range(1, 5):
- value, coord = xy(square, i)
- if value == "#":
- continue
- if coord not in visited:
- discovered.add(coord)
- # lisätään juuri käydyt ruudut käytyjen listaan
- visited.update(visit_next)
- # päivitetään seuraavaksi käytäväksi juuri löydetyt uudet ruudut
- visit_next = discovered
- return golds
- def main():
- print()
- print(os.getcwd())
- # testailua
- print("safe golds in 1. map")
- print(safe_gold(MAP1))
- print()
- print("safe golds in 2. map")
- print(safe_gold(MAP2))
- print()
- print("safe golds in 3. map")
- print(safe_gold(MAP3))
- print()
- print("safe golds in 4. map")
- print(safe_gold(MAP4))
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement