fork download
  1. require 'minitest/autorun'
  2.  
  3. class MovableChar
  4. def initialize value
  5. @value = value
  6. is_letter = @value =~ /[[:alpha:]]/
  7.  
  8. @move_steps = is_letter ? @value.upcase.ord - 64 : 0
  9. end
  10.  
  11. attr_accessor :move_steps, :value
  12.  
  13. def mark_moved
  14. @move_steps = 0
  15. end
  16. end
  17.  
  18. def move(input)
  19. chars = input.chars.map { |c| MovableChar.new(c) }
  20.  
  21. while index_to_move = chars.find_index { |c| c.move_steps > 0 }
  22. char_to_move = chars.delete_at index_to_move
  23. new_index = (index_to_move + char_to_move.move_steps) % (chars.size + 1)
  24. char_to_move.mark_moved
  25. chars.insert(new_index, char_to_move)
  26. end
  27.  
  28. chars.map(&:value).join
  29. end
  30.  
  31. describe MovableChar do
  32. it 'computes moving steps for letters case insensitive' do
  33. assert_equal 1, MovableChar.new('a').move_steps
  34. assert_equal 1, MovableChar.new('A').move_steps
  35. assert_equal 4, MovableChar.new('d').move_steps
  36. assert_equal 4, MovableChar.new('D').move_steps
  37. end
  38.  
  39. it 'moving steps is zero for non-letters' do
  40. assert_equal 0, MovableChar.new('*').move_steps
  41. assert_equal 0, MovableChar.new('.').move_steps
  42. assert_equal 0, MovableChar.new('-').move_steps
  43. assert_equal 0, MovableChar.new('~').move_steps
  44. end
  45.  
  46. it 'is not allowed to move more than once' do
  47. c = MovableChar.new('a')
  48. c.mark_moved
  49. assert_equal 0, c.move_steps
  50. end
  51. end
  52.  
  53. describe :MovingLetters do
  54. def test_case_1
  55. assert_equal 'tca', move('cat')
  56. end
  57.  
  58. def test_case_2
  59. assert_equal '.F.NU', move('F.U.N')
  60. end
  61.  
  62. def test_case_3
  63. assert_equal 'goD', move('Dog')
  64. end
  65.  
  66. def test_case_4
  67. assert_equal '*hibey', move('hi*bye')
  68. end
  69. end
  70.  
Success #stdin #stdout 0.08s 10688KB
stdin
Standard input is empty
stdout
Run options: --seed 45570

# Running tests:

.......

Finished tests in 0.001743s, 4016.6311 tests/s, 7459.4578 assertions/s.

7 tests, 13 assertions, 0 failures, 0 errors, 0 skips