puzzler-users Mailing List for Polyform Puzzler
Brought to you by:
goodger
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
|
From: David G. <go...@py...> - 2018-10-29 20:43:54
|
Hi, I developed Polyform Puzzler using Python 2.x. I haven't adapted it to Python 3.x yet. Someday, perhaps, but it's not high on my priority list. Please install the latest Python 2.7.x (currently Python 2.7.15) from https://www.python.org/downloads/release/python-2715/ ... and then install Polyform Puzzler again. David Goodger <https://david.goodger.org> On Mon, 29 Oct 2018 at 13:52, Harold Cataquet <cat...@gm...> wrote: > Further to my previous email, I tried to just run it, and I got the > following: > > > > c:\Cutler\Polyform>C:\Users\HarryCat\AppData\Local\Programs\Python\Python37-32\python > bin\pentominoes3x20.py > > Traceback (most recent call last): > > File "bin\pentominoes3x20.py", line 8, in <module> > > from puzzler import puzzles, core > > File "c:\Cutler\Polyform\puzzler\puzzles.py", line 1547 > > print 'matrix length =', len(p.matrix) > > ^ > > SyntaxError: invalid syntax > > > > > > Bye for now, > Harold > > ==================== > Harold Cataquet > cat...@gm... > > ----------------------------------------- > This email (including any attachments) is confidential. If you are not the > intended recipient you must not copy, use, disclose, distribute or rely on > the information contained in it. If you have received this email in error, > please notify the sender immediately by reply email and delete the email > from your system. Confidentiality and legal privilege attached to this > communication are not waived or lost by reason of mistaken delivery to you. > > > > *From: *Harold Cataquet <cat...@gm...> > *Sent: *29 October 2018 18:43 > *To: *puz...@li... > *Subject: *[Puzzler-users] (no subject) > > > > I’m running Microsoft Windows [Version 10.0.17134.345]. When it comes to > the install [after installing python], here’s what I get: > > > > c:\Polyform>C:\Users\HarryCat\AppData\Local\Programs\Python\Python37-32\python > setup.py install > > File "setup.py", line 13 > > print 'Error: The "distutils" standard module, which is required for > the ' > > > ^ > > SyntaxError: Missing parentheses in call to 'print'. Did you mean > print('Error: The "distutils" standard module, which is required for the ')? > > > > Any idea on the solution? > > > Bye for now, > Harold > > ==================== > Harold Cataquet > cat...@gm... > > ----------------------------------------- > This email (including any attachments) is confidential. If you are not the > intended recipient you must not copy, use, disclose, distribute or rely on > the information contained in it. If you have received this email in error, > please notify the sender immediately by reply email and delete the email > from your system. Confidentiality and legal privilege attached to this > communication are not waived or lost by reason of mistaken delivery to you. > > > > > > [image: > https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif] > <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> > > Virus-free. www.avast.com > <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> > > > > > _______________________________________________ > Puzzler-users mailing list > Puz...@li... > https://lists.sourceforge.net/lists/listinfo/puzzler-users > |
From: Harold C. <cat...@gm...> - 2018-10-29 18:52:19
|
Further to my previous email, I tried to just run it, and I got the following: c:\Cutler\Polyform>C:\Users\HarryCat\AppData\Local\Programs\Python\Python37-32\python bin\pentominoes3x20.py Traceback (most recent call last): File "bin\pentominoes3x20.py", line 8, in <module> from puzzler import puzzles, core File "c:\Cutler\Polyform\puzzler\puzzles.py", line 1547 print 'matrix length =', len(p.matrix) ^ SyntaxError: invalid syntax Bye for now, Harold ==================== Harold Cataquet cat...@gm... ----------------------------------------- This email (including any attachments) is confidential. If you are not the intended recipient you must not copy, use, disclose, distribute or rely on the information contained in it. If you have received this email in error, please notify the sender immediately by reply email and delete the email from your system. Confidentiality and legal privilege attached to this communication are not waived or lost by reason of mistaken delivery to you. From: Harold Cataquet Sent: 29 October 2018 18:43 To: puz...@li... Subject: [Puzzler-users] (no subject) I’m running Microsoft Windows [Version 10.0.17134.345]. When it comes to the install [after installing python], here’s what I get: c:\Polyform>C:\Users\HarryCat\AppData\Local\Programs\Python\Python37-32\python setup.py install File "setup.py", line 13 print 'Error: The "distutils" standard module, which is required for the ' ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print('Error: The "distutils" standard module, which is required for the ')? Any idea on the solution? Bye for now, Harold ==================== Harold Cataquet cat...@gm... ----------------------------------------- This email (including any attachments) is confidential. If you are not the intended recipient you must not copy, use, disclose, distribute or rely on the information contained in it. If you have received this email in error, please notify the sender immediately by reply email and delete the email from your system. Confidentiality and legal privilege attached to this communication are not waived or lost by reason of mistaken delivery to you. Virus-free. www.avast.com --- This email has been checked for viruses by Avast antivirus software. https://www.avast.com/antivirus |
From: Harold C. <cat...@gm...> - 2018-10-29 18:43:38
|
I’m running Microsoft Windows [Version 10.0.17134.345]. When it comes to the install [after installing python], here’s what I get: c:\Polyform>C:\Users\HarryCat\AppData\Local\Programs\Python\Python37-32\python setup.py install File "setup.py", line 13 print 'Error: The "distutils" standard module, which is required for the ' ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print('Error: The "distutils" standard module, which is required for the ')? Any idea on the solution? Bye for now, Harold ==================== Harold Cataquet cat...@gm... ----------------------------------------- This email (including any attachments) is confidential. If you are not the intended recipient you must not copy, use, disclose, distribute or rely on the information contained in it. If you have received this email in error, please notify the sender immediately by reply email and delete the email from your system. Confidentiality and legal privilege attached to this communication are not waived or lost by reason of mistaken delivery to you. --- This email has been checked for viruses by Avast antivirus software. https://www.avast.com/antivirus |
From: Brian G. <br...@gl...> - 2015-08-11 08:50:52
|
I am wondering if anyone has succeeded in getting a version of Polyform Puzzler to run on Python 3? Most of the changes needed are pretty small and I can get it working with the older exact_cover_x2.py but when I try to use exact_cover.py (or exact_cover_dlx.py) something goes wrong with __slots__ with the result: builtins.ValueError: 'name' in __slots__ conflicts with class variable Any help with changes needed to remove this error on Python 3 would be much appreciated. best regards, Brian |
From: Stephen L. <ste...@gm...> - 2015-06-23 21:13:20
|
This puzzle is provably impossible: The puzzle has 19 cubes which are 6-connected. Simple counting of orientations will indicate that the following pieces at minimum eat up 15 of the 19 spaces: V1, V2, I, L1, J1, T1, Z, Q, and T eat up at minimum 1 space each and S2, N2 and L3 eat up 2 at minimum. That leaves only 4 spare spaces. Now, considering the following set of 11 pieces: T1, A, S1, N1, Q, V, L2, J2, L4, J4, T2. Each piece takes up the fewest 6-connected cells by being oriented with one of its cells having 5 connectivity. There are ONLY 6 cells in the model with 5 connectivity. Hence 5 of these 11 pieces must contain MORE than its minimum number of 6-connected cells. Even if this is just one more, the sum of 5 and 15 is 20 which is greater than the total number of 6-connected cells. Hence by the pigeonhole principle, this is impossible. |
From: Dave C. <dav...@gm...> - 2014-09-23 21:48:36
|
This is the second time I'm sending this message. The first attempt contained an attachment ( __init__.py ). In the Puzzler-users archive on sourceforge.net I *only* see the attachment - not the message itself. Now I am sending the message again, this time without the attachment. Refer to the earlier message for the attachment. Original message follows: -------------------------------------- Original Message Below --------------------------------------------------- I happened to notice that some of the puzzler "polyiamonds" solutions were showing duplicate answers. For example, solution 9 and solution 10 (shown below) from http://puzzler.sourceforge.net/solutions/iamonds/polyiamonds-12345-elongated-hexagon-9x1.txt are identical. Actually *most* of the solutions shown in that output file are duplicated - I just noticed 9 & 10 first. It turns out that this happens because there are duplicate rows in the exact cover problem formulation. Specifically, some of the rows corresponding to the T1 piece are duplicated. I didn't try to figure out the cause of this row duplication but I'm attaching a version of puzzler/puzzler/__init__.py that contains code that detects and removes duplicate rows (thus eliminating the duplicate solutions in the output). The attached __init__.py is based off of the trunk version from sourceforge . After the duplicate solutions shown in this e-mail, you can see a diff that shows the duplicate removal code. ------------------------------------------ duplicate solutions below -------------------------------------------- solution 9 (392 searches): 1,0,0 1,0,1 1,1,0 2,0,0 2,0,1 P5 0,0,1 0,1,0 0,1,1 I3 1,1,1 2,1,0 D2 2,1,1 3,0,0 3,0,1 3,1,0 C4 4,0,0 4,0,1 4,1,0 5,0,0 T4 3,1,1 T1 4,1,1 5,0,1 5,1,0 6,0,0 6,0,1 L5 5,1,1 6,1,0 6,1,1 7,1,0 7,1,1 I5 7,0,0 7,0,1 8,0,0 8,0,1 I4 8,1,0 8,1,1 9,0,0 9,0,1 9,1,0 C5 ____________________________________ / /\ \ \ /\ \ / \ / / \___\ \/ \ \________/___ \ \ / / / \ / / / \/_______/___/______\____/_______/___/ solution 10 (403 searches): 1,0,0 1,0,1 1,1,0 2,0,0 2,0,1 P5 0,0,1 0,1,0 0,1,1 I3 1,1,1 2,1,0 D2 2,1,1 3,0,0 3,0,1 3,1,0 C4 4,0,0 4,0,1 4,1,0 5,0,0 T4 3,1,1 T1 4,1,1 5,0,1 5,1,0 6,0,0 6,0,1 L5 5,1,1 6,1,0 6,1,1 7,1,0 7,1,1 I5 7,0,0 7,0,1 8,0,0 8,0,1 I4 8,1,0 8,1,1 9,0,0 9,0,1 9,1,0 C5 ____________________________________ / /\ \ \ /\ \ / \ / / \___\ \/ \ \________/___ \ \ / / / \ / / / \/_______/___/______\____/_______/___/ ------------------------------ ------------ duplicate removal code below -------------------------------------------- --- a/puzzler/puzzler/__init__.py +++ b/puzzler/puzzler/__init__.py @@ -203,6 +203,25 @@ def solve(puzzle_class, output_stream, settings): # initially (and memory) with multi-part puzzles puzzles.append(component()) for puzzle in puzzles: + # check for and eliminate duplicate rows + unique_rows = [] + for row in puzzle.matrix[1:]: + if row not in unique_rows: + unique_rows.append(row) + else: + print >>output_stream, "duplicate row: ", + for i, item in enumerate(row): + if item: + print >>output_stream, item, + print >>output_stream + original_row_count = len(puzzle.matrix[1:]) + unique_row_count = len(unique_rows) + if original_row_count != unique_row_count: + print >>output_stream, ( + '\nEliminating %s duplicate rows leaving %s total rows.\n' + % (original_row_count - unique_row_count, + unique_row_count)) + puzzle.matrix[1:] = unique_rows matrices.append((puzzle.matrix, puzzle.secondary_columns)) state.init_periodic_save(solver) last_solutions = state.last_solutions |
From: Dave C. <dav...@gm...> - 2014-09-23 21:10:56
|
# $Id$ """ ================== Polyform Puzzler ================== "Polyform Puzzler" is a Python library (``puzzler``) and a set of front-end applications (solvers) for exploring & solving polyform puzzles and Sudoku puzzles. """ # Author: David Goodger <go...@py...> # Copyright: (C) 1998-2012 by David J. Goodger # License: # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, refer to # http://puzzler.sourceforge.net/GPL2.txt or write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA, USA 02111-1307 import sys import os import threading import copy import optparse import time import cPickle as pickle from datetime import datetime, timedelta from puzzler import exact_cover_dlx from puzzler import exact_cover_x2 from puzzler import info from puzzler.utils import thousands, plural_s try: import locale locale.setlocale(locale.LC_ALL, '') except: pass __version__ = '1+SVN' version_template = ( '%%prog\nPolyform Puzzler version %s [%s], Python %s, on %s' % (__version__, info.revision, sys.version.split()[0], sys.platform)) exact_cover_modules = { 'dlx': exact_cover_dlx, 'x2': exact_cover_x2,} algorithm_choices = ('x2', 'dlx',) try: from puzzler import exact_cover_c exact_cover_modules['c'] = exact_cover_c algorithm_choices = ('c',) + algorithm_choices except ImportError: pass def run(puzzle_class, output_stream=sys.stdout, settings=None): """ Given a `puzzler.puzzles.Puzzle` subclass, process the command line and dispatch accordingly. """ if settings is None: settings = process_command_line() if settings.read_solution: read_solution(puzzle_class, settings) elif settings.report_search_state: report_search_state(puzzle_class, output_stream, settings) else: return solve(puzzle_class, output_stream, settings) def process_command_line(): """Process command-line options & return a settings object.""" parser = optparse.OptionParser( formatter=optparse.TitledHelpFormatter(width=78), add_help_option=None) parser.add_option( '-a', '--algorithm', metavar='NAME', choices=algorithm_choices, default=algorithm_choices[0], help=('Choice of exact cover algorithm. Choices: %s.' % ('"%s" (default), "%s"' % (algorithm_choices[0], '", "'.join(algorithm_choices[1:]))))) parser.add_option( '-n', '--stop-after', type='int', metavar='N', help='Stop processing after generating N solution(s). ' 'Or, combined with -r/--read-solution, read solution number N.') parser.add_option( '-r', '--read-solution', metavar='FILE', help='Read a solution record from FILE for further processing ' ' ("-" for STDIN).') parser.add_option( '-s', '--svg', metavar='FILE', help='Format the first solution found (or supplied via -r) as SVG ' 'and write it to FILE ("-" for STDOUT).') parser.add_option( '-x', '--x3d', metavar='FILE', help='Format the first solution found (or supplied via -r) as X3D ' 'and write it to FILE ("-" for STDOUT).') default = search_state_default() parser.add_option( '-S', '--search-state-file', metavar='FILE', default=default, help=('Use FILE for automatic search state save & restore. ' 'Default: "%s".' % default)) parser.add_option( '-N', '--no-search-state', dest='search_state_file', action='store_const', const=None, help='Disable automatic search state save & restore.') parser.add_option( '-R', '--report-search-state', action='store_true', help=('Report on the current search state (partial solution), ' 'useful for long-running puzzles. Use -S/--search-state-file ' 'to read a search state file other than the default.')) parser.add_option( '-V', '--version', help="Show Polyform Puzzler's version information and exit.", action='version') parser.version = version_template parser.add_option( '-h', '--help', help='Show this help message and exit.', action='help') settings, args = parser.parse_args() if args: print >>sys.stderr, ( '%s takes no command-line arguments; "%s" ignored.' % (sys.argv[0], ' '.join(args))) return settings def search_state_default(): """Return the default name for the search state file.""" prog = os.path.basename(sys.argv[0]) if prog.endswith('.py') or prog.endswith('.pyw') or prog.endswith('.pyc'): prog = prog[:prog.rfind('.py')] return '%s.state' % prog def read_solution(puzzle_class, settings): """A solution record was supplied; just read & process it.""" puzzle = puzzle_class.components()[0](init_puzzle=False) s_matrix = puzzle.read_solution( settings.read_solution, solution_number=settings.stop_after) if settings.svg: puzzle.write_svg(settings.svg, s_matrix=copy.deepcopy(s_matrix)) if settings.x3d: puzzle.write_x3d(settings.x3d, s_matrix=copy.deepcopy(s_matrix)) def report_search_state(puzzle_class, output_stream, settings): state = SessionState.restore(settings.search_state_file, read_only=True) solver = exact_cover_modules[settings.algorithm].ExactCover(state=state) puzzle = puzzle_class.components()[0]() solver.load_matrix(puzzle.matrix, puzzle.secondary_columns) solution = solver.full_solution() if state.num_searches: print >>output_stream, ( '\nSession report: %s solution%s, %s searches.\n' % (thousands(state.num_solutions), plural_s(state.num_solutions), thousands(state.num_searches))) output_stream.flush() puzzle.record_solution( solution, solver, stream=output_stream) if settings.svg: puzzle.write_svg(settings.svg, solution) if settings.x3d: puzzle.write_x3d(settings.x3d, solution) def solve(puzzle_class, output_stream, settings): """Find and record all solutions to a puzzle. Report on `output_stream`.""" start = datetime.now() try: state = SessionState.restore(settings.search_state_file) except IOError, error: print >>sys.stderr, 'Unable to initialize the search state file:' print >>sys.stderr, '%s: %s' % (error.__class__.__name__, error) sys.exit(1) solver = exact_cover_modules[settings.algorithm].ExactCover(state=state) if state.num_searches: print >>output_stream, ( '\nResuming session (%s solution%s, %s searches).\n' % (thousands(state.num_solutions), plural_s(state.num_solutions), thousands(state.num_searches))) output_stream.flush() starting_solutions = state.num_solutions matrices = [] stats = [] puzzles = [] try: try: for component in puzzle_class.components(): if component.__name__ not in state.completed_components: # !!! instantiate inside the loop instead? will save time # initially (and memory) with multi-part puzzles puzzles.append(component()) for puzzle in puzzles: # check for and eliminate duplicate rows unique_rows = [] for row in puzzle.matrix[1:]: if row not in unique_rows: unique_rows.append(row) else: print >>output_stream, "duplicate row: ", for i, item in enumerate(row): if item: print >>output_stream, item, print >>output_stream original_row_count = len(puzzle.matrix[1:]) unique_row_count = len(unique_rows) if original_row_count != unique_row_count: print >>output_stream, ( '\nEliminating %s duplicate rows leaving %s total rows.\n' % (original_row_count - unique_row_count, unique_row_count)) puzzle.matrix[1:] = unique_rows matrices.append((puzzle.matrix, puzzle.secondary_columns)) state.init_periodic_save(solver) last_solutions = state.last_solutions last_searches = state.last_searches for i, puzzle in enumerate(puzzles): print >>output_stream, ('solving %s:\n' % puzzle.__class__.__name__) output_stream.flush() solver.load_matrix(*matrices[i]) for solution in solver.solve(): state.save(solver) if not puzzle.record_solution(solution, solver, stream=output_stream): continue if settings.svg: puzzle.write_svg(settings.svg, solution) settings.svg = False if settings.x3d: puzzle.write_x3d(settings.x3d, solution) settings.x3d = False if ( settings.stop_after and ((solver.num_solutions - starting_solutions) >= settings.stop_after)): break stats.append((solver.num_solutions - last_solutions, solver.num_searches - last_searches)) if ( settings.stop_after and solver.num_solutions == settings.stop_after): print >>output_stream, ( 'User-requested solution limit reached.') break state.last_solutions = last_solutions = solver.num_solutions state.last_searches = last_searches = solver.num_searches state.completed_components.add(puzzle.__class__.__name__) except KeyboardInterrupt: print >>output_stream, 'Session interrupted by user.' state.save(solver, final=True) state.close() sys.exit(1) finally: end = datetime.now() duration = end - start print >>output_stream, ( '%s solution%s, %s searches, duration %s' % (thousands(solver.num_solutions), plural_s(solver.num_solutions), thousands(solver.num_searches), duration)) if len(stats) > 1: for i, (solutions, searches) in enumerate(stats): print >>output_stream, ( '(%s: %s solution%s, %s searches)' % (puzzles[i].__class__.__name__, thousands(solutions), plural_s(solutions), thousands(searches))) output_stream.flush() state.cleanup() return solver.num_solutions class SessionState(object): """Saves & restores the state of the session.""" save_interval = 60 # seconds, for thread def __init__(self, path=None): self.solution = [] self.num_solutions = 0 self.num_searches = 0 self.last_solutions = 0 self.last_searches = 0 self.completed_components = set() self.lock = threading.Lock() self.state_file = None self.init_state_file(path) def init_state_file(self, path): if path: if os.path.exists(path): self.state_file = open(path, 'r+b') else: self.state_file = open(path, 'wb') else: self.state_file = None def init_periodic_save(self, solver): if self.state_file: t = threading.Thread(target=self.save_periodically, args=(solver,)) t.setDaemon(True) t.start() def __getstate__(self): # copy the dict since we change it: odict = self.__dict__.copy() # remove runtime state: del odict['state_file'], odict['lock'] return odict def save(self, solver, final=False): if self.state_file and self.lock.acquire(final): # GIL check interval hack (r512, to prevent corrupted state # results) doesn't work, see # http://dr-josiah.blogspot.ca/2011/07/neat-python-hack-no-broken-code.html #GIL_interval = sys.getcheckinterval() #sys.setcheckinterval(sys.maxint) self.num_solutions = solver.num_solutions self.num_searches = solver.num_searches self.state_file.seek(0) pickle.dump(self, self.state_file, 2) self.state_file.flush() self.state_file.truncate() #sys.setcheckinterval(GIL_interval) self.lock.release() def save_periodically(self, solver): """This method is run as a daemon thread.""" while True: time.sleep(self.save_interval) self.save(solver) def close(self): if self.state_file: self.state_file.close() def cleanup(self): if self.state_file: path = self.state_file.name self.state_file.close() os.unlink(path) @classmethod def restore(cls, path, read_only=False): """ Return either the saved session state or a new `SessionState` object. (A factory function.) """ if path: if os.path.exists(path): state_file = open(path, 'rb') state = pickle.load(state_file) state_file.close() if not read_only: state.init_state_file(path) return state elif read_only: print >>sys.stderr, ( 'The search state file "%s" does not exist; exiting.' % path) sys.exit(1) return cls(path) |
From: Alexandre M. <mu...@xp...> - 2013-05-24 18:32:58
|
Here's my code for handling pentomino cylinders of various dimensions: def getPentominoesLoopByHeight(h): class PentominoesLoopByHeight(PentominoesLoop): height = h width = 60 / h return PentominoesLoopByHeight class PentominoesLoop(Pentominoes): """ Symmetry: restrict V to one x position and one orientation. """ check_for_duplicates = True def build_matrix(self): keys = sorted(self.pieces.keys()) x_coords, x_aspect = self.pieces['V'][0] for y in range(self.height - 2): translated = x_aspect.translate((0, y)) self.build_matrix_row('V', translated) keys.remove('V') for key in keys: for coords, aspect in self.pieces[key]: for x in range(self.width): for y in range(self.height - aspect.bounds[1]): translated = aspect.translate((x, y), (self.width, 0)) self.build_matrix_row(key, translated) Results: 4×15: 901 solutions, 418,086 searches, duration 0:00:45.155573 5×12: 8,272 solutions, 2,845,928 searches, duration 0:04:55.194066 6×10: 28,996 solutions, 9,388,188 searches, duration 0:15:45.094640 That's running Puzzler in pypy, which is a little less than three times as fast as python 2.7.3 on this for me. I'm running the 10×6 now, but it might take a while. AOM |
From: David G. <go...@py...> - 2011-09-21 23:56:53
|
I have been working on triangular-grid polysticks under the name "polytrigs" (from "TRIangular Grid", much less of a mouthful). Results to date here: http://puzzler.sourceforge.net/docs/polytrigs.html Take a look! -- David Goodger <http://python.net/~goodger> |
From: David G. <go...@py...> - 2011-02-20 15:05:21
|
On Thu, Feb 17, 2011 at 22:00, Alexandre Owen Muniz <mu...@xp...> wrote: > I want to override the polystick solver's behavior of disallowing > crossings between pieces. Why? > I wasn't able to figure out how to do that > from the code. The intersections are represented by the columns with labels like "1,2i" (see http://puzzler.sourceforge.net/docs/FAQ.html#how-should-polystick-solution-files-be-interpreted). Removing these columns from the puzzle matrix would do what you want. The code isn't designed to allow this easily though. It might require some refactoring. Perhaps you could override puzzler.coordsys.SquareGrid3DCoordSetMixin.intersections to remove the intersections (it could return an empty set). -- David Goodger <http://python.net/~goodger> |
From: Alexandre O. M. <mu...@xp...> - 2011-02-18 03:16:10
|
I want to override the polystick solver's behavior of disallowing crossings between pieces. I wasn't able to figure out how to do that from the code. Owen |
From: Paul K. <pa...@kr...> - 2008-04-03 12:27:38
|
Just trying to ensure I'm doing this right.... (and that the posts are white-listed in the spam filters). /P |
From: David G. <go...@py...> - 2006-06-12 15:25:39
|
Welcome to the Polyform Puzzler project. This mailing list is the place to ask questions and discuss the project. View messages or subscribe to the list here: https://lists.sourceforge.net/lists/listinfo/puzzler-users The project's Subversion repository (for version control) is configured to send change notification messages to the puzzler-checkins list; view or subscribe here: https://lists.sourceforge.net/lists/listinfo/puzzler-checkins -- David Goodger <http://python.net/~goodger> |