Skip to content

Commit 3679858

Browse files
committed
397 puzzles. Simplified generation process
1 parent 54f6d97 commit 3679858

15 files changed

+3748
-15757
lines changed

generators/IMO.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,6 @@ def gen(self, target_num_instances):
9191
for i in range(10):
9292
n = 2 ** i
9393
self.add(dict(n=n))
94-
if len(self.instances) >= target_num_instances:
95-
return
9694

9795

9896
class NoRelativePrimes(PuzzleGenerator):

generators/chess.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def possible(i, j):
120120
def gen(self, num_target_problems):
121121
count = 0
122122
for n in [9, 8, 7, 6, 5] + list(range(10, 100)):
123-
if len(self.instances) == num_target_problems:
123+
if self.num_generated_so_far() == num_target_problems:
124124
return
125125
m = n
126126
self.add(dict(m=m, n=n))
@@ -170,7 +170,7 @@ def legal_quad(m1, m2): # non-overlapping test: parallel or bounding box has (w
170170

171171
def gen(self, target_num_instances):
172172
for count, n in enumerate(self.nxn_records):
173-
if len(self.instances) >= target_num_instances:
173+
if self.num_generated_so_far() >= target_num_instances:
174174
return
175175
self.add(dict(m=n, n=n, target=self.nxn_records[n]))
176176

@@ -223,7 +223,7 @@ def legal_quad(m1, m2): # non-overlapping test: parallel or bounding box has (w
223223

224224
def gen(self, target_num_instances):
225225
for n in self.unsolved_nxn_records:
226-
if len(self.instances) >= target_num_instances:
226+
if self.num_generated_so_far() >= target_num_instances:
227227
return
228228
self.add(dict(m=n, n=n, target=self.unsolved_nxn_records[n] + 1)) # Note the +1 means breaking the record!
229229

generators/classic_puzzles.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def sol(n):
239239

240240
def gen(self, target_num_instances):
241241
for n in [7824] + list(range(target_num_instances)):
242-
if len(self.instances) == target_num_instances:
242+
if self.num_generated_so_far() == target_num_instances:
243243
return
244244
self.add(dict(n=n), test=n <= 100)
245245

@@ -410,7 +410,7 @@ def mirror(coords): # rotate to all four corners
410410
def gen(self, target_num_instances):
411411
for easy in range(47):
412412
for side in range(47):
413-
if len(self.instances) == target_num_instances:
413+
if self.num_generated_so_far() == target_num_instances:
414414
return
415415
test = side < 5 or side == 10
416416
num_points = 1 if side == 1 else 2 * side
@@ -556,7 +556,6 @@ def print_sets(sets):
556556
if i == 2 or i == 5:
557557
ans += "\n"
558558

559-
560559
@staticmethod
561560
def gen_sudoku_puzzle(rand):
562561

@@ -640,14 +639,14 @@ def solve_helper():
640639
done = False
641640
while not done:
642641
done = True
643-
pi = list([i for i in range(81) if x[i]!="_"])
642+
pi = list([i for i in range(81) if x[i] != "_"])
644643
rand.shuffle(pi)
645644
for i in pi:
646645
old = x[i]
647646
x[i] = "_"
648647
ans = solve("".join(x))
649648
assert ans
650-
if len(ans)>1:
649+
if len(ans) > 1:
651650
x[i] = old
652651
else:
653652
done = False
@@ -657,11 +656,10 @@ def solve_helper():
657656

658657
return "".join(x)
659658

660-
661659
def gen_random(self):
662660

663661
puz = None
664-
for attempt in range(10 if len(self.instances)<10 else 1):
662+
for attempt in range(10 if self.num_generated_so_far() < 10 else 1):
665663
puz2 = Sudoku.gen_sudoku_puzzle(self.random)
666664
if puz is None or puz2.count("_") > puz.count("_"):
667665
puz = puz2
@@ -698,8 +696,7 @@ def sol():
698696

699697

700698
class NecklaceSplit(PuzzleGenerator):
701-
"""[Necklace Splitting Problem](https://en.wikipedia.org/wiki/Necklace_splitting_problem)
702-
"""
699+
"""[Necklace Splitting Problem](https://en.wikipedia.org/wiki/Necklace_splitting_problem)"""
703700

704701
@staticmethod
705702
def sat(n: int, lace="bbrbrbbbbbbrrrrrrrbrrrrbbbrbrrbbbrbrrrbrrbrrbrbbrrrrrbrbbbrrrbbbrbbrbbbrbrbb"):

generators/codeforces.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@ def sol(n):
2525
return n % 2 == 0
2626

2727
def gen(self, target_num_instances):
28-
n = 0
29-
while len(self.instances) < target_num_instances:
28+
for n in range(target_num_instances):
3029
self.add(dict(n=n))
31-
n += 1
3230

3331

3432
class Abbreviate(PuzzleGenerator):
@@ -128,10 +126,10 @@ def sol(scores, k):
128126
return sum(s >= threshold for s in scores)
129127

130128
def gen_random(self):
131-
n = min(len(self.instances) + 1, 100)
129+
n = self.random.randrange(1, 50)
132130
max_score = self.random.randrange(50)
133131
scores = sorted([self.random.randrange(max_score + 1) for _ in range(n)], reverse=True)
134-
k = self.random.randrange(len(scores))
132+
k = self.random.randrange(n)
135133
self.add(dict(scores=scores, k=k))
136134

137135

@@ -328,7 +326,7 @@ def sol(matrix, max_moves):
328326
def gen(self, target_num_instances):
329327
for i in range(5):
330328
for j in range(5):
331-
if len(self.instances) == target_num_instances:
329+
if self.num_generated_so_far() == target_num_instances:
332330
return
333331
matrix = [[0] * 5 for _ in range(5)]
334332
matrix[i][j] = 1
@@ -952,7 +950,7 @@ def sol(target):
952950

953951
def gen(self, target_num_instances):
954952
target = 0
955-
while len(self.instances) < target_num_instances:
953+
while self.num_generated_so_far() < target_num_instances:
956954
self.add(dict(target=target))
957955
target += 1
958956

generators/conways_game_of_life.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def gen_random(self):
132132
next_step = {z for z in visible if sum(z + d in live for d in deltas) in ([2, 3] if z in live else [3])}
133133

134134
target = sorted([[int(z.real), int(z.imag)] for z in next_step])
135-
self.add(dict(target=target), test=len(self.instances) < 10)
135+
self.add(dict(target=target), test=self.num_generated_so_far() < 10)
136136

137137

138138
########################################################################################################################

generators/graphs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,9 +387,9 @@ def sol(z, n, t):
387387
return [[a, b] for a, b in edges]
388388

389389
def gen(self, target_num_instances):
390-
if len(self.instances) < target_num_instances:
390+
if self.num_generated_so_far() < target_num_instances:
391391
self.add(dict(z=26, n=6, t=3), test=False)
392-
if len(self.instances) < target_num_instances:
392+
if self.num_generated_so_far() < target_num_instances:
393393
self.add(dict(z=13, n=4, t=3))
394394

395395

0 commit comments

Comments
 (0)