Sha256: c4d095d254564191f41a3f0b8c9eb1ce5b9a8807f85daeb28c0c170b335fd306

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

module ProjectEulerCli

# Controller class that manages the archive system. It holds the archive data used
# by ArchiveViewer and ArchiveSearcher.
class ArchiveController

  def initialize
    lookup_totals

    @problems = Array.new(Problem.total + 1) { Problem.new }

    @av = ArchiveViewer.new(@problems)
    @as = ArchiveSearcher.new(@problems)
  end

  # call-seq:
  #   get_page(id) => page
  #
  # Returns page number based on the ID of the problem. The recent page is
  # considered page 0, invalid pages return -1.
  def get_page(id)
    if id.between?(Problem.total - 9, Problem.total)
      0
    elsif id.between?(1, Problem.total - 10)
      (id - 1) / 50 + 1
    else
      -1
    end
  end

  # Pulls information from the recent page to determine the total number of problems
  # and pages.
  def lookup_totals
    html = open("https://projecteuler.net/recent")
    fragment = Nokogiri::HTML(html)

    id_col = fragment.css('#problems_table td.id_column')

    # The newest problem is the first one listed on the recent page. The ID of this
    # problem will always equal the total number of problems.
    Problem.total = id_col.first.text.to_i
    # The last problem on the recent page has an ID that is one larger than the
    # last problem in the archive pages. The total number of pages can be calculated
    # from its ID.
    Page.total = get_page(id_col.last.text.to_i - 1)
  end

  def searching=(searching)
    @as.searching = searching
  end

  def searching
    @as.searching
  end

  def search(terms)
    @as.search(terms)
  end

  def results_include?(id)
    @as.results.include?(id)
  end

  def display_recent
    @av.display_recent
  end

  def display_page(page)
    @av.display_page(page)
  end

  def display_results
    @av.display_custom_page(@as.results)
  end

  def display_problem(id)
    @av.display_problem(id)
  end

end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
project_euler_cli-1.1.0 lib/project_euler_cli/archive_controller.rb