diff --git a/es02/.vscode/.ropeproject/config.py b/es02/.vscode/.ropeproject/config.py new file mode 100644 index 0000000..0bf7750 --- /dev/null +++ b/es02/.vscode/.ropeproject/config.py @@ -0,0 +1,112 @@ +# The default ``config.py`` +# flake8: noqa + + +def set_prefs(prefs): + """This function is called before opening the project""" + + # Specify which files and folders to ignore in the project. + # Changes to ignored resources are not added to the history and + # VCSs. Also they are not returned in `Project.get_files()`. + # Note that ``?`` and ``*`` match all characters but slashes. + # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc' + # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc' + # '.svn': matches 'pkg/.svn' and all of its children + # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o' + # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o' + prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject', + '.hg', '.svn', '_svn', '.git', '.tox'] + + # Specifies which files should be considered python files. It is + # useful when you have scripts inside your project. Only files + # ending with ``.py`` are considered to be python files by + # default. + #prefs['python_files'] = ['*.py'] + + # Custom source folders: By default rope searches the project + # for finding source folders (folders that should be searched + # for finding modules). You can add paths to that list. Note + # that rope guesses project source folders correctly most of the + # time; use this if you have any problems. + # The folders should be relative to project root and use '/' for + # separating folders regardless of the platform rope is running on. + # 'src/my_source_folder' for instance. + #prefs.add('source_folders', 'src') + + # You can extend python path for looking up modules + #prefs.add('python_path', '~/python/') + + # Should rope save object information or not. + prefs['save_objectdb'] = True + prefs['compress_objectdb'] = False + + # If `True`, rope analyzes each module when it is being saved. + prefs['automatic_soa'] = True + # The depth of calls to follow in static object analysis + prefs['soa_followed_calls'] = 0 + + # If `False` when running modules or unit tests "dynamic object + # analysis" is turned off. This makes them much faster. + prefs['perform_doa'] = True + + # Rope can check the validity of its object DB when running. + prefs['validate_objectdb'] = True + + # How many undos to hold? + prefs['max_history_items'] = 32 + + # Shows whether to save history across sessions. + prefs['save_history'] = True + prefs['compress_history'] = False + + # Set the number spaces used for indenting. According to + # :PEP:`8`, it is best to use 4 spaces. Since most of rope's + # unit-tests use 4 spaces it is more reliable, too. + prefs['indent_size'] = 4 + + # Builtin and c-extension modules that are allowed to be imported + # and inspected by rope. + prefs['extension_modules'] = [] + + # Add all standard c-extensions to extension_modules list. + prefs['import_dynload_stdmods'] = True + + # If `True` modules with syntax errors are considered to be empty. + # The default value is `False`; When `False` syntax errors raise + # `rope.base.exceptions.ModuleSyntaxError` exception. + prefs['ignore_syntax_errors'] = False + + # If `True`, rope ignores unresolvable imports. Otherwise, they + # appear in the importing namespace. + prefs['ignore_bad_imports'] = False + + # If `True`, rope will insert new module imports as + # `from import ` by default. + prefs['prefer_module_from_imports'] = False + + # If `True`, rope will transform a comma list of imports into + # multiple separate import statements when organizing + # imports. + prefs['split_imports'] = False + + # If `True`, rope will remove all top-level import statements and + # reinsert them at the top of the module when making changes. + prefs['pull_imports_to_top'] = True + + # If `True`, rope will sort imports alphabetically by module name instead of + # alphabetically by import statement, with from imports after normal + # imports. + prefs['sort_imports_alphabetically'] = False + + # Location of implementation of rope.base.oi.type_hinting.interfaces.ITypeHintingFactory + # In general case, you don't have to change this value, unless you're an rope expert. + # Change this value to inject you own implementations of interfaces + # listed in module rope.base.oi.type_hinting.providers.interfaces + # For example, you can add you own providers for Django Models, or disable the search + # type-hinting in a class hierarchy, etc. + prefs['type_hinting_factory'] = 'rope.base.oi.type_hinting.factory.default_type_hinting_factory' + + +def project_opened(project): + """This function is called after opening the project""" + # Do whatever you like here! diff --git a/es02/Makefile b/es02/Makefile index 5a18178..c24a8d8 100644 --- a/es02/Makefile +++ b/es02/Makefile @@ -9,6 +9,9 @@ ex1: ex2: python validator.py zad2 python3 ex2.py +ex3: + python validator.py zad3 python3 ex3.py + ex4: python validator.py zad4 python3 ex4.py diff --git a/es02/ex2.py b/es02/ex2.py index 70dc656..73e6e9b 100644 --- a/es02/ex2.py +++ b/es02/ex2.py @@ -10,6 +10,11 @@ class SokoState: def __init__(self, keeper, boxes, dire = "B", prevState = None, h = 42): + """ + keeper - tuple (x, y) + boxes - set of tuples (x,y) + dir - direction towards a move was made to achieve this state + """ self.keeper = keeper self.boxes = boxes self.dir = dire @@ -90,7 +95,7 @@ def precomputeCorners(self): corners = [] for i in range(1, self.n - 1): for j in range(1, self.m - 1): - if board[i][j] == '.': + if b[i][j] == '.': tl, tt, tr = b[i-1][j-1], b[i-1][j], b[i-1][j+1] ml, mr = b[i][j-1], b[i][j+1] bl, bb, br = b[i+1][j-1], b[i+1][j], b[i+1][j+1] diff --git a/es02/ex3.py b/es02/ex3.py new file mode 100644 index 0000000..03a4cc0 --- /dev/null +++ b/es02/ex3.py @@ -0,0 +1,75 @@ +import ex2 +import heapq +import queue +import sys + +class Sokoban(ex2.Sokoban): + + def computeH(self, state): + """ + Computes heuristic function and retruns modified (soko) state + """ + state.h = state.depth + return state + + def bestFirstSearch(self): + + box_state = self.computeH(self.state) + + # hq - a priority queue containing box' states + hq = [] + heapq.heappush(hq, box_state) + + # States of boxes which were visited + vis_boxes = set([box_state]) + + # Best first search + while hq and self.isSolved(box_state) is False: + box_state = heapq.heappop(hq) + + # BFS inside + # q - a queue containing keeper's states + q = queue.Queue() + q.put(box_state) + vis_keeper = set([box_state]) + + while q.empty() is False: + s = q.get() + + for neigh in self.genStates(s): + + # If a move which doesn't move a box was made + if s.boxes == neigh.boxes: + if neigh not in vis_keeper: + vis_keeper = vis_keeper | set([neigh]) + q.put(neigh) + + # A box was moved + elif neigh not in vis_boxes: + + neigh = self.computeH(neigh) + heapq.heappush(hq, neigh) + vis_boxes = vis_boxes | set([neigh]) + + return self.traceback(box_state) + + +if __name__ == '__main__': + + finput = 'zad_input.txt' + foutput = 'zad_output.txt' + + if len(sys.argv) == 2: + finput = sys.argv[1] + + board = [] + with open(finput) as f: + board = [list(line.strip('\n')) for line in f] + + soko = Sokoban(board) + + ans = soko.bestFirstSearch() + fout = open(foutput,"w") + print(ans, file=fout) + print(ans) +