# C/C++ 로 배우는 자료구조론 연습문제 7.33

class CircularQueue

  def initialize(size)
    @memory = []
    @front = 0
    @rear = 0

    @queue_size = size
  end

  def is_empty
    return @front == @rear
  end

  def is_full
    return ((@rear + 1) % @queue_size) == @front
  end

  def enqueue(data)
    return nil if is_full

    @rear = (@rear + 1) % @queue_size
    @memory[@rear] = data
  end

  def dequeue
    return nil if is_empty
    
    @front = (@front + 1) % @queue_size
    return @memory[@front]
  end

  def size
    if @rear > @front
      return @rear - @front
    elsif @rear == @front
      return 0
    else
      return @rear + @queue_size - @front
    end
  end
end

def print_josephus_problem_survive_index(person_count, execute_interval)
  queue = CircularQueue.new(person_count + 1)

  (1..person_count).each { |i| queue.enqueue i }

  while queue.size >= execute_interval 
    (execute_interval - 1).times do 
	  person = queue.dequeue
	  queue.enqueue person
	end
	
	puts "Executed : " + queue.dequeue.to_s
	
  end

  until queue.is_empty
    puts "Survived : " + queue.dequeue.to_s
  end
end

print_josephus_problem_survive_index(41, 3)


