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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/project_euler_cli/archive_controller.rb +7 -19
- data/lib/project_euler_cli/archive_searcher.rb +12 -12
- data/lib/project_euler_cli/archive_viewer.rb +23 -29
- data/lib/project_euler_cli/cli.rb +3 -3
- data/lib/project_euler_cli/page.rb +26 -0
- data/lib/project_euler_cli/problem.rb +18 -0
- data/lib/project_euler_cli/version.rb +1 -1
- data/lib/project_euler_cli.rb +2 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97ef0fde2d2609a709c9e0c379142c31aee9435bb89ac68a630cc36d22a97e0c
|
4
|
+
data.tar.gz: 181d0ec818f088d4b42911b8431a2bdb6caa941b5f5932a5f5d744c8fb8ec153
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 389f0c3c2234c1d506b507e9ec4625c1f72c743d94df9f992529ed9a8acf0209dcb2586541dbfa2232ba7c039fcd127b2343bcc1baf3c413130c80f105230f82
|
7
|
+
data.tar.gz: 49e66c02ae2811d72c5e51ce6a514a0aeecf74f4dae9f0b219f99b225387461dcd11fd3bb465e0a484ea1e3d83efffd40803c02aaa7d4c6b57bbaac85b692df8
|
data/Gemfile.lock
CHANGED
@@ -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
|
-
@
|
13
|
-
@as = ArchiveSearcher.new(@archive_data)
|
10
|
+
@problems = Array.new(Problem.total + 1) { Problem.new }
|
14
11
|
|
15
|
-
@
|
16
|
-
@
|
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?(
|
22
|
+
if id.between?(Problem.total - 9, Problem.total)
|
27
23
|
0
|
28
|
-
elsif id.between?(1,
|
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
|
-
|
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
|
-
|
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(
|
11
|
-
@
|
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(
|
24
|
-
unless
|
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
|
-
@
|
32
|
+
@problems[i].title = link.text
|
33
33
|
i += 1
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
Page.visited << page
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
# Loading the recent problems
|
41
|
-
unless
|
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 =
|
47
|
+
i = Problem.total
|
48
48
|
problem_links.each do |link|
|
49
|
-
@
|
49
|
+
@problems[i].title = link.text
|
50
50
|
i -= 1
|
51
51
|
end
|
52
52
|
|
53
|
-
|
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
|
73
|
-
if @
|
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(
|
7
|
-
@
|
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 =
|
17
|
+
i = Problem.total
|
18
18
|
problem_links.each do |link|
|
19
|
-
@
|
19
|
+
@problems[i].title = link.text
|
20
20
|
i -= 1
|
21
21
|
end
|
22
22
|
|
23
|
-
|
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
|
28
|
+
load_recent unless Page.visited.include?(0)
|
29
29
|
|
30
30
|
puts
|
31
31
|
|
32
|
-
(
|
33
|
-
puts "#{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
|
-
@
|
46
|
+
@problems[i].title = link.text
|
47
47
|
i += 1
|
48
48
|
end
|
49
49
|
|
50
|
-
|
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
|
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 >=
|
62
|
-
puts "#{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
|
-
@
|
76
|
-
@
|
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 <
|
80
|
-
@
|
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 @
|
88
|
+
load_problem_details(id) if @problems[id].published.nil?
|
89
89
|
|
90
90
|
puts
|
91
|
-
puts "#{@
|
91
|
+
puts "#{@problems[id].title}".upcase
|
92
92
|
puts "Problem #{id}"
|
93
93
|
puts
|
94
|
-
puts @
|
95
|
-
puts @
|
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
|
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?(
|
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,
|
71
|
+
page = [1, page, Page.total].sort[1] #clamp
|
72
72
|
@ac.display_page(page)
|
73
73
|
|
74
74
|
puts
|
75
|
-
puts "[#{page}/#{
|
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
|
data/lib/project_euler_cli.rb
CHANGED
@@ -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
|
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
|