From e8f69a8743b181de95c5b076be28b5748f082ab5 Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Mon, 21 Mar 2022 05:35:25 +0900 Subject: [PATCH] Count cycles by iteration Verifying solution... Test 1 passed! Test 2 passed! Test 3 failed [Hidden] Test 4 passed! [Hidden] Test 5 failed [Hidden] Test 6 failed [Hidden] Test 7 failed [Hidden] Test 8 failed [Hidden] Test 9 passed! [Hidden] Test 10 failed [Hidden] --- level5/disorderly-escape/solution.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/level5/disorderly-escape/solution.py b/level5/disorderly-escape/solution.py index 9f8a63c..2921b7b 100644 --- a/level5/disorderly-escape/solution.py +++ b/level5/disorderly-escape/solution.py @@ -1,11 +1,36 @@ import math +import numpy as np def solution(w, h, s): return str(sum([s**cycle for cycle in generate_cycles(w, h)])/(math.factorial(w)*math.factorial(h))) def generate_cycles(w, h): - yield 1 + identity = np.arange(w*h).reshape((w, h)) + for i in generate_permutation(list(range(w))): + for j in generate_permutation(list(range(h))): + yield count_cycle(identity[i][:, j]) +def generate_permutation(numbers): + if len(numbers) == 1: + yield numbers + else: + for i, n in enumerate(numbers): + for j in generate_permutation(numbers[:i] + numbers[i+1:]): + yield [n] + j + +def count_cycle(arr): + cycle = np.zeros(arr.shape, dtype=int) + w, h = arr.shape + cycle_id = 0 + for i in range(w): + for j in range(h): + x, y = i, j + if cycle[x, y] == 0: + cycle_id += 1 + while cycle[x, y] == 0: + cycle[x, y] = cycle_id + x, y = arr[x, y]/h, arr[x, y]%h + return cycle_id tests = [ ([2, 3, 4], '430'),