project_euler_cli 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49c120e27b54ecb70be7838b2ff12a1908b0fe4324a34489502dab2a6c1c2477
4
- data.tar.gz: eef16492a89722e73afa03a5cc090c5792e0623d88a02e0ef6993601c2b472cd
3
+ metadata.gz: 97ef0fde2d2609a709c9e0c379142c31aee9435bb89ac68a630cc36d22a97e0c
4
+ data.tar.gz: 181d0ec818f088d4b42911b8431a2bdb6caa941b5f5932a5f5d744c8fb8ec153
5
5
  SHA512:
6
- metadata.gz: c01e65d898c336d7de472afc46ce60fe5f3dc20f9ac7233828c21ed30a4696eaf77231abf6e967330929eb65cd2107176ea41bbca12d766a0351c0c879228a01
7
- data.tar.gz: a81c4f77115407f9ceff0c3caaae1e7315deca93e6600b3aff3656b2b1f579cdcd99a43f782df63e6b9b20ca7e1afb167263b96ca94233a8be3dac0cec967fbb
6
+ metadata.gz: 389f0c3c2234c1d506b507e9ec4625c1f72c743d94df9f992529ed9a8acf0209dcb2586541dbfa2232ba7c039fcd127b2343bcc1baf3c413130c80f105230f82
7
+ data.tar.gz: 49e66c02ae2811d72c5e51ce6a514a0aeecf74f4dae9f0b219f99b225387461dcd11fd3bb465e0a484ea1e3d83efffd40803c02aaa7d4c6b57bbaac85b692df8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- project_euler_cli (1.0.1)
4
+ project_euler_cli (1.1.0)
5
5
  nokogiri (~> 1.8)
6
6
 
7
7
  GEM
@@ -5,16 +5,12 @@ module ProjectEulerCli
5
5
  class ArchiveController
6
6
 
7
7
  def initialize
8
- @archive_data = {}
9
-
10
8
  lookup_totals
11
9
 
12
- @av = ArchiveViewer.new(@archive_data)
13
- @as = ArchiveSearcher.new(@archive_data)
10
+ @problems = Array.new(Problem.total + 1) { Problem.new }
14
11
 
15
- @archive_data[:visited_pages] = []
16
- @archive_data[:problems] = Array.new(@archive_data[:num_problems] + 1, "")
17
- @archive_data[:problem_details] = Array.new(@archive_data[:num_problems] + 1) { {} }
12
+ @av = ArchiveViewer.new(@problems)
13
+ @as = ArchiveSearcher.new(@problems)
18
14
  end
19
15
 
20
16
  # call-seq:
@@ -23,9 +19,9 @@ class ArchiveController
23
19
  # Returns page number based on the ID of the problem. The recent page is
24
20
  # considered page 0, invalid pages return -1.
25
21
  def get_page(id)
26
- if id.between?(@archive_data[:num_problems] - 9, @archive_data[:num_problems])
22
+ if id.between?(Problem.total - 9, Problem.total)
27
23
  0
28
- elsif id.between?(1, @archive_data[:num_problems] - 10)
24
+ elsif id.between?(1, Problem.total - 10)
29
25
  (id - 1) / 50 + 1
30
26
  else
31
27
  -1
@@ -42,19 +38,11 @@ class ArchiveController
42
38
 
43
39
  # The newest problem is the first one listed on the recent page. The ID of this
44
40
  # problem will always equal the total number of problems.
45
- @archive_data[:num_problems] = id_col.first.text.to_i
41
+ Problem.total = id_col.first.text.to_i
46
42
  # The last problem on the recent page has an ID that is one larger than the
47
43
  # last problem in the archive pages. The total number of pages can be calculated
48
44
  # from its ID.
49
- @archive_data[:num_pages] = get_page(id_col.last.text.to_i - 1)
50
- end
51
-
52
- def num_pages
53
- @archive_data[:num_pages]
54
- end
55
-
56
- def num_problems
57
- @archive_data[:num_problems]
45
+ Page.total = get_page(id_col.last.text.to_i - 1)
58
46
  end
59
47
 
60
48
  def searching=(searching)
@@ -7,8 +7,8 @@ class ArchiveSearcher
7
7
  # Tracks whether there is an active search
8
8
  attr_accessor :searching
9
9
 
10
- def initialize(archive_data)
11
- @archive_data = archive_data
10
+ def initialize(problems)
11
+ @problems = problems
12
12
 
13
13
  @results = []
14
14
  @searching = false
@@ -20,8 +20,8 @@ class ArchiveSearcher
20
20
  puts "updating keywords..."
21
21
 
22
22
  # Loading each archive page
23
- 1.upto(@archive_data[:num_pages]) do |page|
24
- unless @archive_data[:visited_pages].include?(page)
23
+ 1.upto(Page.total) do |page|
24
+ unless Page.visited.include?(page)
25
25
  html = open("https://projecteuler.net/archives;page=#{page}")
26
26
  fragment = Nokogiri::HTML(html)
27
27
 
@@ -29,28 +29,28 @@ class ArchiveSearcher
29
29
 
30
30
  i = (page - 1) * 50 + 1
31
31
  problem_links.each do |link|
32
- @archive_data[:problems][i] = link.text
32
+ @problems[i].title = link.text
33
33
  i += 1
34
34
  end
35
35
 
36
- @archive_data[:visited_pages] << page
36
+ Page.visited << page
37
37
  end
38
38
  end
39
39
 
40
40
  # Loading the recent problems
41
- unless @archive_data[:visited_pages].include?(0)
41
+ unless Page.visited.include?(0)
42
42
  html = open("https://projecteuler.net/recent")
43
43
  fragment = Nokogiri::HTML(html)
44
44
 
45
45
  problem_links = fragment.css('#problems_table td a')
46
46
 
47
- i = @archive_data[:num_problems]
47
+ i = Problem.total
48
48
  problem_links.each do |link|
49
- @archive_data[:problems][i] = link.text
49
+ @problems[i].title = link.text
50
50
  i -= 1
51
51
  end
52
52
 
53
- @archive_data[:visited_pages] << 0
53
+ Page.visited << 0
54
54
  end
55
55
  end
56
56
 
@@ -69,8 +69,8 @@ class ArchiveSearcher
69
69
  @searching = true
70
70
 
71
71
  terms.downcase.split(' ').each do |term|
72
- for i in 1..@archive_data[:num_problems]
73
- if @archive_data[:problems][i].downcase.include?(term.downcase)
72
+ for i in 1..Problem.total
73
+ if @problems[i].title.downcase.include?(term.downcase)
74
74
  @results << i
75
75
  end
76
76
  end
@@ -3,8 +3,8 @@ module ProjectEulerCli
3
3
  # Handles the work of displaying information about the problems.
4
4
  class ArchiveViewer
5
5
 
6
- def initialize(archive_data)
7
- @archive_data = archive_data
6
+ def initialize(problems)
7
+ @problems = problems
8
8
  end
9
9
 
10
10
  # Loads in all of the problem numbers and titles from the recent page.
@@ -14,23 +14,23 @@ class ArchiveViewer
14
14
 
15
15
  problem_links = fragment.css('#problems_table td a')
16
16
 
17
- i = @archive_data[:num_problems]
17
+ i = Problem.total
18
18
  problem_links.each do |link|
19
- @archive_data[:problems][i] = link.text
19
+ @problems[i].title = link.text
20
20
  i -= 1
21
21
  end
22
22
 
23
- @archive_data[:visited_pages] << 0
23
+ Page.visited << 0
24
24
  end
25
25
 
26
26
  # Displays the 10 most recently added problems.
27
27
  def display_recent
28
- load_recent unless @archive_data[:visited_pages].include?(0)
28
+ load_recent unless Page.visited.include?(0)
29
29
 
30
30
  puts
31
31
 
32
- (@archive_data[:num_problems]).downto(@archive_data[:num_problems] - 9) do |i|
33
- puts "#{i} - #{@archive_data[:problems][i]}"
32
+ (Problem.total).downto(Problem.total - 9) do |i|
33
+ puts "#{i} - #{@problems[i].title}"
34
34
  end
35
35
  end
36
36
 
@@ -43,23 +43,23 @@ class ArchiveViewer
43
43
 
44
44
  i = (page - 1) * 50 + 1
45
45
  problem_links.each do |link|
46
- @archive_data[:problems][i] = link.text
46
+ @problems[i].title = link.text
47
47
  i += 1
48
48
  end
49
49
 
50
- @archive_data[:visited_pages] << page
50
+ Page.visited << page
51
51
  end
52
52
 
53
53
  # Displays the problem numbers and titles for an individual page of the archive.
54
54
  def display_page(page)
55
- load_page(page) unless @archive_data[:visited_pages].include?(page)
55
+ load_page(page) unless Page.visited.include?(page)
56
56
 
57
57
  puts
58
58
 
59
59
  start = (page - 1) * 50 + 1
60
60
  for i in start...start + 50
61
- unless i >= @archive_data[:num_problems] - 9
62
- puts "#{i} - #{@archive_data[:problems][i]}"
61
+ unless i >= Problem.total - 9
62
+ puts "#{i} - #{@problems[i].title}"
63
63
  end
64
64
  end
65
65
  end
@@ -72,12 +72,12 @@ class ArchiveViewer
72
72
  problem_info = fragment.css('div#problem_info span span')
73
73
 
74
74
  details = problem_info.text.split(';')
75
- @archive_data[:problem_details][id][:published] = details[0].strip
76
- @archive_data[:problem_details][id][:solved_by] = details[1].strip
75
+ @problems[id].published = details[0].strip
76
+ @problems[id].solved_by = details[1].strip
77
77
 
78
78
  # recent problems do not have a difficult rating
79
- if id < @archive_data[:num_problems] - 9
80
- @archive_data[:problem_details][id][:difficulty] = details[2].strip
79
+ if id < Problem.total - 9
80
+ @problems[id].difficulty = details[2].strip
81
81
  end
82
82
  end
83
83
 
@@ -85,19 +85,15 @@ class ArchiveViewer
85
85
  #
86
86
  # * +id+ - ID of the problem to be displayed
87
87
  def display_problem(id)
88
- load_problem_details(id) if @archive_data[:problem_details][id].empty?
88
+ load_problem_details(id) if @problems[id].published.nil?
89
89
 
90
90
  puts
91
- puts "#{@archive_data[:problems][id]}".upcase
91
+ puts "#{@problems[id].title}".upcase
92
92
  puts "Problem #{id}"
93
93
  puts
94
- puts @archive_data[:problem_details][id][:published]
95
- puts @archive_data[:problem_details][id][:solved_by]
96
-
97
- if id < @archive_data[:num_problems] - 9
98
- puts @archive_data[:problem_details][id][:difficulty]
99
- end
100
-
94
+ puts @problems[id].published
95
+ puts @problems[id].solved_by
96
+ puts @problems[id].difficulty if id < Problem.total - 9
101
97
  puts
102
98
  puts "https://projecteuler.net/problem=#{id}"
103
99
  end
@@ -108,9 +104,7 @@ class ArchiveViewer
108
104
  def display_custom_page(list)
109
105
  puts
110
106
 
111
- list.each do |id|
112
- puts "#{id} - #{@archive_data[:problems][id]}"
113
- end
107
+ list.each { |id| puts "#{id} - #{@problems[id].title}" }
114
108
  end
115
109
 
116
110
  end
@@ -58,7 +58,7 @@ class CLI
58
58
 
59
59
  input = prompt
60
60
 
61
- if input.to_i.between?(@ac.num_problems - 9, @ac.num_problems)
61
+ if input.to_i.between?(Problem.total - 9, Problem.total)
62
62
  problem_menu(input.to_i)
63
63
  elsif input == 'x'
64
64
  return
@@ -68,11 +68,11 @@ class CLI
68
68
  end
69
69
 
70
70
  def page_menu(page)
71
- page = [1, page, @ac.num_pages].sort[1] #clamp
71
+ page = [1, page, Page.total].sort[1] #clamp
72
72
  @ac.display_page(page)
73
73
 
74
74
  puts
75
- puts "[#{page}/#{@ac.num_pages}] (n)ext (p)rev (g)oto e(x)it"
75
+ puts "[#{page}/#{Page.total}] (n)ext (p)rev (g)oto e(x)it"
76
76
 
77
77
  input = prompt
78
78
 
@@ -0,0 +1,26 @@
1
+ module ProjectEulerCli
2
+
3
+ class Page
4
+
5
+ @@total = 0
6
+ @@visited = []
7
+
8
+ def self.total
9
+ @@total
10
+ end
11
+
12
+ def self.total=(total)
13
+ @@total = total
14
+ end
15
+
16
+ def self.visited
17
+ @@visited
18
+ end
19
+
20
+ def self.visited=(visited)
21
+ @@visited = visited
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,18 @@
1
+ module ProjectEulerCli
2
+
3
+ class Problem
4
+ attr_accessor :id, :title, :published, :solved_by, :difficulty
5
+
6
+ @@total = 0
7
+
8
+ def self.total
9
+ @@total
10
+ end
11
+
12
+ def self.total=(total)
13
+ @@total = total
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -1,3 +1,3 @@
1
1
  module ProjectEulerCli
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -4,6 +4,8 @@ require 'nokogiri'
4
4
  require 'pry'
5
5
 
6
6
  require "project_euler_cli/version"
7
+ require "project_euler_cli/problem"
8
+ require "project_euler_cli/page"
7
9
  require "project_euler_cli/archive_controller"
8
10
  require "project_euler_cli/archive_viewer"
9
11
  require "project_euler_cli/archive_searcher"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: project_euler_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ecssiah
@@ -106,6 +106,8 @@ files:
106
106
  - lib/project_euler_cli/archive_searcher.rb
107
107
  - lib/project_euler_cli/archive_viewer.rb
108
108
  - lib/project_euler_cli/cli.rb
109
+ - lib/project_euler_cli/page.rb
110
+ - lib/project_euler_cli/problem.rb
109
111
  - lib/project_euler_cli/version.rb
110
112
  - project_euler_cli.gemspec
111
113
  - spec.md