Skip to content

Commit bdf0cfb

Browse files
authored
Add templates for exercises batch 6 (#1786)
1 parent 4656993 commit bdf0cfb

13 files changed

Lines changed: 391 additions & 115 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
require 'minitest/autorun'
2+
require_relative 'largest_series_product'
3+
4+
class LargestSeriesProductTest < Minitest::Test
5+
<% json["cases"].each do |cases| %>
6+
def test_<%= underscore(cases["description"]) %>
7+
<%= skip? %>
8+
<%- if cases["expected"].is_a?(Hash) && cases["expected"].key?("error") -%>
9+
assert_raises(ArgumentError) do
10+
Series.new('<%= cases["input"]["digits"] %>').largest_product(<%= cases["input"]["span"] %>)
11+
end
12+
<%- else -%>
13+
assert_equal <%= cases["expected"] %>, Series.new('<%= cases["input"]["digits"] %>').largest_product(<%= cases["input"]["span"] %>)
14+
<%- end -%>
15+
end
16+
<% end %>
17+
end

exercises/practice/largest-series-product/.meta/tests.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ description = "reports zero if all spans include zero"
3838

3939
[5d81aaf7-4f67-4125-bf33-11493cc7eab7]
4040
description = "rejects span longer than string length"
41+
include = false
42+
43+
[0ae1ce53-d9ba-41bb-827f-2fceb64f058b]
44+
description = "rejects span longer than string length"
45+
reimplements = "5d81aaf7-4f67-4125-bf33-11493cc7eab7"
4146

4247
[06bc8b90-0c51-4c54-ac22-3ec3893a079e]
4348
description = "reports 1 for empty string and empty product (0 span)"
@@ -49,6 +54,11 @@ include = false
4954

5055
[6d96c691-4374-4404-80ee-2ea8f3613dd4]
5156
description = "rejects empty string and nonzero span"
57+
include = false
58+
59+
[6cf66098-a6af-4223-aab1-26aeeefc7402]
60+
description = "rejects empty string and nonzero span"
61+
reimplements = "6d96c691-4374-4404-80ee-2ea8f3613dd4"
5262

5363
[7a38f2d6-3c35-45f6-8d6f-12e6e32d4d74]
5464
description = "rejects invalid character in digits"

exercises/practice/largest-series-product/largest_series_product_test.rb

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,74 +4,74 @@
44
class LargestSeriesProductTest < Minitest::Test
55
def test_finds_the_largest_product_if_span_equals_length
66
# skip
7-
assert_equal 18, Series.new("29").largest_product(2)
7+
assert_equal 18, Series.new('29').largest_product(2)
88
end
99

1010
def test_can_find_the_largest_product_of_2_with_numbers_in_order
1111
skip
12-
assert_equal 72, Series.new("0123456789").largest_product(2)
12+
assert_equal 72, Series.new('0123456789').largest_product(2)
1313
end
1414

1515
def test_can_find_the_largest_product_of_2
1616
skip
17-
assert_equal 48, Series.new("576802143").largest_product(2)
17+
assert_equal 48, Series.new('576802143').largest_product(2)
1818
end
1919

2020
def test_can_find_the_largest_product_of_3_with_numbers_in_order
2121
skip
22-
assert_equal 504, Series.new("0123456789").largest_product(3)
22+
assert_equal 504, Series.new('0123456789').largest_product(3)
2323
end
2424

2525
def test_can_find_the_largest_product_of_3
2626
skip
27-
assert_equal 270, Series.new("1027839564").largest_product(3)
27+
assert_equal 270, Series.new('1027839564').largest_product(3)
2828
end
2929

3030
def test_can_find_the_largest_product_of_5_with_numbers_in_order
3131
skip
32-
assert_equal 15_120, Series.new("0123456789").largest_product(5)
32+
assert_equal 15_120, Series.new('0123456789').largest_product(5)
3333
end
3434

3535
def test_can_get_the_largest_product_of_a_big_number
3636
skip
37-
assert_equal 23_520, Series.new("73167176531330624919225119674426574742355349194934").largest_product(6)
37+
assert_equal 23_520, Series.new('73167176531330624919225119674426574742355349194934').largest_product(6)
3838
end
3939

4040
def test_reports_zero_if_the_only_digits_are_zero
4141
skip
42-
assert_equal 0, Series.new("0000").largest_product(2)
42+
assert_equal 0, Series.new('0000').largest_product(2)
4343
end
4444

4545
def test_reports_zero_if_all_spans_include_zero
4646
skip
47-
assert_equal 0, Series.new("99099").largest_product(3)
47+
assert_equal 0, Series.new('99099').largest_product(3)
4848
end
4949

5050
def test_rejects_span_longer_than_string_length
5151
skip
5252
assert_raises(ArgumentError) do
53-
Series.new("123").largest_product(4)
53+
Series.new('123').largest_product(4)
5454
end
5555
end
5656

5757
def test_rejects_empty_string_and_nonzero_span
5858
skip
5959
assert_raises(ArgumentError) do
60-
Series.new("").largest_product(1)
60+
Series.new('').largest_product(1)
6161
end
6262
end
6363

6464
def test_rejects_invalid_character_in_digits
6565
skip
6666
assert_raises(ArgumentError) do
67-
Series.new("1234a5").largest_product(2)
67+
Series.new('1234a5').largest_product(2)
6868
end
6969
end
7070

7171
def test_rejects_negative_span
7272
skip
7373
assert_raises(ArgumentError) do
74-
Series.new("12345").largest_product(-1)
74+
Series.new('12345').largest_product(-1)
7575
end
7676
end
7777
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require 'minitest/autorun'
2+
require_relative 'leap'
3+
4+
class Date
5+
def leap?
6+
raise "Write this functionality yourself instead of using Ruby's `leap?` method."
7+
end
8+
9+
alias gregorian_leap? leap?
10+
alias julian_leap? leap?
11+
end
12+
13+
class YearTest < Minitest::Test
14+
<% json["cases"].each do |cases| %>
15+
def test_<%= underscore(cases["description"]) %>
16+
<%= skip? %>
17+
<%= cases["expected"] ? "assert" : "refute" %> Year.leap?(<%= cases["input"]["year"] %>), "Expected '<%= cases["expected"] %>', <%= cases["input"]["year"] %> is<%= cases["expected"] ? "" : " not" %> a leap year"
18+
end
19+
<% end %>
20+
end

exercises/practice/leap/leap_test.rb

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,56 @@
33

44
class Date
55
def leap?
6-
raise "Implement this yourself instead of using Ruby's implementation."
6+
raise "Write this functionality yourself instead of using Ruby's `leap?` method."
77
end
88

99
alias gregorian_leap? leap?
1010
alias julian_leap? leap?
1111
end
1212

1313
class YearTest < Minitest::Test
14-
def test_year_not_divisible_by_4_common_year
14+
def test_year_not_divisible_by_4_in_common_year
1515
# skip
16-
refute Year.leap?(2015), "Expected 'false', 2015 is not a leap year."
16+
refute Year.leap?(2015), "Expected 'false', 2015 is not a leap year"
1717
end
1818

19-
def test_year_divisible_by_4_not_divisible_by_100_leap_year
19+
def test_year_divisible_by_2_not_divisible_by_4_in_common_year
2020
skip
21-
assert Year.leap?(1996), "Expected 'true', 1996 is a leap year."
21+
refute Year.leap?(1970), "Expected 'false', 1970 is not a leap year"
2222
end
2323

24-
def test_year_divisible_by_100_not_divisible_by_400_common_year
24+
def test_year_divisible_by_4_not_divisible_by_100_in_leap_year
2525
skip
26-
refute Year.leap?(2100), "Expected 'false', 2100 is not a leap year."
26+
assert Year.leap?(1996), "Expected 'true', 1996 is a leap year"
2727
end
2828

29-
def test_year_divisible_by_400_leap_year
29+
def test_year_divisible_by_4_and_5_is_still_a_leap_year
3030
skip
31-
assert Year.leap?(2000), "Expected 'true', 2000 is a leap year."
31+
assert Year.leap?(1960), "Expected 'true', 1960 is a leap year"
3232
end
3333

34-
def test_year_divisible_by_200_not_divisible_by_400_common_year
34+
def test_year_divisible_by_100_not_divisible_by_400_in_common_year
3535
skip
36-
refute Year.leap?(1800), "Expected 'false', 1800 is not a leap year."
36+
refute Year.leap?(2100), "Expected 'false', 2100 is not a leap year"
37+
end
38+
39+
def test_year_divisible_by_100_but_not_by_3_is_still_not_a_leap_year
40+
skip
41+
refute Year.leap?(1900), "Expected 'false', 1900 is not a leap year"
42+
end
43+
44+
def test_year_divisible_by_400_is_leap_year
45+
skip
46+
assert Year.leap?(2000), "Expected 'true', 2000 is a leap year"
47+
end
48+
49+
def test_year_divisible_by_400_but_not_by_125_is_still_a_leap_year
50+
skip
51+
assert Year.leap?(2400), "Expected 'true', 2400 is a leap year"
52+
end
53+
54+
def test_year_divisible_by_200_not_divisible_by_400_in_common_year
55+
skip
56+
refute Year.leap?(1800), "Expected 'false', 1800 is not a leap year"
3757
end
3858
end

exercises/practice/linked-list/.meta/example.rb

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
class Element
2-
attr_accessor :prev
3-
attr_accessor :next
2+
attr_accessor :prev, :next
43
attr_reader :datum
54

65
def initialize(datum, next_element = nil, prev = nil)
@@ -49,4 +48,37 @@ def shift
4948
end
5049
value
5150
end
51+
52+
def delete(value)
53+
return if @front.nil?
54+
55+
current = @front
56+
loop do
57+
if current.datum == value
58+
if current.equal?(@front) && current.next.equal?(@front)
59+
@front = nil
60+
else
61+
current.prev.next = current.next
62+
current.next.prev = current.prev
63+
@front = current.next if current.equal?(@front)
64+
end
65+
break
66+
end
67+
current = current.next
68+
break if current.equal?(@front)
69+
end
70+
end
71+
72+
def count
73+
return 0 if @front.nil?
74+
75+
count = 0
76+
current = @front
77+
loop do
78+
count += 1
79+
current = current.next
80+
break if current.equal?(@front)
81+
end
82+
count
83+
end
5284
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'minitest/autorun'
2+
require_relative 'linked_list'
3+
4+
class DequeTest < Minitest::Test
5+
<% json["cases"].each do |cases| %>
6+
def test_<%= underscore(cases["description"]) %>
7+
#<%= skip? %>
8+
deque = Deque.new
9+
<%- cases["input"]["operations"].each do |operation| -%>
10+
<%- if operation["expected"] -%>
11+
assert_equal <%= operation["expected"] %>, deque.<%= operation["operation"] %>(<%= operation["value"] %>)
12+
<%- else -%>
13+
deque.<%= operation["operation"] %>(<%= operation["value"] %>)
14+
<%- end -%>
15+
<%- end -%>
16+
end
17+
<% end %>
18+
end

0 commit comments

Comments
 (0)