Guest User

Self-reducing bags

a guest
Apr 23rd, 2025
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.99 KB | None | 0 0
  1. links = {}      # source -> target mapping
  2. frontier = [(0, 0)]
  3. digit_counts = lambda num: (num.bit_length() - num.bit_count(), num.bit_count())
  4. while len(frontier) > 0:
  5.     new_zeros, new_ones = old_zeros, old_ones = frontier.pop()
  6.     while True:
  7.         while True:
  8.             (z1, o1), (z2, o2) = digit_counts(new_zeros), digit_counts(new_ones)
  9.             used_zeros, used_ones = z1+z2+(new_zeros>0), o1+o2+(new_ones>0)
  10.             unused_digits = new_zeros + new_ones - used_zeros - old_zeros - used_ones - old_ones
  11.             if unused_digits > 0:
  12.                 break
  13.             if (old_zeros+used_zeros, old_ones+used_ones) == (new_zeros, new_ones) and used_zeros+used_ones > 0:
  14.                 links[(new_zeros, new_ones)] = (old_zeros, old_ones)
  15.                 frontier.append((new_zeros, new_ones))
  16.             new_ones += 1
  17.         if new_ones == old_ones:
  18.             break
  19.         new_zeros, new_ones = new_zeros+1, old_ones
  20. print(f"Found {len(links)} self-reducing bags")
Advertisement
Add Comment
Please, Sign In to add comment