Program to find state of prison cells after k days in python

We need to simulate the state of prison cells after k days. Each cell becomes occupied (1) if both adjacent cells have the same state, otherwise it becomes empty (0). The first and last cells are always empty since they don't have two neighbors.

Understanding the Problem

Given a binary list representing prison cells and a number k, we need to find the state after k days. The transformation rule is:

  • If a cell has two neighbors with the same state (both 0 or both 1), it becomes occupied (1)
  • Otherwise, it becomes empty (0)
  • First and last cells are always empty (0)

Example

For cells = [1, 0, 1, 0, 0, 0, 0, 0] and k = 1 ?

def next_day_state(cells):
    new_cells = cells.copy()
    new_cells[0] = 0  # First cell always empty
    new_cells[7] = 0  # Last cell always empty
    
    for j in range(1, 7):
        if cells[j - 1] == cells[j + 1]:
            new_cells[j] = 1
        else:
            new_cells[j] = 0
    return new_cells

# Example for one day
cells = [1, 0, 1, 0, 0, 0, 0, 0]
result = next_day_state(cells)
print("Initial:", cells)
print("After 1 day:", result)
Initial: [1, 0, 1, 0, 0, 0, 0, 0]
After 1 day: [0, 1, 1, 0, 1, 1, 1, 0]

Optimized Solution with Cycle Detection

Since there are only 2^6 = 64 possible states for the middle 6 cells, the pattern will eventually cycle. We can detect this cycle to handle large values of k efficiently ?

def solve_prison_cells(cells, k):
    def next_day_state(current_cells):
        new_cells = current_cells.copy()
        new_cells[0] = 0
        new_cells[7] = 0
        
        for j in range(1, 7):
            if current_cells[j - 1] == current_cells[j + 1]:
                new_cells[j] = 1
            else:
                new_cells[j] = 0
        return new_cells
    
    seen = {}
    day = 0
    
    while day < k:
        state_tuple = tuple(cells)
        if state_tuple in seen:
            # Cycle detected
            cycle_start = seen[state_tuple]
            cycle_length = day - cycle_start
            remaining_days = (k - day) % cycle_length
            
            for _ in range(remaining_days):
                cells = next_day_state(cells)
            return cells
        
        seen[state_tuple] = day
        cells = next_day_state(cells)
        day += 1
    
    return cells

# Test the solution
cells = [1, 0, 1, 0, 0, 0, 0, 0]
k = 1
result = solve_prison_cells(cells, k)
print("Result after", k, "days:", result)

# Test with larger k
cells = [1, 0, 1, 0, 0, 0, 0, 0]
k = 15
result = solve_prison_cells(cells, k)
print("Result after", k, "days:", result)
Result after 1 days: [0, 1, 1, 0, 1, 1, 1, 0]
Result after 15 days: [0, 0, 1, 1, 0, 0, 0, 0]

How the Algorithm Works

The solution uses cycle detection to optimize for large values of k:

  1. State Tracking: Store each day's state in a dictionary with the day number
  2. Cycle Detection: When we see a repeated state, we've found a cycle
  3. Optimization: Use modulo arithmetic to skip unnecessary iterations
  4. Final Steps: Simulate only the remaining days after cycle optimization

Step-by-Step Transformation

Let's trace through the first few days to understand the pattern ?

def demonstrate_transformation(initial_cells, days):
    cells = initial_cells.copy()
    print(f"Day 0: {cells}")
    
    for day in range(1, days + 1):
        new_cells = [0] * 8
        for j in range(1, 7):
            if cells[j - 1] == cells[j + 1]:
                new_cells[j] = 1
            else:
                new_cells[j] = 0
        cells = new_cells
        print(f"Day {day}: {cells}")

# Demonstrate first 5 days
demonstrate_transformation([1, 0, 1, 0, 0, 0, 0, 0], 5)
Day 0: [1, 0, 1, 0, 0, 0, 0, 0]
Day 1: [0, 1, 1, 0, 1, 1, 1, 0]
Day 2: [0, 0, 1, 0, 0, 0, 1, 0]
Day 3: [0, 1, 1, 0, 1, 1, 1, 0]
Day 4: [0, 0, 1, 0, 0, 0, 1, 0]
Day 5: [0, 1, 1, 0, 1, 1, 1, 0]

Key Points

  • First and last cells are always 0 since they lack two neighbors
  • The pattern cycles every few days due to limited possible states
  • Cycle detection allows handling large k values efficiently
  • Time complexity is O(min(k, 2^6)) = O(min(k, 64))

Conclusion

This problem demonstrates cellular automaton simulation with cycle detection optimization. The key insight is recognizing that with only 64 possible states, patterns must repeat, allowing us to skip redundant calculations for large k values.

Updated on: 2026-03-25T12:46:59+05:30

426 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements