nmax_cli 0.0.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 +7 -0
- data/.gitignore +2 -0
- data/README.md +14 -0
- data/Rakefile +8 -0
- data/bin/nmax +4 -0
- data/lib/nmax.rb +51 -0
- data/nmax.gemspec +15 -0
- data/test/test_nmax.rb +63 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7e6accd6271507af5f799533ff9534c8347aa63b5c152cb053bafa96ea2f3a5a
|
4
|
+
data.tar.gz: f4a36cdb53679dd8aa7abba00021d7638ed6482625994d4f52cd8a83b37d774c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7802233ca87d09266126a69043b6954e6d38037d64fac10f2838a4f10c0d617357fe020e7caf5251bae6b69f43a2d943fb28cbaa1d92f3b179b8674f74488770
|
7
|
+
data.tar.gz: 182b2bb39ebe771bee286905268f20a5f1b00e4b97d6c4a6d21d1c3dd4060eb93ebd4f368304485513164f80b6f9f60e825d24649648d48ad144e0ada13891fd
|
data/.gitignore
ADDED
data/README.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# nmax
|
2
|
+
Output N maximum numbers from input stream
|
3
|
+
|
4
|
+
скрипт nmax, делает следующее:
|
5
|
+
* читает из входящего потока текстовые данные
|
6
|
+
* по завершении ввода выводит n самых больших целых чисел, встретившихся в полученных текстовых данных
|
7
|
+
|
8
|
+
Дополнительные указания:
|
9
|
+
* числом считается любая непрерывная последовательность цифр в тексте
|
10
|
+
* известно, что чисел длиннее 1000 цифр во входных данных нет
|
11
|
+
* число n должно быть единственным параметром скрипта
|
12
|
+
* код должен быть покрыт тестами
|
13
|
+
* код должен быть оформлен в виде гема (содержащего исполняемый файл, код модулей и т.д.)
|
14
|
+
* плюсом является размещение на Github и интеграция с Travis CI
|
data/Rakefile
ADDED
data/bin/nmax
ADDED
data/lib/nmax.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module Nmax
|
2
|
+
class << self
|
3
|
+
def run
|
4
|
+
parameter_check
|
5
|
+
return if wrong_args?
|
6
|
+
@size = ARGV[0].to_i
|
7
|
+
@numbers = []
|
8
|
+
|
9
|
+
$stdin.each do |line|
|
10
|
+
add_nums_to_result nums(line)
|
11
|
+
end
|
12
|
+
puts '' if @numbers.empty?
|
13
|
+
puts @numbers
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def parameter_check
|
19
|
+
warn 'Nmax must receive one argument (number). Example: nmax 100' if wrong_args?
|
20
|
+
end
|
21
|
+
|
22
|
+
def wrong_args?
|
23
|
+
ARGV.size != 1 || first_arg_not_number?
|
24
|
+
end
|
25
|
+
|
26
|
+
def first_arg_not_number?
|
27
|
+
!ARGV[0].match?(/^\d+$/)
|
28
|
+
end
|
29
|
+
|
30
|
+
def nums(line)
|
31
|
+
line.scan(/\d+/).map(&:to_i)
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_nums_to_result(nums)
|
35
|
+
return if nums.empty?
|
36
|
+
|
37
|
+
nums.each { |n| add(n) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def add(num)
|
41
|
+
insert_at = @numbers.bsearch_index { |n| num >= n }
|
42
|
+
@numbers.insert(insert_at, num) if insert_at
|
43
|
+
@numbers << num unless insert_at
|
44
|
+
shorten
|
45
|
+
end
|
46
|
+
|
47
|
+
def shorten
|
48
|
+
@numbers.pop if @numbers.size > @size
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/nmax.gemspec
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'nmax_cli'
|
3
|
+
s.version = '0.0.0'
|
4
|
+
s.executables << 'nmax'
|
5
|
+
s.date = '2020-09-22'
|
6
|
+
s.summary = 'Nmax - Simple gem for search bigest integers from input stream'
|
7
|
+
s.description = 'Reads text data from the input stream; On completion of input,'\
|
8
|
+
' prints the N largest integers encountered in the received text data.'\
|
9
|
+
'Example: cat sample_data_40GB.txt | nmax 10000'
|
10
|
+
s.authors = ['Dmitrii Neverov']
|
11
|
+
s.email = 'dmi.neverov@gmail.com'
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.homepage = 'https://github.com/neverovda/nmax'
|
14
|
+
s.license = 'MIT'
|
15
|
+
end
|
data/test/test_nmax.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../lib/nmax.rb'
|
3
|
+
|
4
|
+
module TestNmaxHelper
|
5
|
+
def start(strings, argv)
|
6
|
+
io = StringIO.new
|
7
|
+
strings.each { |str| io.puts str}
|
8
|
+
io.rewind
|
9
|
+
$stdin = io
|
10
|
+
ARGV.replace argv
|
11
|
+
@out, @err = capture_io do
|
12
|
+
Nmax.run
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class TestNmax < Minitest::Test
|
18
|
+
include TestNmaxHelper
|
19
|
+
attr_reader :out, :err
|
20
|
+
def setup
|
21
|
+
@strings = ['Lorem ipsum dolor sit amet, consectetur adipiscing elit...']
|
22
|
+
@argv = ['1']
|
23
|
+
@error_out = "Nmax must receive one argument (number). Example: nmax 100\n"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_without_numbers
|
27
|
+
start(@strings, @argv)
|
28
|
+
assert_equal("\n", out)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_with_one_number
|
32
|
+
strings = ['one1one']
|
33
|
+
start(strings, @argv)
|
34
|
+
assert_equal("1\n", out)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_largest_numbers
|
38
|
+
strings = ['L 1 ipsum 4 consectetur..1000',
|
39
|
+
'Lorem 2 3000dolor am 3',
|
40
|
+
'tetur 5 2000 elit']
|
41
|
+
argv = ['3']
|
42
|
+
start(strings, argv)
|
43
|
+
assert_equal("3000\n2000\n1000\n", out)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_arguments_empty
|
47
|
+
argv = []
|
48
|
+
start(@strings, argv)
|
49
|
+
assert_equal(@error_out, err)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_argument_not_number
|
53
|
+
argv = ['arg1']
|
54
|
+
start(@strings, argv)
|
55
|
+
assert_equal(@error_out, err)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_many_arguments
|
59
|
+
argv = ['100', 'arg']
|
60
|
+
start(@strings, argv)
|
61
|
+
assert_equal(@error_out, err)
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nmax_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dmitrii Neverov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-09-22 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: 'Reads text data from the input stream; On completion of input, prints
|
14
|
+
the N largest integers encountered in the received text data.Example: cat sample_data_40GB.txt
|
15
|
+
| nmax 10000'
|
16
|
+
email: dmi.neverov@gmail.com
|
17
|
+
executables:
|
18
|
+
- nmax
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- ".gitignore"
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- bin/nmax
|
26
|
+
- lib/nmax.rb
|
27
|
+
- nmax.gemspec
|
28
|
+
- test/test_nmax.rb
|
29
|
+
homepage: https://github.com/neverovda/nmax
|
30
|
+
licenses:
|
31
|
+
- MIT
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubygems_version: 3.1.2
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: Nmax - Simple gem for search bigest integers from input stream
|
52
|
+
test_files: []
|