On Fri, 10 Oct 2008 10:13:59 -0500, Matthew Moss wrote:

> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
> 
> The three rules of Ruby Quiz 2:
> 
> 1.  Please do not post any solutions or spoiler discussion for this quiz
> until 48 hours have passed from the time on this message.
> 
> 2.  Support Ruby Quiz 2 by submitting ideas as often as you can! (A
> permanent, new website is in the works for Ruby Quiz 2. Until then,
> please visit the temporary website at
> 
>      <http://splatbang.com/rubyquiz/>.
> 
> 3.  Enjoy!
> 
> Suggestion:  A [QUIZ] in the subject of emails about the problem helps
> everyone on Ruby Talk follow the discussion.  Please reply to the
> original quiz message, if you can.
> 
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
> 
> ## Modular Arithmetic (#179)
> 
> _Quiz idea provided by Jakub Kuma_
> 
> [Modular][1] [arithmetic][2] is integer-based arithmetic in which the
> operands and results are constrained to a limited range, from zero to
> one less than the modulus. Take, for example, the 24-hour clock. Hours
> on the clock start at 0 and increase up to (and include) 23. But above
> that, we must use the appropriate congruent value modulo 24. For
> example, if I wanted to know what time it would be seven hours after
> 10pm, I would add 22 and 7 to get 29. As that is outside the range `[0,
> 24)`, I take the congruent value mod 24, which is 5.  So seven hours
> after 10pm is 5am.
> 
> Your task this week is to write a class `Modulo` that behaves in almost
> all ways like an `Integer`. It should support all basic operations:
> addition, subtraction, multiplication, exponentiation, conversion to
> string, etc. The significant difference, of course, is that an instance
> of `Modulo` should act modularly.
> 
> For example:
> 
>     # The default modulus is 26.
>     > a = Modulo.new(15)
>     > b = Modulo.new(19)
>     > puts (a + b)
>     8
>     > puts (a - b)
>     22
>     > puts (b * 3)
>     5

Just a preview of my solution (inspired by TZFile):

	Mod26=ModularBase.new(26)
        Mod8=ModularBase.new(8)

       def test_incompat_bases
         assert_raises(ArgumentError) do
           Mod26.new(1)+Mod8.new(1)
         end
         assert_nothing_raised do
           Mod26.new(1)+Mod8.new(1).to_i
         end
       end

That said, please clarify on the behavior of a couple tests:

       #new
       def test_add_reverse
          a = Mod26.new(15)
          assert_equal(???, 15 + a)
       end

       #new
       def test_sub_reverse
          a = Mod26.new(15)
          assert_equal(???, 1-a)
       end

       #already defined
       def test_mul_int_reverse
          a = Mod8.new(15)
          assert_equal(77, 11 * a)
       end

Clearly a Modulo +/*/- an Integer should give a Modulo
Should the reverse relation promote the Modulo to an Integer, or promote 
the Integer to a Modulo (of the same base)?

--Ken

-- 
Chanoch (Ken) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu/~kbloom1/