tilingPuzzles 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. tilingpuzzles-0.2.0/.gitignore +118 -0
  2. tilingpuzzles-0.2.0/.python-version +1 -0
  3. tilingpuzzles-0.2.0/Demo.ipynb +435 -0
  4. tilingpuzzles-0.2.0/IPYNB/.gitignore +1 -0
  5. tilingpuzzles-0.2.0/IPYNB/Test-subtree.qmd +0 -0
  6. tilingpuzzles-0.2.0/IPYNB/Testing-counts.qmd +43 -0
  7. tilingpuzzles-0.2.0/IPYNB/Testing-grafik.qmd +244 -0
  8. tilingpuzzles-0.2.0/IPYNB/Testing-pytest.qmd +108 -0
  9. tilingpuzzles-0.2.0/IPYNB/Testing-solvers.qmd +48 -0
  10. tilingpuzzles-0.2.0/PKG-INFO +44 -0
  11. tilingpuzzles-0.2.0/README.md +24 -0
  12. tilingpuzzles-0.2.0/docs/.gitignore +1 -0
  13. tilingpuzzles-0.2.0/docs/README.md +6 -0
  14. tilingpuzzles-0.2.0/docs/_quarto.yml +8 -0
  15. tilingpuzzles-0.2.0/docs/src/Stone.qmd +63 -0
  16. tilingpuzzles-0.2.0/docs/src/Tile.qmd +14 -0
  17. tilingpuzzles-0.2.0/pyproject.toml +30 -0
  18. tilingpuzzles-0.2.0/pytest.ini +3 -0
  19. tilingpuzzles-0.2.0/src/tilingpuzzles/__init__.py +6 -0
  20. tilingpuzzles-0.2.0/src/tilingpuzzles/benchmark/README.md +10 -0
  21. tilingpuzzles-0.2.0/src/tilingpuzzles/benchmark/__init__.py +0 -0
  22. tilingpuzzles-0.2.0/src/tilingpuzzles/benchmark/data/timingResulsts.csv +193 -0
  23. tilingpuzzles-0.2.0/src/tilingpuzzles/benchmark/git_state.py +22 -0
  24. tilingpuzzles-0.2.0/src/tilingpuzzles/benchmark/run_benchmark.py +105 -0
  25. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/README.md +3 -0
  26. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/__init__.py +0 -0
  27. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/rectangularPentomino.py +40 -0
  28. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/scaledStones.py +163 -0
  29. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/tests/__init__.py +0 -0
  30. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/tests/test_rectangularPentomino.py +24 -0
  31. tilingpuzzles-0.2.0/src/tilingpuzzles/examples/tests/test_scaledStones.py +8 -0
  32. tilingpuzzles-0.2.0/src/tilingpuzzles/games/__init__.py +2 -0
  33. tilingpuzzles-0.2.0/src/tilingpuzzles/games/game.py +20 -0
  34. tilingpuzzles-0.2.0/src/tilingpuzzles/games/generic.py +7 -0
  35. tilingpuzzles-0.2.0/src/tilingpuzzles/games/komino.py +147 -0
  36. tilingpuzzles-0.2.0/src/tilingpuzzles/games/realisations.py +78 -0
  37. tilingpuzzles-0.2.0/src/tilingpuzzles/games/stone.py +536 -0
  38. tilingpuzzles-0.2.0/src/tilingpuzzles/games/stone_core.py +48 -0
  39. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tests/__init__.py +0 -0
  40. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tests/test_game.py +7 -0
  41. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tests/test_komino.py +30 -0
  42. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tests/test_realisations.py +28 -0
  43. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tests/test_stone.py +172 -0
  44. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tests/test_tile.py +19 -0
  45. tilingpuzzles-0.2.0/src/tilingpuzzles/games/tile.py +39 -0
  46. tilingpuzzles-0.2.0/src/tilingpuzzles/logUtils/__init__.py +0 -0
  47. tilingpuzzles-0.2.0/src/tilingpuzzles/logUtils/callGraph.py +47 -0
  48. tilingpuzzles-0.2.0/src/tilingpuzzles/logger.py +39 -0
  49. tilingpuzzles-0.2.0/src/tilingpuzzles/solvers/__init__.py +0 -0
  50. tilingpuzzles-0.2.0/src/tilingpuzzles/solvers/hights.py +3 -0
  51. tilingpuzzles-0.2.0/src/tilingpuzzles/solvers/kominoSolver.py +191 -0
  52. tilingpuzzles-0.2.0/src/tilingpuzzles/solvers/tests/test_komino_solver.py +30 -0
  53. tilingpuzzles-0.2.0/src/tilingpuzzles/visualize/__init__.py +0 -0
  54. tilingpuzzles-0.2.0/src/tilingpuzzles/visualize/visualize.py +61 -0
  55. tilingpuzzles-0.2.0/test/test_pytest.py +5 -0
  56. tilingpuzzles-0.2.0/test/vibetest_1.py +17 -0
@@ -0,0 +1,118 @@
1
+
2
+ Testing*.ipynb
3
+
4
+ #rendered Docs
5
+
6
+ docs/rendered/
7
+
8
+ #Tracked Calls
9
+ Digraph.gv
10
+ Digraph.gv.pdf
11
+
12
+ # Quarto specific
13
+ *.canvas
14
+ tilingpuzzles.md
15
+
16
+ # quarto
17
+ .quarto/
18
+
19
+ #uv
20
+
21
+ uv.lock
22
+
23
+
24
+ # Python-generated files
25
+ __pycache__/
26
+ *.py[oc]
27
+ build/
28
+ dist/
29
+ wheels/
30
+ *.egg-info
31
+
32
+ # Virtual environments
33
+ .venv
34
+
35
+ # Byte-compiled / optimized / DLL files
36
+ __pycache__/
37
+ *.py[cod]
38
+ *$py.class
39
+
40
+ # C extensions
41
+ *.so
42
+
43
+ # Distribution / packaging
44
+ .Python
45
+ build/
46
+ develop-eggs/
47
+ dist/
48
+ downloads/
49
+ eggs/
50
+ .eggs/
51
+ lib/
52
+ lib64/
53
+ parts/
54
+ sdist/
55
+ var/
56
+ wheels/
57
+ share/python-wheels/
58
+ *.egg-info/
59
+ .installed.cfg
60
+ *.egg
61
+ MANIFEST
62
+
63
+ # PyInstaller
64
+ # Usually these files are written by a python script from a template
65
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
66
+ *.manifest
67
+ *.spec
68
+
69
+ # Installer logs
70
+ pip-log.txt
71
+ pip-delete-this-directory.txt
72
+
73
+ # Unit test / coverage reports
74
+ htmlcov/
75
+ .tox/
76
+ .nox/
77
+ .coverage
78
+ .coverage.*
79
+ .cache
80
+ nosetests.xml
81
+ coverage.xml
82
+ *.cover
83
+ *.py,cover
84
+ .hypothesis/
85
+ .pytest_cache/
86
+ cover/
87
+
88
+ # Translations
89
+ *.mo
90
+ *.pot
91
+
92
+ # Django stuff:
93
+ *.log
94
+ local_settings.py
95
+ db.sqlite3
96
+ db.sqlite3-journal
97
+
98
+ # Flask stuff:
99
+ instance/
100
+ .webassets-cache
101
+
102
+ # Scrapy stuff:
103
+ .scrapy
104
+
105
+ # Sphinx documentation
106
+ docs/_build/
107
+
108
+ # PyBuilder
109
+ .pybuilder/
110
+ target/
111
+
112
+ # Jupyter Notebook
113
+ .ipynb_checkpoints
114
+
115
+ # IPython
116
+ profile_default/
117
+ ipython_config.py
118
+
@@ -0,0 +1 @@
1
+ pypy@3.11
@@ -0,0 +1,435 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "id": "775491ad",
6
+ "metadata": {},
7
+ "source": [
8
+ "# finden einer Lösung"
9
+ ]
10
+ },
11
+ {
12
+ "cell_type": "code",
13
+ "execution_count": null,
14
+ "id": "953cb2a3",
15
+ "metadata": {},
16
+ "outputs": [
17
+ {
18
+ "data": {
19
+ "image/png": "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",
20
+ "text/plain": [
21
+ "<Figure size 640x480 with 1 Axes>"
22
+ ]
23
+ },
24
+ "metadata": {},
25
+ "output_type": "display_data"
26
+ },
27
+ {
28
+ "data": {
29
+ "image/png": "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MgCAMYOCAQCYoGAAACYoGACACQoGAGCCggEAmKBgAAAmKBgAgAkKBgBgwvzr+r/o4BcHjNR/PAYAGD0H5+6hfAnMqBfMnj17JIn/eAwAitiePXsUi8WO+p5R/y4yz/P02WefqbKyUqFQqODlD/6HZTt27OC7zL4E22ro2FZDw3YaurG6rXzf1549e1RXV/el/znfqJ/BhMNhnXzyycf8+1RVVY2pnWaJbTV0bKuhYTsN3VjcVl925nIQN/kBACYoGACAiaIrmGg0qrvuukvRaNR1lMBjWw0d22po2E5Dx7ZycJMfAPDVUHRnMACA4kDBAABMUDAAABMUDADARNEUTHt7u8477zxVVlaqurpaV111lbZt2+Y6VuDdf//9CoVCam1tdR0lkD799FNdf/31isfjqqio0LRp0/TWW2+5jhU4mUxGCxYsUENDgyoqKnT66afrnnvuGdL3UY1169ev15VXXqm6ujqFQiE9//zzg37d930tXLhQEydOVEVFhS655BK9//77bsKOsqIpmHXr1qmlpUUbN27UmjVrlE6ndemll2rfvn2uowXWpk2b9Nhjj+nMM890HSWQdu3apebmZpWWluqll17S3/72N/3yl7/UCSec4Dpa4CxevFjLli3TI488or///e9avHixHnjgAT388MOuozm3b98+nXXWWXr00UcP++sPPPCAHnroIS1fvlxvvPGGxo0bp8suu0zJZHKUkzrgF6mdO3f6kvx169a5jhJIe/bs8SdPnuyvWbPG/853vuPPmTPHdaTAueOOO/xvfetbrmMUhcsvv9y/+eabB732gx/8wJ85c6ajRMEkyV+9enX2ued5fm1trf+LX/wi+9ru3bv9aDTqP/300w4Sjq6iOYP5ot7eXknSiSee6DhJMLW0tOjyyy/XJZdc4jpKYP3ud7/T9OnTdc0116i6ulrnnHOOHn/8cdexAmnGjBlau3attm/fLkl69913tWHDBn3ve99znCzYPvroI3V2dg76OYzFYjr//PP1+uuvO0w2Okb9yy5Hgud5am1tVXNzs5qamlzHCZxnnnlGb7/9tjZt2uQ6SqB9+OGHWrZsmdra2vSzn/1MmzZt0uzZs1VWVqZZs2a5jhco8+bNUyKR0JQpUxSJRJTJZLRo0SLNnDnTdbRA6+zslCTV1NQMer2mpib7a2NZURZMS0uLOjo6tGHDBtdRAmfHjh2aM2eO1qxZo/LyctdxAs3zPE2fPl333XefJOmcc85RR0eHli9fTsF8wXPPPaennnpKq1atUmNjo7Zs2aLW1lbV1dWxrXBERXeJ7LbbbtOLL76oV155ZUS+9n+s2bx5s3bu3Klzzz1XJSUlKikp0bp16/TQQw+ppKREmUzGdcTAmDhxos4444xBr02dOlX/+Mc/HCUKrttvv13z5s3Tddddp2nTpumGG27Q3Llz1d7e7jpaoNXW1kqSurq6Br3e1dWV/bWxrGgKxvd93XbbbVq9erX+9Kc/qaGhwXWkQLr44ov13nvvacuWLdnH9OnTNXPmTG3ZskWRSMR1xMBobm4+5KPu27dv1ymnnOIoUXDt37//kP9cKhKJyPM8R4mKQ0NDg2pra7V27drsa4lEQm+88YYuuOACh8lGR9FcImtpadGqVav0wgsvqLKyMnv9MhaLqaKiwnG64KisrDzkvtS4ceMUj8e5X/UFc+fO1YwZM3Tffffp2muv1ZtvvqkVK1ZoxYoVrqMFzpVXXqlFixZp0qRJamxs1DvvvKMlS5bo5ptvdh3Nub179+qDDz7IPv/oo4+0ZcsWnXjiiZo0aZJaW1t17733avLkyWpoaNCCBQtUV1enq666yl3o0eL6Y2xDJemwjyeeeMJ1tMDjY8pH9vvf/95vamryo9GoP2XKFH/FihWuIwVSIpHw58yZ40+aNMkvLy/3TzvtNP/OO+/0U6mU62jOvfLKK4edm2bNmuX7/sBHlRcsWODX1NT40WjUv/jii/1t27a5DT1K+Lp+AICJorkHAwAoLhQMAMAEBQMAMEHBAABMUDAAABMUDADABAUDADBBwQAATFAwAAATFAwAwAQFAwAwQcEAAEz8f8QsQYGDR0+TAAAAAElFTkSuQmCC",
30
+ "text/plain": [
31
+ "<Figure size 640x480 with 1 Axes>"
32
+ ]
33
+ },
34
+ "metadata": {},
35
+ "output_type": "display_data"
36
+ },
37
+ {
38
+ "data": {
39
+ "text/plain": [
40
+ "[frozenset({(8, 7), (9, 6), (9, 7), (9, 8), (10, 7), (10, 8)}),\n",
41
+ " frozenset({(6, 2), (7, 2), (7, 3), (8, 2), (8, 3), (9, 2)}),\n",
42
+ " frozenset({(7, 4), (8, 4), (8, 5), (8, 6), (9, 4), (9, 5)}),\n",
43
+ " frozenset({(9, 3), (10, 2), (10, 3), (10, 4), (10, 5), (10, 6)}),\n",
44
+ " frozenset({(4, 2), (5, 0), (5, 1), (5, 2), (6, 0), (6, 1)}),\n",
45
+ " frozenset({(3, 3), (4, 3), (5, 3), (6, 3), (6, 4), (6, 5)}),\n",
46
+ " frozenset({(3, 4), (4, 4), (5, 4), (5, 5), (5, 6), (6, 6)}),\n",
47
+ " frozenset({(2, 3), (2, 4), (2, 5), (2, 6), (3, 5), (3, 6)}),\n",
48
+ " frozenset({(2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)})]"
49
+ ]
50
+ },
51
+ "execution_count": 20,
52
+ "metadata": {},
53
+ "output_type": "execute_result"
54
+ }
55
+ ],
56
+ "source": [
57
+ "from tilingpuzzles.games.stone import Stone\n",
58
+ "from tilingpuzzles.games.komino import Komino\n",
59
+ "\n",
60
+ "# Ordnung der steine \n",
61
+ "# k=5 => Pentomino\n",
62
+ "k=6\n",
63
+ "\n",
64
+ "# Zu bedeckende fläche \n",
65
+ "U=\"\"\"\n",
66
+ "#######\n",
67
+ "#######\n",
68
+ " ###\n",
69
+ "#######\n",
70
+ "#######\n",
71
+ " ###\n",
72
+ " ######\n",
73
+ " #######\n",
74
+ " #######\n",
75
+ "\"\"\"\n",
76
+ "\n",
77
+ "U=Stone.from_string(U)\n",
78
+ "\n",
79
+ "assert len(U)%k==0\n",
80
+ "\n",
81
+ "display(U)\n",
82
+ "\n",
83
+ "komi=Komino(U,k=k)\n",
84
+ "# limits: anzahl wie oft jeder stein verwendet werden kann\n",
85
+ "komi.find_solution(limits=1)\n"
86
+ ]
87
+ },
88
+ {
89
+ "cell_type": "markdown",
90
+ "id": "6ac3e29d",
91
+ "metadata": {},
92
+ "source": [
93
+ "# Anzahl Lösungen wenn jeder stein beliebig oft verwendet werden kann"
94
+ ]
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "execution_count": null,
99
+ "id": "74e465e6",
100
+ "metadata": {},
101
+ "outputs": [
102
+ {
103
+ "data": {
104
+ "application/vnd.jupyter.widget-view+json": {
105
+ "model_id": "b7a9d7fc72664bafae2d3664faff772a",
106
+ "version_major": 2,
107
+ "version_minor": 0
108
+ },
109
+ "text/plain": [
110
+ "Level 0: 0%| | 0/69 [00:00<?, ?it/s]"
111
+ ]
112
+ },
113
+ "metadata": {},
114
+ "output_type": "display_data"
115
+ },
116
+ {
117
+ "data": {
118
+ "application/vnd.jupyter.widget-view+json": {
119
+ "model_id": "4fe9037f05cc45168cd5fc8f3284a492",
120
+ "version_major": 2,
121
+ "version_minor": 0
122
+ },
123
+ "text/plain": [
124
+ "Level 1: 0%| | 0/539 [00:00<?, ?it/s]"
125
+ ]
126
+ },
127
+ "metadata": {},
128
+ "output_type": "display_data"
129
+ },
130
+ {
131
+ "data": {
132
+ "application/vnd.jupyter.widget-view+json": {
133
+ "model_id": "e7dcced0e39c4b40af437118481670c9",
134
+ "version_major": 2,
135
+ "version_minor": 0
136
+ },
137
+ "text/plain": [
138
+ "Level 1: 0%| | 0/440 [00:00<?, ?it/s]"
139
+ ]
140
+ },
141
+ "metadata": {},
142
+ "output_type": "display_data"
143
+ },
144
+ {
145
+ "data": {
146
+ "application/vnd.jupyter.widget-view+json": {
147
+ "model_id": "5d427e80493240bd865c5f4492bb2bc4",
148
+ "version_major": 2,
149
+ "version_minor": 0
150
+ },
151
+ "text/plain": [
152
+ "Level 1: 0%| | 0/437 [00:00<?, ?it/s]"
153
+ ]
154
+ },
155
+ "metadata": {},
156
+ "output_type": "display_data"
157
+ },
158
+ {
159
+ "data": {
160
+ "application/vnd.jupyter.widget-view+json": {
161
+ "model_id": "4223f8bb1ede4c4e99d57afa6d4c6ab1",
162
+ "version_major": 2,
163
+ "version_minor": 0
164
+ },
165
+ "text/plain": [
166
+ "Level 1: 0%| | 0/73 [00:00<?, ?it/s]"
167
+ ]
168
+ },
169
+ "metadata": {},
170
+ "output_type": "display_data"
171
+ },
172
+ {
173
+ "data": {
174
+ "application/vnd.jupyter.widget-view+json": {
175
+ "model_id": "4532f33716e54753a3fb56e9997ea07e",
176
+ "version_major": 2,
177
+ "version_minor": 0
178
+ },
179
+ "text/plain": [
180
+ "Level 1: 0%| | 0/144 [00:00<?, ?it/s]"
181
+ ]
182
+ },
183
+ "metadata": {},
184
+ "output_type": "display_data"
185
+ },
186
+ {
187
+ "data": {
188
+ "application/vnd.jupyter.widget-view+json": {
189
+ "model_id": "d72923f05e8c4e1db13c0e799652bb2e",
190
+ "version_major": 2,
191
+ "version_minor": 0
192
+ },
193
+ "text/plain": [
194
+ "Level 1: 0%| | 0/23 [00:00<?, ?it/s]"
195
+ ]
196
+ },
197
+ "metadata": {},
198
+ "output_type": "display_data"
199
+ },
200
+ {
201
+ "data": {
202
+ "application/vnd.jupyter.widget-view+json": {
203
+ "model_id": "2683d02b41ef461c8cb0ca8937ed5c68",
204
+ "version_major": 2,
205
+ "version_minor": 0
206
+ },
207
+ "text/plain": [
208
+ "Level 1: 0%| | 0/43 [00:00<?, ?it/s]"
209
+ ]
210
+ },
211
+ "metadata": {},
212
+ "output_type": "display_data"
213
+ },
214
+ {
215
+ "data": {
216
+ "application/vnd.jupyter.widget-view+json": {
217
+ "model_id": "c5ebacd3024c4adc8b8ac5bf71a3603f",
218
+ "version_major": 2,
219
+ "version_minor": 0
220
+ },
221
+ "text/plain": [
222
+ "Level 1: 0%| | 0/52 [00:00<?, ?it/s]"
223
+ ]
224
+ },
225
+ "metadata": {},
226
+ "output_type": "display_data"
227
+ },
228
+ {
229
+ "data": {
230
+ "application/vnd.jupyter.widget-view+json": {
231
+ "model_id": "cbbd261fe0d04253bbff9699a42e4176",
232
+ "version_major": 2,
233
+ "version_minor": 0
234
+ },
235
+ "text/plain": [
236
+ "Level 1: 0%| | 0/16 [00:00<?, ?it/s]"
237
+ ]
238
+ },
239
+ "metadata": {},
240
+ "output_type": "display_data"
241
+ },
242
+ {
243
+ "data": {
244
+ "application/vnd.jupyter.widget-view+json": {
245
+ "model_id": "1e78e9247bf244ab895924fb166e58ba",
246
+ "version_major": 2,
247
+ "version_minor": 0
248
+ },
249
+ "text/plain": [
250
+ "Level 1: 0%| | 0/128 [00:00<?, ?it/s]"
251
+ ]
252
+ },
253
+ "metadata": {},
254
+ "output_type": "display_data"
255
+ },
256
+ {
257
+ "data": {
258
+ "application/vnd.jupyter.widget-view+json": {
259
+ "model_id": "5650ac067469406d918f59781b6de699",
260
+ "version_major": 2,
261
+ "version_minor": 0
262
+ },
263
+ "text/plain": [
264
+ "Level 1: 0%| | 0/67 [00:00<?, ?it/s]"
265
+ ]
266
+ },
267
+ "metadata": {},
268
+ "output_type": "display_data"
269
+ },
270
+ {
271
+ "data": {
272
+ "application/vnd.jupyter.widget-view+json": {
273
+ "model_id": "5cf1da27c98f421c958ec9dab1db9150",
274
+ "version_major": 2,
275
+ "version_minor": 0
276
+ },
277
+ "text/plain": [
278
+ "Level 1: 0%| | 0/146 [00:00<?, ?it/s]"
279
+ ]
280
+ },
281
+ "metadata": {},
282
+ "output_type": "display_data"
283
+ },
284
+ {
285
+ "data": {
286
+ "application/vnd.jupyter.widget-view+json": {
287
+ "model_id": "9c85268a5bd0452986c850072200516d",
288
+ "version_major": 2,
289
+ "version_minor": 0
290
+ },
291
+ "text/plain": [
292
+ "Level 1: 0%| | 0/158 [00:00<?, ?it/s]"
293
+ ]
294
+ },
295
+ "metadata": {},
296
+ "output_type": "display_data"
297
+ },
298
+ {
299
+ "data": {
300
+ "application/vnd.jupyter.widget-view+json": {
301
+ "model_id": "0692616457224dae9675e0fa277b03d4",
302
+ "version_major": 2,
303
+ "version_minor": 0
304
+ },
305
+ "text/plain": [
306
+ "Level 1: 0%| | 0/160 [00:00<?, ?it/s]"
307
+ ]
308
+ },
309
+ "metadata": {},
310
+ "output_type": "display_data"
311
+ },
312
+ {
313
+ "data": {
314
+ "application/vnd.jupyter.widget-view+json": {
315
+ "model_id": "91921831b4be453a88ea5aee915c730c",
316
+ "version_major": 2,
317
+ "version_minor": 0
318
+ },
319
+ "text/plain": [
320
+ "Level 1: 0%| | 0/53 [00:00<?, ?it/s]"
321
+ ]
322
+ },
323
+ "metadata": {},
324
+ "output_type": "display_data"
325
+ },
326
+ {
327
+ "data": {
328
+ "application/vnd.jupyter.widget-view+json": {
329
+ "model_id": "f131b64181fc486ab70459dfb1e50363",
330
+ "version_major": 2,
331
+ "version_minor": 0
332
+ },
333
+ "text/plain": [
334
+ "Level 1: 0%| | 0/36 [00:00<?, ?it/s]"
335
+ ]
336
+ },
337
+ "metadata": {},
338
+ "output_type": "display_data"
339
+ },
340
+ {
341
+ "data": {
342
+ "application/vnd.jupyter.widget-view+json": {
343
+ "model_id": "8eaf22a6049c40ecb9aae089f4aa5dd1",
344
+ "version_major": 2,
345
+ "version_minor": 0
346
+ },
347
+ "text/plain": [
348
+ "Level 1: 0%| | 0/35 [00:00<?, ?it/s]"
349
+ ]
350
+ },
351
+ "metadata": {},
352
+ "output_type": "display_data"
353
+ },
354
+ {
355
+ "data": {
356
+ "application/vnd.jupyter.widget-view+json": {
357
+ "model_id": "3b73204501ab4bd1a3ddd79f432b0f33",
358
+ "version_major": 2,
359
+ "version_minor": 0
360
+ },
361
+ "text/plain": [
362
+ "Level 1: 0%| | 0/56 [00:00<?, ?it/s]"
363
+ ]
364
+ },
365
+ "metadata": {},
366
+ "output_type": "display_data"
367
+ },
368
+ {
369
+ "data": {
370
+ "application/vnd.jupyter.widget-view+json": {
371
+ "model_id": "91ead49928b04d9e867b2afbfe3c4224",
372
+ "version_major": 2,
373
+ "version_minor": 0
374
+ },
375
+ "text/plain": [
376
+ "Level 1: 0%| | 0/20 [00:00<?, ?it/s]"
377
+ ]
378
+ },
379
+ "metadata": {},
380
+ "output_type": "display_data"
381
+ },
382
+ {
383
+ "data": {
384
+ "application/vnd.jupyter.widget-view+json": {
385
+ "model_id": "47393b0b93f646a19e75a756a4943866",
386
+ "version_major": 2,
387
+ "version_minor": 0
388
+ },
389
+ "text/plain": [
390
+ "Level 1: 0%| | 0/63 [00:00<?, ?it/s]"
391
+ ]
392
+ },
393
+ "metadata": {},
394
+ "output_type": "display_data"
395
+ },
396
+ {
397
+ "data": {
398
+ "text/plain": [
399
+ "115373"
400
+ ]
401
+ },
402
+ "execution_count": 19,
403
+ "metadata": {},
404
+ "output_type": "execute_result"
405
+ }
406
+ ],
407
+ "source": [
408
+ "\n",
409
+ "komi.count_solutions(limits=None,progressLevel=2)\n",
410
+ "# andere grenzen als ´None´ sind nicht implementiert\n"
411
+ ]
412
+ }
413
+ ],
414
+ "metadata": {
415
+ "kernelspec": {
416
+ "display_name": ".venv",
417
+ "language": "python",
418
+ "name": "python3"
419
+ },
420
+ "language_info": {
421
+ "codemirror_mode": {
422
+ "name": "ipython",
423
+ "version": 3
424
+ },
425
+ "file_extension": ".py",
426
+ "mimetype": "text/x-python",
427
+ "name": "python",
428
+ "nbconvert_exporter": "python",
429
+ "pygments_lexer": "ipython3",
430
+ "version": "3.11.11"
431
+ }
432
+ },
433
+ "nbformat": 4,
434
+ "nbformat_minor": 5
435
+ }
@@ -0,0 +1 @@
1
+ *
File without changes
@@ -0,0 +1,43 @@
1
+
2
+ ```{python}
3
+ ! which python
4
+ ```
5
+
6
+ ```{python}
7
+ from tilingpuzzles.solvers.komino import KominoSolverUnlimted
8
+ from tilingpuzzles.examples.rectangularPentomino import rectangularPentomino
9
+ from tilingpuzzles.games.stone import Stone
10
+ from tilingpuzzles.games.komino import Komino
11
+
12
+
13
+ T="""
14
+ ########################
15
+ ## ## ## ## # #
16
+ ## ## ## ## # #
17
+ ########################
18
+ ########################
19
+ # ##
20
+ """
21
+ T=Stone.from_string(T)
22
+ k =Komino(T,k=5)
23
+
24
+ solver = KominoSolverUnlimted(k)
25
+
26
+ res=solver.solve(2,3)
27
+ print(res)
28
+ len(solver.DP)
29
+ ```
30
+
31
+ ```{python}
32
+ res/len(solver.DP)
33
+ ```
34
+
35
+ ```{python}
36
+ k=rectangularPentomino.P5x12()
37
+
38
+ solver=KominoSolverUnlimted(k)
39
+
40
+ res=solver.solve()
41
+ print(res)
42
+ len(solver.DP)
43
+ ```