Python Forum
Output not following rules set in code.
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Output not following rules set in code.
#1
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.
  • 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'm not even certain that there is a possible solution.

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)
Reply
#2
I think your problem is this sort of conditional: if (corner2[0] + corner2[1] and corner2[0] + corner2[2] and corner2[1] + corner2[2]) != 25:. This does not test that all three of those sums are not 25. It only tests if the last number is not 25. You probably want if 25 not in (corner2[0] + corner2[1], corner2[0] + corner2[2], corner2[1] + corner2[2]):

I don't think this is a good way to structure the code. All of those ifs with repeated code are a recipe for bugs. I would break it apart into functions for checking squares and corners, and generating the same. And I would use more lists and less variables ending in numbers. Any time you have var1, var2, var3, ..., it's time to start thinking about a list.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#3
Ok.

Thank you for the feedback, I think I understand where you're coming from, I just don't know how to implement it.

As for what you say about the 25, the thing is that send to be working. It's the lines if x == 50: that seem to be being ignored.

I originally had those statements as seperated nested if statements

if s != 25:
  if b != 25:
    if c != 25:
And the result from that is no different to the result I'm getting now.

I did also wonder about using

if all (a+b, a+c, a+d) != 25:
But am not sure on the correct format of such a line.

Either way though, side 2 should sum to 50 before the program continues, and it isn't doing.

Oh, and I agree with turning it into functions, I just have no idea how to do it.

Would have edited the last post, but I can't find the bottom - maybe I left it too late to do so
Reply
#4
(Apr-24-2019, 01:52 AM)Escribblings Wrote: As for what you say about the 25, the thing is that send to be working. It's the lines if x == 50: that seem to be being ignored.

It is not working. Test it yourself:

if (25 and 20 and 15) != 25:
     print("It's broken")
else:
     print("It works")
The and of two non-zero numbers is the number on the right. So as long as the last number is 25, and the first two numbers are non-zero (guaranteed since you're adding two numbers from 1 to 24), that will be true.

I gave you the correct format: if 25 not in (corner2[0] + corner2[1], corner2[0] + corner2[2], corner2[1] + corner2[2]):. In the above example, this would simplify to if 25 not in (15, 20, 25): which would be False, since 25 is in the tuple. The easiest thing to do is just combine them with and's: if a + b != 25 and a + c != 25 and a + d != 25:.

Your all version does not work because it evaluates the all first. All of those sums are non-zero integers, which evaluate to True. So they are all True, and the all version simplifies to if True != 25:, which is always true.

In terms of converting to functions, start with checking things. Make a function that returns True if a side is valid and False if it isn't. Do the same for a corner, and so on.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#5
Thank you. I will take another look.

OK, thank you. It does now seem to be working.

I have changed the != 25 lines and the .intersection <=1 lines.

Also added some print statements for clarity.

I now need to work through the output (thankfully it's down to 493 combinations from 3,189 - although this still feels excessive!)

This is the new, edited, code (I'll work on the functions later).

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
side_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 25 not in (corner1[0] + corner1[1], corner1[0] + corner1[2], corner1[1] + corner1[2]):
      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 25 not in (corner2[0] + corner2[1], corner2[0] + corner2[2], corner2[1] + corner2[2]):
              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 25 not in (side_numbers_all[0] + side_a[0], side_numbers_all[0] + side_a[1], side_numbers_all[0] + side_a[2], side_a[0] + side_a[1], side_a[0] + side_a[2], side_a[1] + side_a[2]):
                                    side1 = (side_numbers_all[0], side_a[0], side_a[1], side_a[2])
                                    if len(set(side1).intersection(corner1)) <= 1 and len(set(side1).intersection(corner2)) <= 1 and len(set(side1).intersection(corner3)) <= 1 and len(set(side1).intersection(corner4)) <= 1 and len(set(side1).intersection(corner5)) <= 1 and len(set(side1).intersection(corner6)) <= 1 and len(set(side1).intersection(corner7)) <= 1 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 25 not in (side_numbers_remaining[0] + side_b[0], side_numbers_remaining[0] + side_b[1], side_numbers_remaining[0] + side_b[2], side_b[0] + side_b[1], side_b[0] + side_b[2], side_b[1] + side_b[2]):
                                            side2 = (side_numbers_remaining[0], side_b[0], side_b[1], side_b[2])
                                            if len(set(side2).intersection(corner1)) <= 1 and len(set(side2).intersection(corner2)) <= 1 and len(set(side2).intersection(corner3)) <= 1 and len(set(side2).intersection(corner4)) <= 1 and len(set(side2).intersection(corner5)) <= 1 and len(set(side2).intersection(corner6)) <= 1 and len(set(side2).intersection(corner7)) <= 1 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 25 not in (side_numbers_remaining2[0] + side_c[0], side_numbers_remaining2[0] + side_c[1], side_numbers_remaining2[0] + side_c[2], side_c[0] + side_c[1], side_c[0] + side_c[2], side_c[1] + side_c[2]):
                                                    side3 = (side_numbers_remaining2[0], side_c[0], side_c[1], side_c[2])
                                                    if len(set(side3).intersection(corner1)) <= 1 and len(set(side3).intersection(corner2)) <= 1 and len(set(side3).intersection(corner3)) <= 1 and len(set(side3).intersection(corner4)) <= 1 and len(set(side3).intersection(corner5)) <= 1 and len(set(side3).intersection(corner6)) <= 1 and len(set(side3).intersection(corner7)) <= 1 and len(set(side3).intersection(corner8)) <= 1:
                                                      side4 = (25-side3[0], 25-side3[1], 25-side3[2], 25-side3[3])
													
                                                      side_combinations += 1
                                                      print ("corner combinations:", corner_combinations)
                                                      print (corner1,"=", sum(corner1), corner2,"=", sum(corner2), corner3,"=", sum(corner3), corner4,"=", sum(corner4), corner5,"=", sum(corner5), corner6,"=", sum(corner6), corner7,"=", sum(corner7), corner8,"=", sum(corner8))
                                                      print ("side combinations:", side_combinations)
                                                      print (side1,"=", sum(side1), side2,"=", sum(side2), side3,"=", sum(side3), side4,"=", sum(side4), side5,"=", sum(side5), side6,"=", sum(side6))
Output:
corner combinations: 1 (1, 13, 23) = 37 (3, 15, 20) = 38 (4, 16, 17) = 37 (6, 14, 18) = 38 (19, 11, 7) = 37(21, 9, 8) = 38 (22, 10, 5) = 37 (24, 12, 2) = 38 side combinations: 1 (1, 6, 21, 22) = 50 (2, 10, 18, 20) = 50 (8, 12, 14, 16) = 50 (17, 13, 11, 9) = 50 (23, 5, 7, 5) = 50 (24, 19, 4, 3) ... corner combinations: 33 (1, 18, 19) = 38 (2, 15, 20) = 37 (3, 14, 21) = 38 (8, 13, 16) = 37 (17, 12, 9) = 38 (22, 11, 4) = 37 (23, 10, 5) = 38 (24, 7, 6) = 37 side combinations: 493 (1, 13, 15, 21) = 50 (2, 14, 16, 18) = 50 (3, 8, 19, 20) = 50 (22, 17, 6, 5) = 50 (23, 11, 9, 7) = 50 (24, 12, 10, 4) = 50

I can't see how to edit, there is a typo in my output (copied manually)

It should be:
Output:
Output: corner combinations: 1 (1, 13, 23) = 37 (3, 15, 20) = 38 (4, 16, 17) = 37 (6, 14, 18) = 38 (19, 11, 7) = 37(21, 9, 8) = 38 (22, 10, 5) = 37 (24, 12, 2) = 38 side combinations: 1 (1, 6, 21, 22) = 50 (2, 10, 18, 20) = 50 (8, 12, 14, 16) = 50 (17, 13, 11, 9) = 50 (23, 15, 7, 5) = 50 (24, 19, 4, 3) ... corner combinations: 33 (1, 18, 19) = 38 (2, 15, 20) = 37 (3, 14, 21) = 38 (8, 13, 16) = 37 (17, 12, 9) = 38 (22, 11, 4) = 37 (23, 10, 5) = 38 (24, 7, 6) = 37 side combinations: 493 (1, 13, 15, 21) = 50 (2, 14, 16, 18) = 50 (3, 8, 19, 20) = 50 (22, 17, 6, 5) = 50 (23, 11, 9, 7) = 50 (24, 12, 10, 4) = 50
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  problem in output of a snippet code akbarza 2 302 Feb-28-2024, 07:15 PM
Last Post: deanhystad
  I cannot able to see output of this code ted 1 716 Feb-22-2023, 09:43 PM
Last Post: deanhystad
  why I dont get any output from this code William369 2 1,084 Jun-23-2022, 09:18 PM
Last Post: William369
  How can I organize my code according to output that I want ilknurg 1 1,141 Mar-11-2022, 09:24 AM
Last Post: perfringo
  Why this code not getting desired output ? MDRI 2 2,486 Sep-18-2020, 02:11 AM
Last Post: MDRI
  Read excel file to determine the rules abc12345 4 2,617 May-13-2020, 12:59 PM
Last Post: abc12345
  I couldn't understand the output of the below code ravich129 1 1,893 Dec-12-2019, 06:24 AM
Last Post: sandeep_ganga
  Output of Python code hemal07yc 5 3,880 Sep-13-2019, 11:33 AM
Last Post: perfringo
  What will the following code output? dukoolsharma 5 3,188 Dec-15-2018, 06:05 AM
Last Post: HarshaliPatel
  No output for the code to read emails avani9659 6 4,151 Aug-14-2018, 08:30 AM
Last Post: avani9659

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020