Apr-23-2019, 11:02 PM
(This post was last modified: Apr-23-2019, 11:02 PM by Escribblings.)
Please excuse me, I am both a novice in python, and in coding in general. So this code is probably quite ugly.
I have written (with some help) a program that is supposed to distribute the numbers 1-24 across the face of a cube.
There are certain rules it must follow.
I have figured out that because each number and its opposite sum to 25, I only have to calculate for 3 sides and 4 corners, and the others will automatically fall into line.
I also figured out that as I'm looking at combinations, I could set the first number to always be the beginning of the list, meaning I could drop 2 numbers from the combinations computations.
I've put my code below. The output lists the corners above the sides.
For some reason sides 2 & 3 (and therefore 4 & 5) in the output do not all sum to 50 (lines 65 & &3 below). Yet the code for them is no different to that for side 1 (and 6) (line 57).
I have written (with some help) a program that is supposed to distribute the numbers 1-24 across the face of a cube.
There are certain rules it must follow.
- There must be 4 numbers to a side, and 3 numbers where the sides meet at a corner.
- Each number and its direct physical opposite must sum to 25.
- No pair of numbers on a face can sum to 25.
- The 4 numbers on each side must sum to 50.
- The 3 numbers at each corner must sum to 37 or 38.
- Each pair of adjacent corners connected by an edge must sum to 75.
I have figured out that because each number and its opposite sum to 25, I only have to calculate for 3 sides and 4 corners, and the others will automatically fall into line.
I also figured out that as I'm looking at combinations, I could set the first number to always be the beginning of the list, meaning I could drop 2 numbers from the combinations computations.
I've put my code below. The output lists the corners above the sides.
For some reason sides 2 & 3 (and therefore 4 & 5) in the output do not all sum to 50 (lines 65 & &3 below). Yet the code for them is no different to that for side 1 (and 6) (line 57).
def combinations(iterable,r = None): pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i + 1,r): indices[j] = indices[j - 1] + 1 yield tuple(pool[i] for i in indices) corner_combinations = 0 face_combinations = 0 side_numbers_all = list(range(1,25)) corner_numbers_all = list(range(1,25)) for corner_a in combinations((corner_numbers_all[1:24]), 2): if 36 < corner_numbers_all[0] + sum(corner_a) < 39: corner1 = (corner_numbers_all[0], corner_a[0], corner_a[1]) if (corner1[0] + corner1[1] and corner1[0] + corner1[2] and corner1[1] + corner1[2]) != 25: corner8 = (25 - corner1[0], 25 - corner1[1], 25 - corner1[2]) corner_numbers_remaining = list(set(corner_numbers_all) - set(corner1) - set(corner8)) for corner_b in combinations((corner_numbers_remaining[1:18]), 2): if 36 < corner_numbers_remaining[0] + sum(corner_b) < 39: corner2 = (corner_numbers_remaining[0], corner_b[0], corner_b[1]) if (sum(corner1) + sum(corner2) ==75: if (corner2[0] + corner2[1] and corner2[0] + corner2[2] and corner2[1] + corner2[2]) != 25: corner7 = (25 - corner2[0], 25 - corner2[1], 25 - corner2[2]) corner_numbers_remaining2 = list(set(corner_numbers_remaining) - set(corner2) - set(corner7)) for corner_c in combinations((corner_numbers_remaining2[1:12]), 2): if 36 < corner_numbers_remaining2[0] + sum(corner_c) < 39: corner3 = (corner_numbers_remaining2[0], corner_c[0], corner_c[1]) if sum(corner3) == sum(corner1): if (corner3[0] + corner3[1] and corner3[0] + corner3[2] and corner3[1] + corner3[2]) != 25: corner6 = (25 - corner3[0], 25 - corner3[1], 25 - corner3[2]) corner_numbers_remaining3 = list(set(corner_numbers_remaining2) - set(corner3) - set(corner6)) for corner_d in combinations((corner_numbers_remaining3[1:6]), 2): if 36 < corner_numbers_remaining3[0] + sum(corner_d) < 39: corner4 = (corner_numbers_remaining3[0], corner_d[0], corner_d[1]) if sum(corner1) + sum(corner4) ==75: if (corner4[0] + corner4[1] and corner4[0] + corner4[1] and corner4[1] + corner4[2]) != 25: corner5 = (25 - corner4[0], 25 - corner4[1], 25 - corner4[2]) corner_combinations += 1 for side_a in combinations((side_numbers_all[1:24]),3): if side_numbers_all[0] + sum(side_a) == 50: if (side_numbers_all[0] + side_a[0] and side_numbers_all[0] + side_a[1] and side_numbers_all[0] + side_a[2] and side_a[0] + side_a[1] and side_a[0] + side_a[2] and side_a[1] + side_a[2]) != 25: side1 = (side_numbers_all[0], side_a[0], side_a[1], side_a[2]) if (len(set(side1).intersection(corner1)) and len(set(side1).intersection(corner2)) and len(set(side1).intersection(corner3)) and len(set(side1).intersection(corner4)) and len(set(side1).intersection(corner5)) and len(set(side1).intersection(corner6)) and len(set(side1).intersection(corner7)) and len(set(side1).intersection(corner8))) <= 1: side6 = (25-side1[0], 25-side1[1], 25-side1[2], 25-side1[3]) side_numbers_remaining = list(set(side_numbers_all) - set(side1) - set(side6)) for side_b in combinations(side_numbers_remaining[1:16],3): if side_numbers_remaining[0] + sum(side_b) == 50: if (side_numbers_remaining[0] + side_b[0] and side_numbers_remaining[0] + side_b[1] and side_numbers_remaining[0] + side_b[2] and side_b[0] + side_b[1] and side_b[0] + side_b[2] and side_b[1] + side_b[2]) != 25: side2 = (side_numbers_remaining[0], side_b[0], side_b[1], side_b[2]) if (len(set(side2).intersection(corner1)) and len(set(side2).intersection(corner2)) and len(set(side2).intersection(corner3)) and len(set(side2).intersection(corner4)) and len(set(side2).intersection(corner5)) and len(set(side2).intersection(corner6)) and len(set(side2).intersection(corner7)) and len(set(side2).intersection(corner8))) <= 1: side5 = (25-side2[0], 25-side2[1], 25-side2[2], 25-side2[3]) side_numbers_remaining2 = list(set(side_numbers_remaining) - set(side2) - set(side5)) for side_c in combinations(side_numbers_remaining2[1:8],3): if side_numbers_remaining2[0] + sum(side_c) == 50: if (side_numbers_remaining2[0] + side_c[0] and side_numbers_remaining2[0] + side_c[1] and side_numbers_remaining2[0] + side_c[2] and side_c[0] + side_c[1] and side_c[0] + side_c[2] and side_c[1] + side_c[2]) != 25: side3 = (side_numbers_remaining2[0], side_c[0], side_c[1], side_c[2]) if (len(set(side3).intersection(corner1)) and len(set(side3).intersection(corner2)) and len(set(side3).intersection(corner3)) and len(set(side3).intersection(corner4)) and len(set(side3).intersection(corner5)) and len(set(side3).intersection(corner6)) and len(set(side3).intersection(corner7))and len(set(side3).intersection(corner8))) <= 1: side4 = (25-side3[0], 25-side3[1], 25-side3[2], 25-side3[3]) face_combinations += 1 print (corner_combinations, corner1, corner2, corner3, corner4, corner5, corner6, corner7, corner8) print (face_combinations, side1, side2, side3, side4, side5, side6)