Skip to content

Commit 5d8571f

Browse files
committed
More chapter 8 problems
1 parent a57401c commit 5d8571f

File tree

4 files changed

+147
-0
lines changed

4 files changed

+147
-0
lines changed

chapter_8/p8_12.py

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from typing import List
2+
3+
4+
def queens_8():
5+
current_queens = []
6+
ways = 0
7+
for i in range(8):
8+
ways += rec_queen_place(1, [(i, 0)])
9+
10+
return ways
11+
12+
13+
def rec_queen_place(col: int, queen_list):
14+
# print(f"Current queens {queen_list}")
15+
if col >= 8:
16+
display_queen_placement(queen_list)
17+
return 1
18+
19+
possible_rows = set(range(8))
20+
for (qr, qc) in queen_list:
21+
possible_rows.remove(qr)
22+
23+
ways = 0
24+
for row in possible_rows:
25+
if valid_w_queens((row, col), queen_list):
26+
ways += rec_queen_place(col+1, queen_list + [(row, col)])
27+
return ways
28+
29+
30+
def valid_w_queens(poz, queens):
31+
diag_desc = poz[0]-poz[1]
32+
diag_asc = poz[0] + poz[1]
33+
return not any(qi-qj == diag_desc or qi+qj == diag_asc
34+
for (qi, qj) in queens)
35+
36+
37+
def display_queen_placement(ql: List):
38+
board = [['_' for _ in range(8)] for _ in range(8)]
39+
for qi, qj in ql:
40+
board[qi][qj] = "Q"
41+
42+
for line in board:
43+
print(line)
44+
print("-"*50)
45+
46+
if __name__ == "__main__":
47+
print(f"Got ways to put 8 queens: {queens_8()}")

chapter_8/p8_6.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
def hanoi_towers(n):
2+
stacks = [[], [], []]
3+
stacks[0] = list(range(n, 0, -1))
4+
5+
print(f"Got start stacks\t{stacks}")
6+
move_stack(n, 0, 2, stacks)
7+
display_stacks(stacks)
8+
9+
10+
def move_disk(source_ind, target_ind, stacks):
11+
stacks[target_ind].append(stacks[source_ind].pop())
12+
13+
14+
def display_stacks(stacks):
15+
for i, stack in enumerate(stacks):
16+
print(f"{i} -> {stack}")
17+
print("-"*50)
18+
19+
20+
def move_stack(elem_bot, src, target, stacks):
21+
display_stacks(stacks)
22+
temp_stack = 3 - src - target
23+
top_src = stacks[src][-1]
24+
if top_src == elem_bot:
25+
move_disk(src, target, stacks)
26+
else:
27+
move_stack(elem_bot-1, src, temp_stack, stacks)
28+
move_disk(src, target, stacks)
29+
move_stack(elem_bot-1, temp_stack, target, stacks)
30+
31+
32+
if __name__ == "__main__":
33+
hanoi_towers(4)

chapter_8/p8_7.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import math
2+
3+
def perm_uniq(inp: str):
4+
return rec_perm("", inp)
5+
6+
7+
def rec_perm(prefix, ltr_pool):
8+
if not ltr_pool:
9+
return [prefix]
10+
11+
perms = []
12+
for i, ltr in enumerate(ltr_pool):
13+
nprefix = prefix + ltr
14+
sub_perm = rec_perm(nprefix, ltr_pool[:i] + ltr_pool[i+1:])
15+
perms += sub_perm
16+
17+
return perms
18+
19+
20+
if __name__ == "__main__":
21+
exs = ["a", "", "abc", "abcd", "abcdef"]
22+
23+
for ex in exs:
24+
permutations = perm_uniq(ex)
25+
print(
26+
f"Perms {len(ex)} of nr {len(permutations)}"
27+
f" same as predicted {math.factorial(len(ex))}"
28+
f" \t{ex} are {permutations}")

chapter_8/p8_8.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from collections import Counter
2+
from typing import List
3+
import math
4+
5+
6+
def perm_dups(words: str):
7+
count = Counter(words)
8+
res_list_list = perm_w_count(count)
9+
return ["".join(res) for res in res_list_list]
10+
11+
12+
def perm_w_count(counter: dict) -> List[List]:
13+
res = []
14+
has_to_place = False
15+
16+
for k, v in counter.items():
17+
if v > 0:
18+
has_to_place = True
19+
call_dict = counter.copy()
20+
# print(f"Call dict is {call_dict}")
21+
call_dict[k] -= 1
22+
res_subcall = perm_w_count(call_dict)
23+
res.extend([[k] + rest for rest in res_subcall])
24+
25+
if not has_to_place:
26+
return [[""]]
27+
else:
28+
return res
29+
30+
31+
if __name__ == "__main__":
32+
exs = ["a", "", "abc", "abcd", "aaab", "bbaa", "calalc", "aqa"]
33+
34+
for ex in exs:
35+
permutations = perm_dups(ex)
36+
print(
37+
f"Perms input len: {len(ex)} of computed: {len(permutations)}"
38+
f" \t{ex} are {permutations}")
39+
print("-"*50)

0 commit comments

Comments
 (0)